配置 Samba 文件共享服务
FTP 文件传输服务确实可以让主机之间的文件传输变得简单方便,但是FTP 协议的本质是传输文件,而非共享文件,因此要想通过客户端直接在服务器上修改文件内容还是一件比较麻烦的事情。
为了解决 Linux 系统与 Windows 系统之间的文件共享问题,基于 SMB 协议开发出了 SMBServer 服务程序。这是一款开源的文件共享软件,经过简单配置就能够实现 Linux 系统与 Windows 系统之间的文件共享工作。
Samba 服务程序现在已经成为在 Linux 系统与Windows 系统之间共享文件的最佳选择。Samba 服务程序的配置方法与之前的很多服务的配置方法类似,需要先通过软件仓库来安装 Samba 服务端、 samba-client客户端。
[root@RS ~]# dnf install samba samba-client //安装samba服务端 客户端
打开Samba服务程序的主配置文件,好在参数并不多,只有37行。
- 第17~22行代表共享每位登录用户的家目录内容。虽然在某些情况下这可以更方便地共享文件,但这个默认操作着实有些危险,建议不要共享,将其删除掉。
- 第24~29行是用SMB协议共享本地的打印机设备,方便局域网内的用户远程使用打印机设备。当前没有打印机设备,因此建议也将其删除掉,不共享。
- 第31~37行依然为共享打印机设备的参数,同样建议予以删除。
- 第 5~8 行参数中所提到的 cups的全称为 Common UNIX Printing System(通用 UNIX 打印系统),依然是用于打印机或打印服务器的,继续予以删除。
在对 Samba 服务的主配置文件进行一顿删减操作之后,最后的有效配置参数只剩下了 4 行。
[root@serverA ~]# cat /etc/samba/smb.conf
[global]
workgroup = SAMBA
security = user
passdb backend = tdbsam
删除掉不需要的代码是常规操作。通过关闭非必要的功能,可以让服务程序“轻装前进”,让服务程序把硬件资源都用到刀刃上,使其具有更好的性能。而且,还能让运维人员更快地找到所需的代码。与
为了避免在工作中使用到了打印机服务而不知如何配置,下面对上述代码进行详细的注释说明,可以留存备查。
Samba服务程序中的参数以及作用
行数 | 参数 | 作用 |
---|---|---|
1 | # See smb.conf.example for a more detailed config file or | 注释信息 |
2 | # read the smb.conf manpage. | |
3 | # Run 'testparm' to verify the config is correct after | |
4 | # you modified it. | |
5 | [global] | 全局参数 |
6 | workgroup = SAMBA | 工作组名称 |
7 | ||
8 | security = user | 安全验证的方式,总共有4种 |
9 | ||
10 | passdb backend = tdbsam | 定义用户后台的类型,总共有3种 |
11 | ||
12 | printing = cups | 打印服务协议 |
13 | printcap name = cups | 打印服务名称 |
14 | load printers = yes | 是否加载打印机 |
15 | cups options = raw | 打印机的选项 |
16 | ||
17 | [homes] | 共享名称 |
18 | comment = Home Directories | 描述信息 |
19 | valid users = %S, %D%w%S | 可用账户 |
20 | browseable = No | 指定共享信息是否在“网上邻居”中可见 |
21 | read only = No | 是否只读 |
22 | inherit acls = Yes | 是否继承访问控制列表 |
23 | ||
24 | [printers] | 共享名称 |
25 | comment = All Printers | 描述信息 |
26 | path = /var/tmp | 共享路径 |
27 | printable = Yes | 是否可打印 |
28 | create mask = 0600 | 文件权限 |
29 | browseable = No | 指定共享信息是否在“网上邻居”中可见 |
30 | ||
31 | [print$] | 共享名称 |
32 | comment = Printer Drivers | 描述信息 |
33 | path = /var/lib/samba/drivers | 共享路径 |
34 | write list = @printadmin root | 可写入文件的用户列表 |
35 | force group = @printadmin | 用户组列表 |
36 | create mask = 0664 | 文件权限 |
37 | directory mask = 0775 | 目录权限 |
在上面的代码中,security参数代表用户登录Samba服务时采用的验证方式。总共有4种可用参数。
- share:代表主机无须验证密码。这相当于vsftpd服务的匿名公开访问模式,比较方便,但安全性很差。
- user:代表登录Samba服务时需要使用账号密码进行验证,通过后才能获取到文件。这是默认的验证方式,最为常用。
- domain:代表通过域控制器进行身份验证,用来限制用户的来源域。
- server:代表使用独立主机验证来访用户提供的密码。这相当于集中管理账号,并不常用。
在5、6版本中替换成了用 smbpasswd 命令来设置独立的Samba服务账号和密码。到了RHEL 7/8版本,则又进行了一次改革,将传统的验证方式换成使用tdbsam数据库进行验证。这是一个专门用于保存Samba服务账号密码的数据库,用户需要用 pdbedit 命令进行独立的添加操作
配置共享资源
Samba服务程序的主配置文件与Apache服务很相似,包括全局配置参数和区域配置参数。全局配置参数用于设置整体的资源共享环境,对里面的每一个独立的共享资源都有效。区域配置参数则用于设置单独的共享资源,且仅对该资源有效。创建共享资源的方法很简单,只要将下表的参数写入到Samba服务程序的主配置文件中,然后重启该服务即可。
用于设置Samba服务程序的参数以及作用
参数 | 作用 |
---|---|
[database] | 共享名称为database |
comment = Do not arbitrarily modify the database file | 警告用户不要随意修改数据库 |
path = /home/database | 共享目录为/home/database |
public = no | 关闭“所有人可见” |
writable = yes | 允许写入操作 |
- 创建用于访问共享资源的账户信息。在 RHEL 8 系统中,Samba 服务程序默认使用的是用户密码认证模式(user)。这种认证模式可以确保仅让有密码且受信任的用户访问共享资源,而且认证过程也十分简单。
不过,只有建立账户信息数据库之后,才能使用用户密码认证模式。另外,Samba 服务程序的数据库要求账户必须在当前系统中已经存在,否则日后创建文件时将导致文件的权限属性混乱不堪,由此引发错误。
pdbedit 命令用于管理 Samba 服务程序的账户信息数据库,格式为 “ pdbedit [选项] 账户 ”。在第一次把账户信息写入到数据库时需要使用 -a 参数,以后在执行修改密码、删除账户等操作时就不再需要该参数了。pdbedit 命令中使用的参数以及作用如表所示。
| 参数 | 作用 |
| --------- | ---------------------- |
| -a 用户名 | 建立Samba用户 |
| -x 用户名 | 删除Samba用户 |
| -L | 列出用户列表 |
| -Lv | 列出用户详细信息的列表 |
[root@RS ~]# id zhangxu
uid=1000(zhangxu) gid=1000(zhangxu) groups=1000(zhangxu)
[root@RS ~]# pdbedit -a -u zhangxu //建立samba用户
new password: //【输入该账户在samba服务数据库中的密码】
retype new password: //【再次输入密码进行确认】
创建用于共享资源的文件目录。在创建时,不仅要考虑到文件读写权限的问题,而且由于/home目录是系统中普通用户的家目录,因此还需要考虑应用于该目录的SELinux安全上下文所带来的限制。在Samba的帮助手册中显示,正确的文件上下文值应该是samba_share_t,所以只需要修改完毕后执行restorecon命令,就能让应用于目录的新SELinux安全上下文立即生效。
[root@RS ~]# mkdir /home/database //创建用于共享资源的文件目录 [root@RS ~]# chown -Rf zhangxu:zhangxu /home/database //设置目录的文件属主及属组 [root@RS ~]# semanage fcontext -a -t samba_share_t /home/database //设置SELinux安全上下文 [root@RS ~]# restorecon -Rv /home/database/ //刷新SELinux安全上下文立即生效
设置 SELinux 服务与策略,使其允许通过 Samba 服务程序访问普通用户家目录。执行 getsebool 命令,筛选出所有与 Samba 服务程序相关的 SELinux 域策略,根据策略的名称(和经验)选择出正确的策略条目进行开启即可:
[root@serverA ~]# getsebool -a | grep samba //查看策略 ...... samba_enable_home_dirs --> off ...... [root@serverA ~]# setsebool -P samba_enable_home_dirs=on //开启策略
在 Samba 服务程序的主配置文件中,根据表所提到的格式写入共享信息。
[root@serverA ~]# 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
Samba 服务程序在 Linux 系统中的名字为smb,所以重启 smb 服务并加入到启动项中,保证在重启服务器后依然能够为用户持续提供服务。
[root@RS ~]# systemctl restart smb //重启samba服务 [root@RS ~]# systemctl enable smb //加入开机启动项 [root@RS ~]# iptables -F //清除防火墙策略 [root@RS ~]# iptables-save //保存策略 [root@RS ~]# firewall-cmd --permanent --zone=public --add-service=samba //防火墙放行 [root@RS ~]# firewall-cmd --reload //重新加载防火墙
可以使用 “
systemctl status smb
”命令查看服务器是否启动了Samba服务。如果想进一步查看Samba服务都共享了哪些目录,则可以使用smbclient
命令来查看共享详情;-U
参数指定了用户名称(用哪位用户挂载了Samba服务,就用哪位用户的身份进行查看);-L
参数列出了共享清单。[root@serverA ~]# smbclient -U zhangxu -L 192.168.8.10 //查看共享详情 -U指定用户 -L 指定地址 Enter SAMBA\zhangxu's password: //【此处输入该账户在Samba服务数据库中的密码】
Windows访问共享
无论 Samba 共享服务是部署 Windows 系统上还是部署在 Linux 系统上,通过 Windows 系统进行访问时,其步骤和方法都是一样的。下面假设 Samba 共享服务部署在 Linux 系统上,并通过 Windows 系统来访问 Samba 服务。
Samba服务器和Windows客户端使用的操作系统以及IP地址
主机名称 | 操作系统 | IP地址 |
---|---|---|
Samba共享服务器 | RHEL 8 | 192.168.10.10 |
Linux客户端 | RHEL 8 | 192.168.10.20 |
Windows客户端 | Windows 10 | 192.168.10.30 |
Windows 系统中访问共享资源,只需要单击 Windows 系统的“开始”按钮后输入两个反斜杠,然后再添加服务器的 IP 地址即可。输入账户密码,如图所示。
Linux访问共享
Samba 服务程序还可以实现 Linux 系统之间的文件共享,需要在客户端安装支持文件共享服务的软件包(cifs-utils)。
在客户端安装 cifs-utils
[root@Client ~]# yum install cifs-utils //安装支持文件共享服务的软件包(cifs-utils)
在 Linux 客户端创建一个用于挂载 Samba 服务共享资源的目录。这个目录可以与服务器上的共享名称同名,以便于日后查找。mount 命令中的
-t 参数用于指定协议类型
、-o 参数用于指定用户名和密码
最后追加上服务器 IP 地址、共享名称和本地挂载目录即可。服务器 IP 地址后面的共享名称指的是配置文件中[database]的值,而不是服务器本地挂载的目录名称。虽然这两个值可能一样,但必须认出它们的区别。[root@Client ~]# mkdir /database //客户端创建目录 ,下方进行挂载 [root@Client ~]# mount -t cifs -o username=zhangxu,password=zx123456789 //192.168.8.10/database /database [root@Client ~]# df -Th ......省略部分信息 //192.168.8.10/database cifs 17G 3.9G 14G 23% /database
可以按照 Samba 服务的用户名、密码、共享域的顺序将相关信息写入一个认证文件中,然后让/etc/fstab 文件和系统自动加载它。为了保证不被其他人随意看到,最后把这个认证文件的权限修改为仅 root 管理员才能够读写。
[root@Client ~]# vim auth.smb //编写samba服务的认证文件 username=zhangxu password=zx123456789 domain=SAMBA [root@Client ~]# chmod 600 auth.smb //编辑权限只有管理员才能读写
将挂载信息写入/etc/fstab 文件中,以确保共享挂载信息在服务器重启后依然生效。
[root@Client /]# vim /etc/fstab //挂载信息写入配置文件进行永久挂载 //追加以下内容 //192.168.8.10/database /database cifs credentials=/root/auth.smb 0 0
Linux 客户端成功地挂载了 Samba 服务的共享资源。进入到挂载目录/database 后就可以看到 Windows 系统访问 Samba 服务程序时留下来的文件了(即文件1.txt)。
NFS(网络文件系统)
NFS 服务仅能实现 Linux 系统之间的文件共享。如果觉得 Samba 服务程序的配置太麻烦,而且恰巧需要共享文件的主机都是 Linux系统,此时非常推荐在客户端部署 NFS(网络文件系统)服务来共享文件。NFS 服务可以将远程 Linux 系统上的文件共享资源挂载到本地主机的目录上,从而使得本地主机(Linux 客户端)基于 TCP/IP 协议,像使用本地主机上的资源那样读写远程 Linux 系统上的共享文件。RHEL 8 系统中默认已经安装了 NFS 服务,外加 NFS 服务的配置步骤也很简单。
服务端配置共享
准备配置 NFS 服务首先请使用软件仓库检查系统中是否已经安装了 NFS 软件包:
[root@RS ~]# dnf install nfs-utils //安装 NFS 软件包
为了检验 NFS 服务配置的效果,需要使用两台 Linux 主机(一台充当 NFS服务器,一台充当 NFS 客户端)
主机名称 | 操作系统 | IP地址 |
---|---|---|
NFS服务器 | RHEL 8 | 192.168.10.10 |
NFS客户端 | RHEL 8 | 192.168.10.20 |
第一步:配置防火墙,以免默认的防火墙策略禁止正常的 NFS 共享服务。
[root@RS ~]# iptables -F
[root@RS ~]# iptables-save
[root@RS ~]# firewall-cmd --permanent --zone=public --add-service=nfs
[root@RS ~]# firewall-cmd --permanent --zone=public --add-service=rpc-bind
[root@RS ~]# firewall-cmd --permanent --zone=public --add-service=mountd
[root@RS ~]# firewall-cmd --reload
第二步:在 NFS 服务器上建立用于 NFS 文件共享的目录,并设置足够的权限确保其他人也有写入权限。
[root@RS ~]# mkdir /nfsfile //服务端创建用于共享的目录
[root@RS ~]# chmod -R 777 /nfsfile //给予目录可读写执行的权限
[root@RS ~]# echo "Welcome To NSF Demo" >/nfsfile/readme
第三步:NFS 服务程序的配置文件为/etc/exports,默认情况下里面没有任何内容。可以按照“共享目录的路径 允许访问的 NFS 客户端(共享权限参数)”的格式,定义要共享的目录与相应的权限。
例如要把/nfsfile 目录共享给 192.168.8.0/24 网段内的所有主机,让这些主机都拥有读写权限,在将数据写入到 NFS 服务器的硬盘中后才会结束操作,最大限度保证数据不丢失,以及把来访客户端 root 管理员映射为本地的匿名用户等,则可以按照下面命令中的格式,将表中的参数写到 NFS 服务程序的配置文件中。
[root@RS ~]# vim /etc/exports //NFS 客户端地址与权限之间没有空格
/nfsfile 192.168.8.*(rw,sync,root_squash)
参数 | 作用 |
---|---|
ro | 只读 |
rw | 读写 |
root_squash | 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户 |
no_root_squash | 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员 |
all_squash | 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户 |
sync | 同时将数据写入到内存与硬盘中,保证不丢失数据 |
async | 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据 |
匹配 IP 地址就有 3种方法:
- 第一种是直接写*号,代表任何主机都可以访问;
- 第二种则是实验中采用的192.168.8.*通配格式,代表来自 192.168.8.0/24 网段的主机;
- 第三种则是直接写对方的 IP地址,如 192.168.8.20,代表仅允许某个主机进行访问。
第四步:启动和启用 NFS 服务程序。由于在使用 NFS 服务进行文件共享之前,需要使用 RPC(Remote Procedure Call,远程过程调用)服务将 NFS 服务器的 IP 地址和端口号等信息发送给客户端。因此,在启动 NFS 服务之前,还需要顺带重启并启用 rpcbind 服务程序,并将这两个服务一并加入开机启动项中
[root@RS ~]# systemctl restart rpcbind
[root@RS ~]# systemctl enable rpcbind
[root@RS ~]# systemctl start nfs-server
[root@RS ~]# systemctl enable nfs-server
客户端挂载共享
NFS 客户端的配置步骤也十分简单。先使用 showmount 命令查询 NFS 服务器的远程共享信息,该命令的必要参数如表所示,其输出格式为“共享的目录名称 允许使用客户端地址”。
showmount命令中可用的参数以及作用
参数 | 作用 |
---|---|
-e | 显示NFS服务器的共享列表 |
-a | 显示本机挂载的文件资源的情况NFS资源的情况 |
-v | 显示版本号 |
[root@client ~]# showmount -e 192.168.8.10 //查询 NFS 服务端的共享信息
Export list for 192.168.8.10:
/nfsfile 192.168.8.*
后在 NFS 客户端创建一个挂载目录。使用 mount 命令并结合-t 参数,指定要挂载的文件系统的类型,并在命令后面写上服务器的 IP 地址、服务器上的共享目录以及要挂载到本地系统(即客户端)的目录。
[root@client ~]# mkdir /nfsfile //客户端创建目录
[root@client ~]# mount -t nfs 192.168.8.10:/nfsfile /nfsfile //挂载服务端的共享目录
[root@client ~]# df -Th
......
192.168.8.10:/nfsfile nfs4 17G 3.9G 14G 23% /nfsfile
要使NFS 文件共享服务能一直有效,则需要将其写入到 fstab 文件中:
[root@Client ~]# vim /etc/fstab //写入配置文件永久挂载
......
192.168.8.10:/nfsfile /nfsfile nfs defaults 0 0
[root@Client ~]# mount -a
autofs 自动挂载服务
无论是 Samba 服务还是 NFS 服务,都要把挂载信息写入到/etc/fstab 中,这样远程共享资源就会自动随服务器开机而进行挂载。虽然这很方便,但是如果挂载的远程资源太多,则会给网络带宽和服务器的硬件资源带来很大负载。如果在资源挂载后长期不使用,也会造成服务器硬件资源的浪费。
autofs 自动挂载服务可以帮我们解决这一问题。与 mount 命令不同,autofs 服务程序是一种 Linux 系统守护进程,当检测到用户试图访问一个尚未挂载的文件系统时,将自动挂载该文件系统。换句话说,将挂载信息填入/etc/fstab 文件后,系统在每次开机时都自动将其挂载,而 autofs 服务程序则是在用户需要使用该文件系统时才去动态挂载,从而节约了网络资源和服务器的硬件资源。
第一步:首先需要安装 autofs 服务程序:
[root@Client ~]# dnf install autofs //安装 autofs 服务程序
处于生产环境中的 Linux 服务器,一般会同时管理许多设备的挂载操作。如果把这些设备挂载信息都写入 autofs 服务的主配置文件中,无疑会让主配置文件臃肿不堪,不利于服务执行效率,也不利于日后修改里面的配置内容。
第二步:编写主配置文件,按照 “挂载目录 子配置文件 ” 的格式进行填写。
autofs 服务程序的主配置文件中需要按照“挂载目录 子配置文件”的格式进行填写。挂载目录是设备挂载位置的上一级目录。例如光盘设备一般挂载到 /media/cdrom 目录中,那么挂载目录写成 /media 即可。对应的子配置文件则是对这个挂载目录内的挂载设备信息作进一步的说明。子配置文件需要用户自行定义,文件名字没有严格要求,但后缀建议以 .misc 结束。
[root@Client ~]# vim /etc/auto.master
......
//第七行追加以下内容
7 /media /etc/iso.misc
8 /misc /etc/auto.misc
......
第三步:编写子配置文件,按照 “ 挂载目录,挂载文件类型,权限 :设备名称 ” 的格式进行填写。
例如,要把光盘设备挂载到/media/iso 目录中,可将挂载目录写为 iso,而 -fstype=iso9660 为文件系统格式参数iso9660 为光盘设备格式,ro,nosuid,nodev为光盘设备具体的权限参数,/dev/cdrom 则是定义要挂载的设备名称。
[root@Client ~]# vim /etc/iso.misc
iso -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
/* iso 为挂载目录
-fstype 为文件系统格式参数
iso9660 为光盘设备格式
ro,nosuid,nodev 为光盘设备具体的权限参数
/dev/cdrom 则是定义要挂载的设备名称*/
第四步:配置完成后再顺手将 autofs 服务程序启动并加入到系统启动项中:
[root@Client ~]# systemctl start autofs //重启服务
[root@Client ~]# systemctl enable autofs //加入开机启动项
第五步:检查是否已经挂载
[root@Client ~]# cd /media //进入media目录
[root@Client media]# ls //目前没有文件目录
[root@Client media]# cd iso //直接进入iso
[root@Client iso]# ls //可以看到当进入后自动挂载
AppStream EULA images RPM-GPG-KEY-redhat-beta
BaseOS extra_files.json isolinux RPM-GPG-KEY-redhat-release
EFI GPL media.repo TRANS.TBL
挂载网络共享
在 autofs 服务程序的主配置文件中会有一个 “ /misc /etc/auto.misc ” 参数,这个 auto.misc 相当于自动挂载的参考文件,它默认就已经存在,所以这里的主配置文件不需要进行任何操作:
[root@Client ~]# vim /etc/auto.master
......
8 /misc /etc/auto.misc //auto.misc 相当于自动挂载的参考文件
......
第一步:找到对应的 auto.misc 文件,填写本地挂载的路径和 NFS 服务器的挂载信息:
[root@Client ~]# vim /etc/auto.misc
......省略注释信息
nfsfile 192.168.8.10:/nfsfile //此行为新加入的挂载信息
cd -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
第二步:填写完毕后重启 autofs 服务程序,当用户进入到 /misc/nfsfile 目录时,便会自动挂载共享信息:
[root@Client ~]# systemctl restart autofs //重启服务
[root@Client ~]# cd /misc/nfsfile //进入 /misc/nfsfile 目录
[root@Client nfsfile]# ls //自动挂载共享信息
readme