Samba文件共享服务

Samba服务程序的主配置文件与前面学习过的Apache服务很相似,包括全局配置参数和区域配置参数。全局配置参数用于设置整体的资源共享环境,对里面的每一个独立的共享资源都有效。区域配置参数则用于设置单独的共享资源,且仅对该资源有效。创建共享资源的方法很简单,只要将表12-2中的参数写入到Samba服务程序的主配置文件中,然后重启该服务即可。

表12-2    用于设置Samba服务程序的参数以及作用

参数 作用
[database] 共享名称为database
comment = Do not arbitrarily modify the database file 警告用户不要随意修改数据库
path = /home/database 共享目录为/home/database
public = no 关闭“所有人可见”
writable = yes 允许写入操作

 

第1步:创建用于访问共享资源的账户信息。在RHEL 8系统中,Samba服务程序默认使用的是用户口令认证模式(user)。这种认证模式可以确保仅让有密码且受信任的用户访问共享资源,而且验证过程也十分简单。不过,只有建立账户信息数据库之后,才能使用用户口令认证模式。另外,Samba服务程序的数据库要求账户必须在当前系统中已经存在,否则日后创建文件时将导致文件的权限属性混乱不堪,由此引发错误。

pdbedit命令用于管理samba服务程序的账户信息数据库,格式为“pdbedit [选项] 账户”。在第一次把账户信息写入到数据库时需要使用-a参数,以后在执行修改密码、删除账户等操作时就不再需要该参数了。pdbedit命令中使用的参数以及作用如表12-3所示。

表12-3                                       用于pdbedit命令的参数以及作用

参数 作用
-a 用户名 建立Samba用户
-x 用户名 删除Samba用户
-L 列出用户列表
-Lv 列出用户详细信息的列表

 

[root@linuxprobe ~]# id linuxprobe
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe)
[root@linuxprobe ~]# pdbedit -a -u linuxprobe
new password:此处输入该账户在Samba服务数据库中的密码
retype new password:再次输入密码进行确认
Unix username:        linuxprobe
NT username:          
Account Flags:        [U          ]
User SID:             S-1-5-21-650031181-3622628401-3290108334-1000
Primary Group SID:    S-1-5-21-650031181-3622628401-3290108334-513
Full Name:            linuxprobe
Home Directory:       \\linuxprobe\linuxprobe
HomeDir Drive:        
Logon Script:         
Profile Path:         \\linuxprobe\linuxprobe\profile
Domain:               LINUXPROBE
Account desc:         
Workstations:         
Munged dial:          
Logon time:           0
Logoff time:          Wed, 06 Feb 2036 23:06:39 CST
Kickoff time:         Wed, 06 Feb 2036 23:06:39 CST
Password last set:    Fri, 05 Mar 2021 18:52:35 CST
Password can change:  Fri, 05 Mar 2021 18:52:35 CST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

第2步:创建用于共享资源的文件目录。在创建时,不仅要考虑到文件读写权限的问题,而且由于/home目录是系统中普通用户的家目录,因此还需要考虑应用于该目录的SELinux安全上下文所带来的限制。在samba的帮助手册中告诉用户正确的文件上下文值应该是samba_share_t,所以只需要修改完毕后执行restorecon命令,就能让应用于目录的新SELinux安全上下文立即生效。

[root@linuxprobe ~]# mkdir /home/database
[root@linuxprobe ~]# chown -Rf linuxprobe:linuxprobe /home/database
[root@linuxprobe ~]# semanage fcontext -a -t samba_share_t /home/database
[root@linuxprobe ~]# restorecon -Rv /home/database
Relabeled /home/database from unconfined_u:object_r:user_home_dir_t:s0 to unconfined_u:object_r:samba_share_t:s0

第3步:设置SELinux服务与策略,使其允许通过Samba服务程序访问普通用户家目录。执行getsebool命令,筛选出所有与Samba服务程序相关的SELinux域策略,根据策略的名称(和经验)选择出正确的策略条目进行开启即可:

[root@linuxprobe ~]# getsebool -a | grep samba
samba_create_home_dirs --> off
samba_domain_controller --> off
samba_enable_home_dirs --> off
samba_export_all_ro --> off
samba_export_all_rw --> off
samba_load_libgfapi --> off
samba_portmapper --> off
samba_run_unconfined --> off
samba_share_fusefs --> off
samba_share_nfs --> off
sanlock_use_samba --> off
tmpreaper_use_samba --> off
use_samba_home_dirs --> off
virt_use_samba --> off
[root@linuxprobe ~]# setsebool -P samba_enable_home_dirs on

第4步:在Samba服务程序的主配置文件中,根据表12-2所提到的格式写入共享信息。

[root@linuxprobe ~]# vim /etc/samba/smb.conf 
[global]
        workgroup = SAMBA
        security = user
        passdb backend = tdbsam
[database]
        comment = Do not arbitrarily modify the database file
        path = /home/database
        public = no
        writable = yes

第5步:Samba服务程序的配置工作基本完毕。Samba服务程序在Linux系统中的名字为smb,所以重启并加入到启动项中,保证在重启服务器后依然能够为用户持续提供服务。

[root@linuxprobe ~]# systemctl restart smb 
[root@linuxprobe ~]# systemctl enable smb 
Created symlink /etc/systemd/system/multi-user.target.wants/smb.service → /usr/lib/systemd/system/smb.service.

避免防火墙会限制用户访问,因此决定将iptables防火墙清空,再把samba服务添加到firewalld防火墙中,确保万无一失。

[root@linuxprobe ~]# iptables -F
[root@linuxprobe ~]# iptables-save 
[root@linuxprobe ~]# firewall-cmd --zone=public --permanent --add-service=samba
success
[root@linuxprobe ~]# firewall-cmd --reload
success

第6步:在服务器本地检查samba服务是否启动可以用“systemctl status smb”进行查看,而如果想进一步看samba服务都共享出去了哪些共享目录,则可以用smbclient命令来查看共享详情,-U参数指定了用户名称,建议一会用哪位用户进行挂载,就用哪位用户身份进行查看;-L参数列举共享清单。

[root@linuxprobe ~]# smbclient -U linuxprobe -L 192.168.10.10
Enter SAMBA\linuxprobe's password: 此处输入该账户在Samba服务数据库中的密码

	Sharename       Type      Comment
	---------       ----      -------
	database        Disk      Do not arbitrarily modify the database file
	IPC$            IPC       IPC Service (Samba 4.9.1)
Reconnecting with SMB1 for workgroup listing.

	Server               Comment
	---------            -------

	Workgroup            Master
	---------            -------



NFS网络文件系统

如果读者们觉得Samba服务程序的配置太麻烦,而且恰巧需要共享文件的主机都是Linux系统,非常推荐大家在客户端部署NFS服务来共享文件。NFS网络文件系统服务可以将远程Linux系统上的文件共享资源挂载到本地主机的目录上,从而使得本地主机(Linux客户端)基于TCP/IP协议,像使用本地主机上的资源那样读写远程Linux系统上的共享文件。

 

由于RHEL 8系统中默认已经安装了NFS服务,外加NFS服务的配置步骤也很简单,因此刘遄老师在授课时会戏称为Need For Speed极品飞车。接下来,准备配置NFS服务。首先请使用软件仓库检查自己的RHEL 8系统中是否已经安装了NFS软件包:

[root@linuxprobe ~]# dnf install nfs-utils
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
Last metadata expiration check: 0:00:12 ago on Sat 06 Mar 2021 04:48:38 AM CST.
Package nfs-utils-1:2.3.3-14.el8.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!

第1步:为了检验NFS服务配置的效果,我们需要使用两台Linux主机(一台充当NFS服务器,一台充当NFS客户端),并按照表12-6来设置它们所使用的IP地址。

表12-6                             两台Linux主机所使用的操作系统以及IP地址

主机名称 操作系统 IP地址
NFS服务器 RHEL 8 192.168.10.10
NFS客户端 RHEL 8 192.168.10.20

 

另外,不要忘记配置好防火墙,以免默认的防火墙策略禁止正常的NFS共享服务。

[root@linuxprobe ~]# iptables -F
[root@linuxprobe ~]# iptables-save
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-service=nfs
success
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-service=rpc-bind
success
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-service=mountd
success
[root@linuxprobe ~]# firewall-cmd --reload
success

第2步:在NFS服务器上建立用于NFS文件共享的目录,并设置足够的权限确保其他人也有写入权限。

[root@linuxprobe ~]# mkdir /nfsfile
[root@linuxprobe ~]# chmod -R 777 /nfsfile
[root@linuxprobe ~]# echo "welcome to linuxprobe.com" > /nfsfile/readme

第3步:NFS服务程序的配置文件为/etc/exports,默认情况下里面没有任何内容。我们可以按照“共享目录的路径 允许访问的NFS客户端(共享权限参数)”的格式,定义要共享的目录与相应的权限。

例如,如果想要把/nfsfile目录共享给192.168.10.0/24网段内的所有主机,让这些主机都拥有读写权限,在将数据写入到NFS服务器的硬盘中后才会结束操作,最大限度保证数据不丢失,以及把来访客户端root管理员映射为本地的匿名用户等,则可以按照下面命令中的格式,将表12-7中的参数写到NFS服务程序的配置文件中。

表12-7                                  用于配置NFS服务程序配置文件的参数

参数 作用
ro 只读
rw 读写
root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户
no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员
all_squash 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户
sync 同时将数据写入到内存与硬盘中,保证不丢失数据
async 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据

 

请注意,NFS客户端地址与权限之间没有空格。

[root@linuxprobe ~]# vim /etc/exports
/nfsfile 192.168.10.*(rw,sync,root_squash)

在NFS服务的配置文件中巧用通配符能够实现很多便捷功能,就比如匹配IP地址就有三种方法——第一种是直接写*号,代表任何主机都可以访问;第二种则是实验中采用的192.168.10.*通配格式,代表来自192.168.10.0/24网段的主机;第三种则是直接写对方的IP地址,如192.168.10.20,代表仅允许某个主机进行访问。

第4步:启动和启用NFS服务程序。由于在使用NFS服务进行文件共享之前,需要使用RPC(Remote Procedure Call,远程过程调用)服务将NFS服务器的IP地址和端口号等信息发送给客户端。因此,在启动NFS服务之前,还需要顺带重启并启用rpcbind服务程序,并将这两个服务一并加入开机启动项中。

[root@linuxprobe ~]# systemctl restart rpcbind
[root@linuxprobe ~]# systemctl enable rpcbind
[root@linuxprobe ~]# systemctl start nfs-server
[root@linuxprobe ~]# systemctl enable nfs-server
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.

NFS客户端的配置步骤也十分简单。先使用showmount命令查询NFS服务器的远程共享信息,必要的参数见表12-8,其输出格式为“共享的目录名称 允许使用客户端地址”。

表12-8                                  showmount命令中可用的参数以及作用

参数 作用
-e 显示NFS服务器的共享列表
-a 显示本机挂载的文件资源的情况NFS资源的情况
-v 显示版本号

 

[root@linuxprobe ~]# showmount -e 192.168.10.10
Export list for 192.168.10.10:
/nfsfile 192.168.10.*

然后在NFS客户端创建一个挂载目录。使用mount命令并结合-t参数,指定要挂载的文件系统的类型,并在命令后面写上服务器的IP地址、服务器上的共享目录以及要挂载到本地系统(即客户端)的目录。

[root@linuxprobe ~]# mkdir /nfsfile
[root@linuxprobe ~]# mount -t nfs 192.168.10.10:/nfsfile /nfsfile
[root@linuxprobe ~]# df -h
Filesystem              Size  Used Avail Use% Mounted on
devtmpfs                969M     0  969M   0% /dev
tmpfs                   984M     0  984M   0% /dev/shm
tmpfs                   984M  9.6M  974M   1% /run
tmpfs                   984M     0  984M   0% /sys/fs/cgroup
/dev/mapper/rhel-root    17G  3.9G   14G  23% /
/dev/sr0                6.7G  6.7G     0 100% /media/cdrom
/dev/sda1              1014M  152M  863M  15% /boot
tmpfs                   197M   16K  197M   1% /run/user/42
tmpfs                   197M  3.4M  194M   2% /run/user/0
192.168.10.10:/nfsfile   17G  3.9G   14G  23% /nfsfile

挂载成功后就应该能够顺利地看到在执行前面的操作时写入的文件内容了。如果希望NFS文件共享服务能一直有效,则需要将其写入到fstab文件中:

[root@linuxprobe ~]# cat /nfsfile/readme
welcome to linuxprobe.com
[root@linuxprobe ~]# vim /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Thu Feb 25 10:42:11 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root                     /                       xfs     defaults        0 0
UUID=37d0bdc6-d70d-4cc0-b356-51195ad90369 /boot                   xfs     defaults        0 0
/dev/mapper/rhel-swap                     swap                    swap    defaults        0 0
/dev/cdrom                                /media/cdrom            iso9660 defaults        0 0 
192.168.10.10:/nfsfile                    /nfsfile                nfs     defaults        0 0