本章先学习 SMB 协议与 Samba 服务程序的起源和发展过程,比较文件传输和文件共享这两种资源交换方式,然后通过实验的方式部署文件共享服务来深入了解 Samba 服务中相关参数的作用,最后分别使用 Windows 系统和 Linux 系统访问共享的文件资源。
还会学习如何配置网络文件系统(Network File System,NFS)服务来简化 Linux 系统之间的文件共享工作,以及通过部署 NFS 服务在多台 Linux 系统之间挂载并使用资源。在管理设备挂载信息时,使用 autofs 服务不仅可以正常满足设备挂载的使用需求,还能进一步提高服务器硬件资源和网络带宽的利用率。
12.1 Samba 文件共享服务
1987 年微软公司和英特尔公司共同制定了 SMB(Server Messages Block,服务器消息块)协议,旨在解决局域网内的文件或打印机等资源的共享问题,这也使得在多个主机之间共享文件变得越来越简单。到了 1991 年,当时还在读大学的 Tridgwell 为了解决 Linux 系统 与 Windows 系统之间的文件共享问题,基于 SMB 协议开发出了 SMBServer 服务程序。这是一款开源的文件共享软件,经过简单配置就能够实现 Linux 系统与 Windows 系统之间的文件共享工作。
当时 Tridgwell 想把 SMBServer 注册成为商标,但却被商标局以 “SMB 是没有意义的字符” 为由拒绝了申请。后来 Tridgwell 不断翻看词典,突然看到一个拉丁舞蹈的名字—Samba,而且这个热情洋溢的舞蹈名字中又恰好包含了“SMB”,于是Samba 服务程序的名字由此诞生,Samba 服务程序现在已经成为在 Linux 系统与 Windows 系统之间共享文件的最佳选择。
Samba 服务程序的配置方法与之前讲解的很多服务的配置方法类似,首先需要先通过软件仓库来安装 Samba 服务程序(Samba 服务程序的名字也恰巧是软件包的名字),和 samba-client 软件包,用于测试共享目录的客户端程序。
安装完毕后打开 Samba 服务程序的主配置文件 /etc/samba/smb.conf,有 37 行。其中第 17~ 22 行代表共享每位登录用户的家目录内容,意味着用户之间可以相互查看;第 24~29 行是用 SMB 协议共享本地的打印机设备,方便局域网内的用户远程使用打印机设备;最后的第 31~37 行依然为共享打印机设备的参数。以上参数对目前实验用不到,可全部删除或加 # 注释掉。
对 Samba 服务的主配置文件进行删减操作之后,最后的有效配置参数只剩下了 8 行。其中第 5~8 行参数中所提到的 cups 的全称为 Common UNIX Printing System(通用 UNIX 打印系统),还是用于打印机或打印服务器的,最后留下了4行。
下面对上述代码配置行进行详细的注释说明,以备留存查询。
在上面的代码中,security 参数代表用户登录 Samba 服务时采用的验证方式,共有 4 种可用参数。
➢ share:代表主机无须验证密码。这相当于 vsftpd 服务的匿名公开访问模式,比较方便但安全性很差。
➢ user:代表登录 Samba 服务时需要使用账号密码进行验证,通过后才能获取到文件。这是默认的验证方式。
➢ domain:代表通过域控制器进行身份验证,用来限制用户的来源域。
➢ server:代表使用独立主机验证来访用户提供的密码。这相当于集中管理账号,并不常用。
在早期的 RHEL/CentOS 系统中,Samba 服务使用的是 PAM(可插拔认证模块)来调用本地账号和密码信息,后来在 5、6 版本中替换成了用 smbpasswd 命令来设置独立的 Samba 服务账号和密码。到了 RHEL 7/8 版本,则又进行了一次改革,将传统的验证方式换成使用 tdbsam 数据库进行验证。这是一个专门用于保存 Samba 服务账号密码的数据库,用户需要用 pdbedit 命令进行独立的添加操作。
12.1.1 配置共享资源
Samba 服务程序的主配置文件与前面学习过的 Apache 服务很相似,包括全局配置参数和区域配置参数。全局配置参数用于设置整体的资源共享环境,对里面的每一个独立的共享资源都有效。区域配置参数则用于设置单独的共享资源仅对该资源有效。创建共享资源的方法很简单,只要按下图中的格式写入到 Samba 服务程序的主配置文件中,然后重启该服务即可。
首先创建用于访问共享资源的账户信息,RHEL 8 系统中 Samba 服务程序默认使用的是用户密码认证模式(user),只有建立账户信息数据库之后,才能使用用户密码认证模式。并且 Samba 服务程序的数据库要求账户必须在当前系统中已经存在,否则日后创建文件时将导致文件的权限属性引发错误。
pdbedit 命令用于管理 Samba 服务程序的账户信息数据库,格式为“pdbedit [选项] 账户”;在第一次把账户信息写入到数据库时需要使用 -a 参数,以后在执行修改密码、删除账户等操作时就不再需要该参数了。pdbedit 命令中使用的参数以及作用如图。
下面使用系统中已有的 probe 用户作为 samba 服务的访问,pdbedit 命令写入用户时要求输入的密码与用户本地密码无关。
创建用于共享资源的文件目录,设置文件读写权限,由于/home 目录是系统中普通用户的家目录,因此还需要考虑应用于该目录的 SELinux 安全上下文的限制。在 Samba 的帮助手册中显示,正确的文件上下文值应该是 samba_share_t,修改完毕后执行 restorecon 命令,让应用于目录的新 SELinux 安全上下文立即生效。
设置 SELinux 服务策略,使其允许通过 Samba 服务程序访问普通用户家目录。执行 getsebool 命令,筛选出所有与 Samba 服务程序相关的 SELinux 域策略,根据策略的名称(或经验)选择出正确的策略条目进行开启。
在 Samba 服务程序的主配置文件 /etc/samba/smb.conf,根据 12.1.1 目录下面图片内容的格式追加写入共享信息。Samba 服务程序在系统中的名字为 smb,所以重启 smb 服务并加入到启动项中,保证在重启服务器后依然能够为用户持续提供服务。
为了避免防火墙限制用户访问,这里将 iptables 防火墙清空,再把 Samba 服务添加到 firewalld 防火墙中。
可以使用“systemctl status smb”命令查看服务器是否启动了 Samba 服务。如果想进一步查看 Samba 服务都共享了哪些目录,则可以使用 smbclient 命令来查看共享详情;-U 参数指定了用户名称(用哪位用户挂载了 Samba 服务,就用哪位用户的身份进行查看);-L 参数列出了共享清单。
查看可能会报错:protocol negotiation failed: NT_STATUS_IO_TIMEOUT有可能是dns的问题。去注释掉 /etc/resolv.conf 里面无关的DNS指向即可。
12.1.2 Windows 访问共享
无论 Samba 共享服务部署在 Windows 系统上还是部署在 Linux 系统上,通过 Windows 系统进行访问时,方法都是一样的。要在 Windows 系统中访问共享资源,只需要单击 Windows 系统的“开始”按钮后输入两个反斜杠,然后再添加服务器的 IP 地址即可。
输入密码时不要搞错不是本地用户原来的密码,是前面 pdbedit 命令写入用户时的密码。新建文件后删除均成功。
12.1.3 Linux 挂载共享
Samba 服务程序还可以实现 Linux 系统之间的文件共享,设置 Samba 服务程序所在主机(即 Samba 共享服务器)和 Linux 客户端使用的 IP 地址,然后在客户端(centos7)安装支持文件共享服务的软件包(cifs-utils)。
在 centos 7 客户端创建一个用于挂载 Samba 服务共享的目录。这个目录可以与服务器上的共享名称同名。mount 命令中的-t cifs(common internet file system)用于指定协议类型,-o 参数用于指定用户名和密码,接着是服务器 IP 地址/共享名称,最后是本地挂载目录。服务器 IP 地址后面的共享名称指的是配置文件中[database]的值,而不是服务器本地挂载的目录名称。虽然这两个值可以一样。
远程共享目录也可以实现自动挂载,需按照 Samba 服务的用户名、密码、共享域的顺序将相关信息写入一个认证文件中,然后编辑挂载 /etc/fstab 文件并保存。为了保证不被其他人随意看到,把认证文件的权限修改为仅 root 管理员才能够读写。
centos 7 客户端成功地挂载了 Samba 服务的共享资源,进入到挂载目录 /db 后就可以看到 Windows 系统访问 Samba 服务程序时留下来的文件(即文件 samba.txt),对该文件进行读写,删除也可以。
12.2 NFS(网络文件系统)
NFS 服务基于TCP/IP协议,也可以将远程 Linux 系统上的文件共享资源挂载到本地主机的目录上,RHEL 8 和 CentOS 7 系统中默认已经安装了 NFS 服务,可以使用软件仓库检查系统中是否已经安装了 NFS 软件包;默认的防火墙策略禁止 NFS 共享服务,需要添加 nfs 服务及关联项允许。
在 NFS 服务器上建立用于 NFS 文件共享的目录,并设置足够的权限确保其他人也有写入权限;NFS 服务程序的配置文件为 /etc/exports,默认情况下里面没有任何内容,可以按照下图参数的格式写到 NFS 服务程序的配置文件中。
在 NFS 服务的配置文件中巧用通配符能够实现很多便捷功能;匹配 IP 地址就有 3 种方法:第一种是直接写 * 号,代表任何主机都可以访问,第二种则是实验中采用的 192.168.187.*通配格式,代表来自 192.168.187.0/24 网段的主机,第三种则是直接写对方的 IP 地址,如 192.168.187.131,代表仅允许该主机进行访问。
由于在使用 NFS 服务进行文件共享之前,需要使用 RPC(Remote Procedure Call,远程过程调用)服务将 NFS 服务器的 IP 地址和端口号等信息发送给客户端。因此在启动 NFS 服务之前,还需要顺带重启并启用 rpcbind 服务程序,并将这两个服务一并加入开机启动项中。
NFS 客户端的配置步骤比较简单,先使用 showmount 命令查询 NFS 服务器的远程共享信息,该命令的参数如图。
然后在客户端创建一个挂载目录,使用 mount 命令并结合-t 参数,指定要挂载的文件系统的类型,并在命令后面写上服务器的 IP 地址:/共享目录,最后本地的挂载目录。
同样可以实现开机自动挂载 NFS 文件共享服务,则需要将其写入到 fstab 文件中。
最后来验证一下共享目录的读写,删除,操作成功。
12.3 autofs 自动挂载服务
无论是 Samba 服务还是 NFS 服务,都要把挂载信息写入到 /etc/fstab 配置文件才能开机自动挂载;但是如果挂载的远程资源太多,则会给网络带宽和服务器的硬件资源带来很大负载。如果在资源挂载后长期不使用,也会造成服务器硬件资源的浪费。
autofs 自动挂载服务可以帮我们解决这一问题。与 mount 命令不同,autofs 服务程序是一种 Linux 系统守护进程,当检测到用户试图访问一个尚未挂载的文件系统时,将自动挂载该文件系统,从而节约了网络资源和服务器的硬件资源。
首先需要自行安装 autofs 服务程序。
在 autofs 服务程序的主配置文件 /etc/auto.master,需要按照“挂载目录 子配置文件”的格式进行填写;对应的子配置文件需要另外编写,子配置文件名字没有严格要求,但后缀以.misc 结束。
在子配置文件中按照“挂载目录 挂载文件类型及权限 :设备名称”的格式进行填写;例如目录写为 iso,而-fstype 为文件系统格式,iso9660 为光盘设备格式,ro、nosuid 及 nodev 为光盘设备具体的权限参数,/dev/cdrom 则是定义要挂载的设备名称。配置完成后再将 autofs 服务程序启动并加入到系统启动项中。
先卸载/dev/sr0,确认光盘设备没有被挂载上;并且 /media 目录中根本就没有 iso 子目录,但是不会影响我们进入 iso 查看里面的内容。
再对前面 NFS 服务进行配置试试;客户端先安装 autofs ,把 NFS 共享目录卸载掉,在 autofs 服务程序的主配置文件 /etc/auto.master 中会有一行“/misc /etc/auto.misc”参数,这个 auto.misc 相当于自动挂载的参考文件,它默认就已经存在,所以这里不需要进行任何操作。
编辑上面对应的 /etc/auto.misc 文件,填写本地挂载的目录和 NFS 服务器的共享路径,最后重启 autofs 服务程序。当用户进入到/misc/Cnfs 目录时,便会自动挂载共享信息。
回到 RHEL8 服务器查看上面 CentOS 客户端编写的auto.txt 内容。