章节简述:

本章首先通过比较文件传输和文件共享这两种资源交换方式来引入Samba服务的理论知识,并介绍SMB协议与Samba服务程序的起源和发展过程,然后通过实验的方式部署文件共享服务来深入了解Samba服务中相关参数的作用,并在实验最后分别使用Windows系统和Linux系统访问共享的文件资源,确保读者彻底掌握文件共享服务的配置方法。

本章还讲解了如何配置网络文件系统(Network File System,NFS)服务来简化Linux系统之间的文件共享工作,以及通过部署NFS服务在多台Linux系统之间挂载并使用资源。在管理设备挂载信息时,使用autofs服务不仅可以正常满足设备挂载的使用需求,还能进一步提高服务器硬件资源和网络带宽的利用率。

刘遄老师相信,当各位读者认真学习完本章内容之后,一定会深刻理解在Linux系统之间共享文件资源以及在Linux系统与Windows系统之间共享文件资源的工作机制,并彻底掌握相应的配置方法。

12.1 SAMBA文件共享服务

上一章讲解的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服务logo

图12-1  Samba服务程序的logo

Samba服务程序的配置方法与之前讲解的很多服务的配置方法类似,首先需要先通过软件仓库来安装Samba服务程序(Samba服务程序的名字也恰巧是软件包的名字)。顺带再安装一个samba-client软件包,这是一会儿用于测试共享目录的客户端程序:

[root@linuxprobe ~]# dnf install samba samba-client
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:17 ago on Fri 05 Mar 2021 04:54:36 PM CST.
Dependencies resolved.
========================================================================================
 Package                     Arch            Version              Repository       Size
========================================================================================
Installing:
 samba                       x86_64          4.9.1-8.el8          BaseOS          708 k
 samba-client                x86_64          4.9.1-8.el8          BaseOS          636 k
Installing dependencies:
 samba-common-tools          x86_64          4.9.1-8.el8          BaseOS          461 k
 samba-libs                  x86_64          4.9.1-8.el8          BaseOS          177 k

Transaction Summary
========================================================================================
Install  4 Packages
………………省略部分输出信息………………
Installed:
  samba-4.9.1-8.el8.x86_64                      samba-client-4.9.1-8.el8.x86_64        
  samba-common-tools-4.9.1-8.el8.x86_64         samba-libs-4.9.1-8.el8.x86_64          

Complete!

安装完毕后打开Samba服务程序的主配置文件,好在参数并不多,只有37行。其中第17~22行代表共享每位登录用户的家目录内容。虽然在某些情况下这可以更方便地共享文件,但这个默认操作着实有些危险,建议不要共享,将其删除掉。第24~29行是用SMB协议共享本地的打印机设备,方便局域网内的用户远程使用打印机设备。当前我们没有打印机设备,因此建议也将其删除掉,不共享。最后的第31~37行依然为共享打印机设备的参数,同样建议予以删除。

[root@linuxprobe ~]# vim /etc/samba/smb.conf
  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 
  6 [global]
  7         workgroup = SAMBA
  8         security = user
  9 
 10         passdb backend = tdbsam
 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

在对Samba服务的主配置文件进行一顿删减操作之后,最后的有效配置参数只剩下了8行。所剩不多的参数中,还能继续删除不需要的参数。例如,第5~8行参数中所提到的cups的全称为Common UNIX Printing System(通用UNIX打印系统),依然是用于打印机或打印服务器的,继续予以删除。

[root@linuxprobe ~]# cat /etc/samba/smb.conf
  1 [global]
  2         workgroup = SAMBA
  3         security = user
  4         passdb backend = tdbsam
  5         printing = cups
  6         printcap name = cups
  7         load printers = yes
  8         cups options = raw

Tips

删除掉不需要的代码是常规操作。通过关闭非必要的功能,可以让服务程序“轻装前进”,让服务程序把硬件资源都用到刀刃上,使其具有更好的性能。而且,还能让运维人员更快地找到所需的代码。与100行代码相比,从10行代码中找到一个参数要容易很多。所以只要对参数有正确的认识,那么就大胆地操作吧!

为了避免在工作中使用到了打印机服务而不知如何配置,下面对上述代码进行详细的注释说明(见表12-1),大家可以留存备查。

表12-1                                      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:代表使用独立主机验证来访用户提供的密码。这相当于集中管理账号,并不常用。

在最早期的RHEL/CentOS系统中,Samba服务使用的是PAM(可插拔认证模块)来调用本地账号和密码信息,后来在5、6版本中替换成了用smbpasswd命令来设置独立的Samba服务账号和密码。到了RHEL 7/8版本,则又进行了一次改革,将传统的验证方式换成使用tdbsam数据库进行验证。这是一个专门用于保存Samba服务账号密码的数据库,用户需要用pdbedit命令进行独立的添加操作,下文中会有实战演示。

12.1.1 配置共享资源

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,所以重启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步:可以使用“systemctl status smb”命令查看服务器是否启动了Samba服务。如果想进一步查看Samba服务都共享了哪些目录,则可以使用smbclient命令来查看共享详情;-U参数指定了用户名称(用哪位用户挂载了Samba服务,就用哪位用户的身份进行查看);-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
	---------            -------
12.1.2 Windows挂载共享

无论Samba共享服务是部署Windows系统上还是部署在Linux系统上,通过Windows系统进行访问时,其步骤和方法都是一样的。下面假设Samba共享服务部署在Linux系统上,并通过Windows系统来访问Samba服务。Samba共享服务器和Windows客户端的IP地址可以根据表12-4来设置。

表12-4               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地址即可,如图12-2所示。

图12-2  在Windows系统中访问共享资源

现在应该就能看到Samba共享服务的登录界面了。刘遄老师在这里先使用linuxprobe账户的系统本地密码尝试登录,结果出现了如图12-3所示的报错信息。由此可以验证,在RHEL 8系统中,Samba服务程序使用的是独立的账户信息数据库。所以,即便在Linux系统中有一个linuxprobe账户,Samba服务程序使用的账户信息数据库中也有一个同名的linuxprobe账户,大家一定要弄清楚它们各自所对应的密码,它们仅仅是名称相同而已。

图12-3  访问Samba共享服务提示出错

在正确输入Samba服务数据库中的linuxprobe账户名以及使用pdbedit命令设置的密码后,就可以登录到Samba服务程序的共享界面中了,如图12-4所示。此时,可以尝试执行查看、写入、更名、删除文件等操作。

由于Windows系统的缓存原因,有可能您在第二次登录时提供了正确的账户和密码,依然会报错,这时只需要重新启动一下Windows客户端就没问题了(如果Windows系统依然报错,请检查上述步骤是否有做错的地方)。

图12-4  成功访问Samba共享服务

12.1.3 Linux挂载共享

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

表12-5           Samba共享服务器和Linux客户端各自使用的操作系统以及IP地址

主机名称 操作系统 IP地址
Samba共享服务器 RHEL 8 192.168.10.10
Linux客户端 RHEL 8 192.168.10.20
Windows客户端 Windows 10 192.168.10.30
[root@linuxprobe ~]# dnf install cifs-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.
AppStream                                                    3.1 MB/s | 3.2 kB     00:00    
BaseOS                                                       2.7 MB/s | 2.7 kB     00:00    
Dependencies resolved.
=============================================================================================
 Package                Arch               Version                  Repository          Size
=============================================================================================
Installing:
 cifs-utils             x86_64             6.8-2.el8                BaseOS              93 k

Transaction Summary
=============================================================================================
Install  1 Package         
………………省略部分输出信息………………    
Installed:
  cifs-utils-6.8-2.el8.x86_64                                                     
Complete!

安装好软件包后,在Linux客户端创建一个用于挂载Samba服务共享资源的目录。这个目录可以与服务器上的共享名称同名,以便于日后查找。mount命令中的-t参数用于指定协议类型,-o参数用于指定用户名和密码,最后追加上服务器IP地址、共享名称和本地挂载目录即可。服务器IP地址后面的共享名称指的是配置文件中[database]的值,而不是服务器本地挂载的目录名称。虽然这两个值可能一样,但大家应该认出它们的区别。

[root@linuxprobe ~]# mkdir /database
[root@linuxprobe ~]# mount -t cifs -o username=linuxprobe,password=redhat //192.168.10.10/database /database
[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/database   17G  3.9G   14G  23% /database

如果在每次重启电脑后都需要使用mount命令手动挂载远程共享目录,是不是觉得很麻烦呢?其实可以按照Samba服务的用户名、密码、共享域的顺序将相关信息写入一个认证文件中,然后让/etc/fstab文件和系统自动加载它。为了保证不被其他人随意看到,最后把这个认证文件的权限修改为仅root管理员才能够读写:

[root@linuxprobe ~]# vim auth.smb
username=linuxprobe
password=redhat
domain=MYGROUP
[root@linuxprobe ~]# chmod 600 auth.smb

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

[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                    1 0
/dev/mapper/rhel-swap                      swap          swap    defaults                    0 0
/dev/cdrom                                 /media/cdrom  iso9660 defaults                    0 0 
//192.168.10.10/database                   /database     cifs    credentials=/root/auth.smb  0 0
[root@linuxprobe ~]# mount -a

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

[root@linuxprobe ~]# cat /database/Memo.txt
i can edit it .

出现问题?大胆提问!

因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~

Linux技术交流学习请加读者群(推荐):https://www.linuxprobe.com/club

*本群特色:确保每一位群友都是《Linux就该这么学》的读者,答疑更有针对性,不定期领取定制礼品。

12.2 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   
12.3 AutoFs自动挂载服务

无论是Samba服务还是NFS服务,都要把挂载信息写入到/etc/fstab中,这样远程共享资源就会自动随服务器开机而进行挂载。虽然这很方便,但是如果挂载的远程资源太多,则会给网络带宽和服务器的硬件资源带来很大负载。如果在资源挂载后长期不使用,也会造成服务器硬件资源的浪费。可能会有读者说,“可以在每次使用之前执行mount命令进行手动挂载”。这是一个不错的选择,但是每次都需要先挂载再使用,您不觉得麻烦吗?

autofs自动挂载服务可以帮我们解决这一问题。与mount命令不同,autofs服务程序是一种Linux系统守护进程,当检测到用户试图访问一个尚未挂载的文件系统时,将自动挂载该文件系统。换句话说,将挂载信息填入/etc/fstab文件后,系统在每次开机时都自动将其挂载,而autofs服务程序则是在用户需要使用该文件系统时才去动态挂载,从而节约了网络资源和服务器的硬件资源。

首先需要自行安装autofs服务程序:

[root@linuxprobe ~]# dnf install autofs
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:28:58 ago on Sat 06 Mar 2021 04:57:01 AM CST.
Dependencies resolved.
========================================================================================
 Package           Arch              Version                    Repository         Size
========================================================================================
Installing:
 autofs            x86_64            1:5.1.4-29.el8             BaseOS            755 k

Transaction Summary
========================================================================================
Install  1 Package
………………省略部分输出信息………………
Installed:
  autofs-1:5.1.4-29.el8.x86_64                                                          

Complete!

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

[root@linuxprobe ~]# vim /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
#
# If you have fedfs set up and the related binaries, either
# built as part of autofs or installed from another package,
# uncomment this line to use the fedfs program map to access
# your fedfs mounts.
#/nfs4  /usr/sbin/fedfs-map-nfs4 nobind
#
# 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.
#
+auto.master

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

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

接下来将发生一件非常有趣的事情。先查看当前的光盘设备挂载情况,确认光盘设备没有被挂载上,而且/media目录中根本就没有iso子目录:

[root@linuxprobe ~]# umount /dev/cdrom
[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/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
[root@linuxprobe ~]# cd /media
[root@linuxprobe media]# ls
[root@linuxprobe media]#

但是,我们却可以使用cd命令切换到这个iso子目录中,而且光盘设备会被立即自动挂载上,然后也就能顺利查看光盘内的内容了。

[root@linuxprobe media]# cd iso
[root@linuxprobe 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
[root@linuxprobe iso]# 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/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
/dev/sr0                6.7G  6.7G     0 100% /media/iso

Tips

咦?怎么光盘设备的名称变成了/dev/sr0呢?实际上它和/dev/cdrom是快捷方式的关系,只是名称不同而已。

[root@linuxprobe ~]# ls -l /dev/cdrom
lrwxrwxrwx. 1 root root 3 Feb 26 00:09 /dev/cdrom -> sr0

是不是很有方便?!趁着刚学的知识还没忘,我们再对NFS服务动手试试吧。

首先把NFS共享目录卸载掉。在autofs服务程序的主配置文件中会有一个“/misc /etc/auto.misc”参数,这个auto.misc相当于自动挂载的参考文件,它默认就已经存在,所以这里不需要进行任何操作:

[root@linuxprobe ~]# umount /nfsfile
[root@linuxprobe ~]# vim /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
………………省略部分输出信息………………

接下来找到这个对应的auto.misc文件,填写本地挂载的路径和NFS服务器的挂载信息:

[root@linuxprobe ~]# vim /etc/auto.misc
#
# This is an automounter map and it has the following format
# key [ -mount-options-separated-by-comma ] location
# Details may be found in the autofs(5) manpage
nfsfile         192.168.10.10:/nfsfile
cd              -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom

# the following entries are samples to pique your imagination
#linux          -ro,soft,intr           ftp.example.org:/pub/linux
#boot           -fstype=ext2            :/dev/hda1
#floppy         -fstype=auto            :/dev/fd0
#floppy         -fstype=ext2            :/dev/fd0
#e2floppy       -fstype=ext2            :/dev/fd0
#jaz            -fstype=ext2            :/dev/sdc1
#removable      -fstype=ext2            :/dev/hdd

在填写完毕后重启autofs服务程序,当用户进入到/misc/nfsfile目录时,便会自动挂载共享信息:

[root@linuxprobe ~]# systemctl restart autofs
[root@linuxprobe ~]# cd /misc/nfsfile
[root@linuxprobe nfsfile]# 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/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% /misc/nfsfile
/dev/sr0                6.7G  6.7G     0 100% /media/iso

真棒!又学习到了一个全新的技能。有了autofs服务,我们的工作变得更加便捷,也就不用总想着挂载设备的问题了,它会帮我们自动完成。

稍作休息,准备继续前进!

出现问题?大胆提问!

因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~

Linux技术交流学习请加读者群(推荐):https://www.linuxprobe.com/club

*本群特色:确保每一位群友都是《Linux就该这么学》的读者,答疑更有针对性,不定期领取定制礼品。

本章节的复习作业(答案就在问题的下一行哦,用鼠标选中即可看到的~)

1.要想实现Linux系统与Windows系统之间的文件共享,能否使用NFS服务?

答:不可以,应该使用Samba服务程序,NFS服务仅能实现Linux系统之间的文件共享。

2.用于管理Samba服务程序的独立账户信息数据库的命令是什么?

答:pdbedit命令用于管理Samba服务程序的账户信息数据库。

3.简述在Windows系统中使用Samba服务程序来共享资源的方法。

答:在“开始”菜单的输入框中按照\\192.168.10.10的格式输入访问命令并回车执行即可。在Windows的“运行”命令框中按照\\192.168.10.10的格式输入访问命令并按回车键即可。

4.简述在Linux系统中使用Samba服务程序来共享资源的步骤方法。

答:首先应创建密码认证文件以及挂载目录,然后把挂载信息写入/etc/fstab文件中,最后执行mount -a命令挂载使用。

5.如果在Linux系统中默认没有安装NFS服务程序,则需要安装什么软件包呢?

答:NFS服务程序的软件包名字为nfs-utils,因此执行yum install nfs-utils命令即可。

6.在使用NFS服务共享资源时,若希望无论NFS客户端使用什么账户来访问共享资源,都会被映射为本地匿名用户,则需要添加哪个参数。

答:需要添加all_squash参数,以便更好地保证服务器的安全。

7.客户端在查看远程NFS服务器上的共享资源列表时,需要使用哪个命令?

答:使用showmount命令即可看到NFS服务器上的资源共享情况。

8.简述autofs服务程序的作用。

答:实现动态灵活的设备挂载操作,而且只有检测到用户试图访问一个尚未挂载的文件系统时,才自动挂载该文件系统。

本文原创地址:https://www.linuxprobe.com/basic-learning-12.html编辑:刘遄,审核员:暂无