Linux就该这么学_第12章 使用 Samba 或 NFS 实现文件共享

本章讲解了如下内容:
➢ Samba 文件共享服务;
➢ NFS(网络文件系统);
➢ autofs 自动挂载服务。
本章首先通过比较文件传输和文件共享这两种资源交换方式来引入 Samba 服务的
理论知识,并介绍 SMB 协议与 Samba 服务程序的起源和发展过程。然后通过实验的方
式部署文件共享服务来深入了解 Samba 服务中相关参数的作用,并在实验最后分别使用
Windows 系统和 Linux 系统访问共享的文件资源,确保读者彻底掌握文件共享服务的配
置方法
本章还讲解了如何配置网络文件系统(Network File System,NFS)服务来简化 Linux 系
统之间的文件共享工作,以及通过部署 NFS 服务在多台 Linux 系统之间挂载并使用资源。在
管理设备挂载信息时,使用 autofs 服务不仅可以正常满足设备挂载的使用需求,还能进一步
提高服务器硬件资源和网络带宽的利用率。
刘遄老师相信,当各位读者认真学习完本章内容之后,一定会深刻理解在 Linux 系统之
间共享文件资源以及在 Linux 系统与 Windows 系统之间共享文件资源的工作机制,并彻底掌
握相应的配置方法。

上一章讲解的 FTP 文件传输服务确实可以让主机之间的文件传输变得简单方便,但是
FTP 协议的本质是传输文件,而非共享文件,因此要想通过客户端直接在服务器上修改文件
内容还是一件比较麻烦的事情。
1987 年,微软公司和英特尔公司共同制定了 SMB(Server Messages Block,服务器消息
块)协议,旨在解决局域网内的文件或打印机等资源的共享问题,这也使得在多个主机之间
共享文件变得越来越简单。到了 1991 年,当时还在读大学的 Tridgwell 为了解决 Linux 系统
与 Windows 系统之间的文件共享问题,基于 SMB 协议开发出了 SMBServer 服务程序。这是
一款开源的文件共享软件,经过简单配置就能够实现 Linux 系统与 Windows 系统之间的文件
共享工作。当时,Tridgwell 想把这款软件的名字 SMBServer 注册成为商标,但却被商标局以
SMB 是没有意义的字符而拒绝了申请。后来 Tridgwell 不断翻看词典,突然看到一个拉丁舞蹈
的名字—Samba,而且这个热情洋溢的舞蹈名字中又恰好包含了“SMB”,于是 Samba 服务

程序的名字由此诞生(见图 12-1)。Samba 服务程序现在已经成为在 Linux 系统与 Windows 系
统之间共享文件的最佳选择。

Samba 服务程序的配置方法与之前讲解的很多服务的配置方法类似,首先需要先通过
Yum 软件仓库来安装 Samba 服务程序(Samba 服务程序的名字也恰巧是软件包的名字):

[root@www ~]# yum install samba

 安装完毕后打开 Samba 服务程序的主配置文件,发现竟然有 320 行之多!有没有被吓到?
但仔细一看就会发现,其实大多数都是以井号(#)开头的注释信息行。有刘遄老师在,肯定
是不会让大家去“死啃”这些内容的。

[root@www ~]# cat /etc/samba/smb.conf
# See smb.conf.example for a more detailed config file or
# read the smb.conf manpage.
# Run 'testparm' to verify the config is correct after
# you modified it.

[global]
        workgroup = SAMBA
        security = user

        passdb backend = tdbsam

        printing = cups
        printcap name = cups
        load printers = yes
        cups options = raw

[homes]
        comment = Home Directories
        valid users = %S, %D%w%S
        browseable = No
        read only = No
        inherit acls = Yes

[printers]
        comment = All Printers
        path = /var/tmp
        printable = Yes
        create mask = 0600
        browseable = No

[print$]
        comment = Printer Drivers
        path = /var/lib/samba/drivers
        write list = @printadmin root
        force group = @printadmin
        create mask = 0664
        directory mask = 0775

由于在 Samba 服务程序的主配置文件中,注释信息行实在太多,不便于分析里面的重
要参数,因此先把主配置文件改个名字,然后使用 cat 命令读入主配置文件,再在 grep 命
令后面添加-v 参数(反向选择),分别去掉所有以井号(#)和分号(;)开头的注释信息
行,对于剩余的空白行可以使用^$参数来表示并进行反选过滤,最后把过滤后的可用参数
信息通过重定向符覆盖写入到原始文件名称中。执行过滤后剩下的 Samba 服务程序的参
数并不复杂,为了更方便读者查阅参数的功能,表 12-1 罗列了这些参数以及相应的注释
说明。

 12.1.1 配置共享资源

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

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

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

[root@www samba]# pdbedit -a -u jingpan
new password:
retype new password:
Unix username:        jingpan
NT username:          
Account Flags:        [U          ]
User SID:             S-1-5-21-50729782-4100829890-1348835227-1000
Primary Group SID:    S-1-5-21-50729782-4100829890-1348835227-513
Full Name:            
Home Directory:       \\www\jingpan
HomeDir Drive:        
Logon Script:         
Profile Path:         \\www\jingpan\profile
Domain:               WWW
Account desc:         
Workstations:         
Munged dial:          
Logon time:           0
Logoff time:          三, 06 2月 2036 23:06:39 CST
Kickoff time:         三, 06 2月 2036 23:06:39 CST
Password last set:    四, 18 10月 2018 14:22:37 CST
Password can change:  四, 18 10月 2018 14:22:37 CST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

第2步:创建用于共享资源的文件目录。在创建时,不仅要考虑到文件读写权限的问题,
而且由于/home 目录是系统中普通用户的家目录,因此还需要考虑应用于该目录的 SELinux 安全
上下文所带来的限制。在前面对 Samba 服务程序配置文件中的注释信息进行过滤时,这些过
滤的信息中就有关于 SELinux 安全上下文策略的说明,我们只需按照过滤信息中有关 SELinux
安全上下文策略中的说明中给的值进行修改即可。修改完毕后执行 restorecon 命令,让应用于
目录的新 SELinux 安全上下文立即生效。

[root@www ~]# mkdir /home/database
[root@www ~]# chown -Rf jingpan:jingpan /home/database
[root@www ~]# ls -Zd /home/database
drwxr-xr-x. jingpan jingpan unconfined_u:object_r:home_root_t:s0 /home/database
[root@www ~]# semanage fcontext -a -t samba_share_t /home/database
[root@www ~]# ls -Zd /home/database
drwxr-xr-x. jingpan jingpan unconfined_u:object_r:home_root_t:s0 /home/database
[root@www ~]# restorecon -Rv /home/database
restorecon reset /home/database context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:samba_share_t:s0
[root@www ~]# ls -Zd /home/database
drwxr-xr-x. jingpan jingpan unconfined_u:object_r:samba_share_t:s0 /home/database

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

[root@www ~]# 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@www ~]# setsebool -P samba_enable_home_dirs on

第4步:在 Samba 服务程序的主配置文件中,根据表 12-2 所提到的格式写入共享信息。
在原始的配置文件中,[homes]参数为来访用户的家目录共享信息,[printers]参数为共享的打
印机设备。这两项如果在今后的工作中不需要,可以像刘遄老师一样手动删除,这没有任何
问题。

[root@www ~]# vim /etc/samba/smb.conf
# See smb.conf.example for a more detailed config file or
# read the smb.conf manpage.
# Run 'testparm' to verify the config is correct after
# you modified it.

[global]
        workgroup = SAMBA
        server string = Samba Server Version %v
        log file = /var/log/samba/log.$m
        max log size = 50
        security = user
        passdb backend = tdbsam

        printing = cups
        printcap name = cups
        load printers = yes
        cups options = raw
[database]
        comment= Do not arbitrarily modifi the database file
        path =/home/database
        public = no
        writable = yes

第5步:Samba 服务程序的配置工作基本完毕。接下来重启 smb 服务(Samba 服务程序
在 Linux 系统中的名字为 smb)并清空 iptables 防火墙,然后就可以检验配置效果了。

[root@www ~]# systemctl restart smb
[root@www ~]# systemctl enable smb
Created symlink from /etc/systemd/system/multi-user.target.wants/smb.service to /usr/lib/systemd/system/smb.service.
[root@www ~]# iptables -F

12.1.2 Windows 访问文件共享服务

无论 Samba 共享服务是部署 Windows 系统上还是部署在 Linux 系统上,通过 Windows
系统进行访问时,其步骤和方法都是一样的。下面假设 Samba 共享服务部署在 Linux 系统上,
并通过 Windows 系统来访问 Samba 服务。

要在 Windows 系统中访问共享资源,只需在 Windows 的“运行”命令框中输入两个反斜
杠,然后再加服务器的 IP 地址即可。

12.1.3 Linux 访问文件共享服务

上面的实验操作可能会让各位读者误以为 Samba 服务程序只是为了解决 Linux 系统和
Windows 系统的资源共享问题而设计的。其实,Samba 服务程序还可以实现 Linux 系统之间
的文件共享。请各位读者按照表 12-5 来设置 Samba 服务程序所在主机(即 Samba 共享服务
器)和 Linux 客户端使用的 IP 地址,然后在客户端安装支持文件共享服务的软件包(cifs-utils)。

[root@localhost ~]# yum install cifs-utils

在 Linux 客户端,按照 Samba 服务的用户名、密码、共享域的顺序将相关信息写入到一
个认证文件中。为了保证不被其他人随意看到,最后把这个认证文件的权限修改为仅 root 管
理员才能够读写:

[root@localhost database]# vi /root/auth.smb
username=jingpan
password=jingpan
domain=SAMBA

现在,在 Linux 客户端上创建一个用于挂载 Samba 服务共享资源的目录,并把挂载信息

写入到/etc/fstab 文件中,以确保共享挂载信息在服务器重启后依然生效:

[root@localhost ~]# vi /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Thu Oct 18 16:44:03 2018
#
# 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=fd26c5a2-b864-4dca-95a4-88c0389b4150 /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
//192.168.1.3/database /database cifs credentials=/root/auth.smb 0 0
[root@localhost ~]# mount -a

 Linux 客户端成功地挂载了 Samba 服务的共享资源。进入到挂载目录/database 后就可以
看到 Windows 系统访问 Samba 服务程序时留下来的文件了(即文件 Memo.txt)。当然,我们
也可以对该文件进行读写操作并保存。

[root@localhost ~]# cd /database/
[root@localhost database]# vi Memo.txt
i can edit it .
"Memo.txt" [New] 1L, 16C written
[root@localhost database]# 
[root@localhost database]# cat Memo.txt 
i can edit it .

12.2 NFS(网络文件系统)

如果大家觉得 Samba 服务程序的配置太麻烦,而且恰巧需要共享文件的主机都是 Linux
系统,刘遄老师非常推荐大家在客户端部署 NFS 服务来共享文件。NFS(网络文件系统)服
务可以将远程 Linux 系统上的文件共享资源挂载到本地主机的目录上,从而使得本地主机
(Linux 客户端)基于 TCP/IP 协议,像使用本地主机上的资源那样读写远程 Linux 系统上的共
享文件。
由于 RHEL 7 系统中默认已经安装了 NFS 服务,外加 NFS 服务的配置步骤也很简单,因
此刘遄老师在授课时会将 NFS 戏谑为 Need For Speed。接下来,我们准备配置 NFS 服务。首
先请使用 Yum 软件仓库检查自己的 RHEL 7 系统中是否已经安装了 NFS 软件包:

[root@www ~]# yum install nfs-utils

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

 主机名称 操作系统 IP地址
NFS服务器 centos7 192.168.1.3
NFS客户端 centos7 192.168.1.6

另外,不要忘记清空 NFS 服务器上面 iptables 防火墙的默认策略,以免默认的防火墙策
略禁止正常的 NFS 共享服务。

[root@linuxprobe ~]# iptables -F

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

第3步:NFS 服务程序的配置文件为/etc/exports,默认情况下里面没有任何内容。我们
可以按照“共享目录的路径 允许访问的 NFS 客户端(共享权限参数)”的格式,定义要共享
的目录与相应的权限。
例如,如果想要把/nfsfile 目录共享给 192.168.1.0/24 网段内的所有主机,让这些主机都
拥有读写权限,在将数据写入到 NFS 服务器的硬盘中后才会结束操作,最大限度保证数据不
丢失,以及把来访客户端 root 管理员映射为本地的匿名用户等,则可以按照下面命令中的格
式,将表 12-7 中的参数写到 NFS 服务程序的配置文件中。

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

[root@www ~]# vi /etc/exports
/nfsfile 192.168.1.*(rw,sync,root_squash)
~

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

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

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

[root@localhost ~]# showmount -e 192.168.1.3
Export list for 192.168.1.3:
/nfsfile 192.168.1.*

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

[root@linuxprobe ~]# mkdir /nfsfile
[root@linuxprobe ~]# mount -t nfs 192.168.10.10:/nfsfile /nfsfile

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

[root@localhost nfsfile]# cat /nfsfile/readme
welcome to jinpgan.site

[root@localhost ~]# vi /etc/fstab

#
# /etc/fstab
# Created by anaconda on Thu Oct 18 16:44:03 2018
#
# 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
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=fd26c5a2-b864-4dca-95a4-88c0389b4150 /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
//192.168.1.3/database /database cifs credentials=/root/auth.smb 0 0
192.168.1.3:/nfsfile /nfsfile nfs defaults 0 0
~
~

12.3 autofs 自动挂载服务

无论是 Samba 服务还是 NFS 服务,都要把挂载信息写入到/etc/fstab 中,这样远程共享资
源就会自动随服务器开机而进行挂载。虽然这很方便,但是如果挂载的远程资源太多,则会
给网络带宽和服务器的硬件资源带来很大负载。如果在资源挂载后长期不使用,也会造成服
务器硬件资源的浪费。可能会有读者说,“可以在每次使用之前执行 mount 命令进行手动挂
载”。这是一个不错的选择,但是每次都需要先挂载再使用,您不觉得麻烦吗?
autofs 自动挂载服务可以帮我们解决这一问题。与 mount 命令不同,autofs 服务程序是一
种 Linux 系统守护进程,当检测到用户视图访问一个尚未挂载的文件系统时,将自动挂载该
文件系统。换句话说,我们将挂载信息填入/etc/fstab 文件后,系统在每次开机时都自动将其挂载,
而 autofs 服务程序则是在用户需要使用该文件系统时才去动态挂载,从而节约了网络资源和
服务器的硬件资源。

[root@localhost ~]# yum install autofs

处于生产环境中的 Linux 服务器,一般会同时管理许多设备的挂载操作。如果把这些设
备挂载信息都写入到 autofs 服务的主配置文件中,无疑会让主配置文件臃肿不堪,不利于服
务执行效率,也不利于日后修改里面的配置内容,因此在 autofs 服务程序的主配置文件中需
要按照“挂载目录 子配置文件”的格式进行填写。挂载目录是设备挂载位置的上一级目录。
例如,光盘设备一般挂载到/media/cdrom 目录中,那么挂载目录写成/media 即可。对应的子
配置文件则是对这个挂载目录内的挂载设备信息作进一步的说明。子配置文件需要用户自行
定义,文件名字没有严格要求,但后缀建议以.misc 结束。具体的配置参数如第 7 行的加粗字
所示。

[root@localhost ~]# vi /etc/auto.master
#
# Sample auto.master file
# This is a 'master' automounter map and it has the following format:
# mount-point [map-type[,format]:]map [options]
# For details of the format look at auto.master(5).
#
/media /etc/iso.misc
/misc   /etc/auto.misc
#
# NOTE: mounts done from a hosts map will be mounted with the
#       "nosuid" and "nodev" options unless the "suid" and "dev"
#       options are explicitly given.
#
/net    -hosts
#
# Include /etc/auto.master.d/*.autofs
# The included files must conform to the format of this file.
#
+dir:/etc/auto.master.d
#
# Include central master map if it can be found using
# nsswitch sources.
#
# Note that if there are entries for /net or /misc (as
# above) in the included master map any keys that are the
# same will not be seen as the first read key seen takes
# precedence.

在子配置文件中,应按照“挂载目录 挂载文件类型及权限 :设备名称”的格式进行填写。例
如,要把光盘设备挂载到/media/iso 目录中,可将挂载目录写为 iso,而-fstype 为文件系统格式参
数,iso9660 为光盘设备格式,ro、nosuid 及 nodev 为光盘设备具体的权限参数,/dev/cdrom 则是
定义要挂载的设备名称。配置完成后再顺手将 autofs 服务程序启动并加入到系统启动项中:

[root@localhost ~]# vi /etc/iso.misc
iso -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
[root@localhost ~]# systemctl start autofs
[root@localhost ~]# systemctl enable autofs
Created symlink from /etc/systemd/system/multi-user.target.wants/autofs.service to /usr/lib/systemd/system/autofs.service.

接下来将发生一件非常有趣的事情。我们先查看当前的光盘设备挂载情况,确认光盘设备没
有被挂载上,而且/media 目录中根本就没有 iso 子目录。但是,我们却可以使用 cd 命令切换到这
个 iso 子目录中,而且光盘设备会被立即自动挂载上。我们也就能顺利查看光盘内的内容了。

[root@localhost ~]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   50G  1.2G   49G    3% /
devtmpfs                 899M     0  899M    0% /dev
tmpfs                    911M     0  911M    0% /dev/shm
tmpfs                    911M  9.6M  902M    2% /run
tmpfs                    911M     0  911M    0% /sys/fs/cgroup
/dev/sda1               1014M  142M  873M   14% /boot
/dev/mapper/centos-home   47G   33M   47G    1% /home
//192.168.1.3/database    22G  9.5G   12G   45% /database
tmpfs                    183M     0  183M    0% /run/user/0
192.168.1.3:/nfsfile      22G  9.5G   12G   45% /nfsfile
[root@localhost ~]# cd /media
[root@localhost media]# ls
[root@localhost media]# cd iso
[root@localhost iso]# ls -l
总用量 678
-rw-rw-r--. 1 root root     14 5月   2 19:28 CentOS_BuildTag
drwxr-xr-x. 3 root root   2048 5月   4 04:34 EFI
-rw-rw-r--. 1 root root    227 8月  30 2017 EULA
-rw-rw-r--. 1 root root  18009 12月 10 2015 GPL
drwxr-xr-x. 3 root root   2048 5月   4 04:44 images
drwxr-xr-x. 2 root root   2048 5月   4 04:34 isolinux
drwxr-xr-x. 2 root root   2048 5月   4 04:34 LiveOS
drwxrwxr-x. 2 root root 655360 5月   4 04:52 Packages
drwxrwxr-x. 2 root root   4096 5月   4 04:54 repodata
-rw-rw-r--. 1 root root   1690 12月 10 2015 RPM-GPG-KEY-CentOS-7
-rw-rw-r--. 1 root root   1690 12月 10 2015 RPM-GPG-KEY-CentOS-Testing-7
-r--r--r--. 1 root root   2883 5月   4 04:55 TRANS.TBL
[root@localhost iso]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   50G  1.2G   49G    3% /
devtmpfs                 899M     0  899M    0% /dev
tmpfs                    911M     0  911M    0% /dev/shm
tmpfs                    911M  9.6M  902M    2% /run
tmpfs                    911M     0  911M    0% /sys/fs/cgroup
/dev/sda1               1014M  142M  873M   14% /boot
/dev/mapper/centos-home   47G   33M   47G    1% /home
//192.168.1.3/database    22G  9.5G   12G   45% /database
tmpfs                    183M     0  183M    0% /run/user/0
192.168.1.3:/nfsfile      22G  9.5G   12G   45% /nfsfile
/dev/sr0                 4.2G  4.2G     0  100% /media/iso

猜你喜欢

转载自blog.csdn.net/tjjingpan/article/details/83141030
今日推荐