第12章 使用 Samba 或 NFS 实现文件共享
章节简述
本章首先通过比较文件传输和文件共享这两种资源交换方式,引入 Samba 服务的理论知识,介绍SMB 协议与 Samba 服务程序的起源和发展过程,然后通过实验部署文件共享服务, 深入了解 Samba 服务中相关参数的作用,并在实验最后分别使用 Windows 系统和 Linux 系统访问共享的文件资源,确保读者掌握文件共享服务的配置方法。
本章还讲解了如何配置网络文件系统(Network File System,NFS)服务,以简化 Linux 系统之间的文件共享,并通过部署 NFS 服务在多台 Linux 系统之间挂载和使用资源。在管理设备挂载信息时,使用 autofs 服务不仅可以满足设备挂载需求,还能进一步提高服务器硬件资源和网络带宽的利用率。
刘遄老师相信,当各位读者认真学习完本章内容之后,一定会深刻理解在 Linux 系统之间共享文件资源以及在 Linux 系统与 Windows 系统之间共享文件资源的工作机制,并彻底掌握相应的配置方法。
12.1 SAMBA文件共享服务
上一章讲解的 FTP 文件传输服务确实可以让主机之间的文件传输变得简单方便,但 FTP 的本质是传输文件,而非共享文件,因此要想通过客户端直接在服务器上修改文件内容还是一件比较麻烦的事情。
1987 年,微软公司和 Intel 公司共同制定了 SMB(Server Message Block,服务器消息块) 协议,旨在解决局域网内的文件或打印机等资源的共享问题,这使得在多个主机之间共享文件变得越来越简单。到了 1991 年,当时还在读大学的 Andrew Tridgell 为了解决 Linux 系统与Windows 系统之间的文件共享问题,基于 SMB 协议开发出了 SMBServer 服务程序。这是一款开源的文件共享软件,经过简单配置即可实现 Linux 系统与 Windows 系统之间的文件共享工作。当时,Tridgell 想把这款软件的名字 SMBServer 注册为商标,但被商标局以“SMB 是没有意义的字符”为由拒绝了申请。后来,Tridgell 不断翻看词典,突然看到一个拉丁舞蹈的名字—Samba,而这个热情洋溢的舞蹈名字中恰好包含了 SMB,于是 Samba 服务程序的名字由此诞生(其Logo 见图 12-1)。Samba 服务程序现在已经成为在 Linux 系统与 Windows 系统之间共享文件的常用且优秀的选择。
图12-1 Samba服务程序的logo
Samba 服务程序的配置方法与之前讲解的很多服务的配置方法类似,首先需要通过软件仓库来安装 Samba 服务程序(Samba 服务程序的名字也恰巧是软件包的名字),顺带再安装一个 samba-client 软件包(这是一会儿用于测试共享目录的客户端程序):
root@linuxprobe:~# dnf install samba samba-client
Updating Subscription Management repositories.
BaseOS 2.7 MB/s | 2.7 kB 00:00
AppStream 2.7 MB/s | 2.8 kB 00:00
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
samba x86_64 4.20.2-104.el10 BaseOS 991 k
samba-client x86_64 4.20.2-104.el10 AppStream 757 k
Installing dependencies:
libnetapi x86_64 4.20.2-104.el10 BaseOS 151 k
samba-common-tools x86_64 4.20.2-104.el10 BaseOS 485 k
samba-dcerpc x86_64 4.20.2-104.el10 BaseOS 727 k
samba-ldb-ldap-modules x86_64 4.20.2-104.el10 BaseOS 34 k
samba-libs x86_64 4.20.2-104.el10 BaseOS 135 k
………………省略部分输出信息………………
Installed:
libnetapi-4.20.2-104.el10.x86_64
samba-4.20.2-104.el10.x86_64
samba-client-4.20.2-104.el10.x86_64
samba-common-tools-4.20.2-104.el10.x86_64
samba-dcerpc-4.20.2-104.el10.x86_64
samba-ldb-ldap-modules-4.20.2-104.el10.x86_64
samba-libs-4.20.2-104.el10.x86_64
Complete!
安装完毕后打开 Samba 服务程序的主配置文件,好在参数并不多,只有 44 行。其中第24~29 行代表共享每位登录用户的家目录内容。虽然在某些情况下这可以更方便地共享文件, 但这个默认操作着实有些危险,建议不要共享,将其删除掉。第 31~36 行是用 SMB 协议共享本地的打印机设备,方便局域网内的用户远程使用打印机设备。当前我们没有打印机设备, 因此也建议将其删除,不共享。最后的第 38~44 行依然为共享打印机设备的参数,同样建议予以删除。
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 # Note:
7 # SMB1 is disabled by default. This means clients without support for SMB2 o r
8 # SMB3 are no longer able to connect to smbd (by default).
9
10 [global]
11 workgroup = SAMBA
12 security = user
13
14 passdb backend = tdbsam
15
16 printing = cups
17 printcap name = cups
18 load printers = yes
19 cups options = raw
20
21 # Install samba-usershares package for support
22 include = /etc/samba/usershares.conf
23
24 [homes]
25 comment = Home Directories
26 valid users = %S, %D%w%S
27 browseable = No
28 read only = No
29 inherit acls = Yes
30
31 [printers]
32 comment = All Printers
33 path = /var/tmp
34 printable = Yes
35 create mask = 0600
36 browseable = No
37
38 [print$]
39 comment = Printer Drivers
40 path = /var/lib/samba/drivers
41 write list = @printadmin root
42 force group = @printadmin
43 create mask = 0664
44 directory mask = 0775
在对 Samba 服务的主配置文件进行一顿删减操作之后,最后的有效配置参数只剩下了 9 行。在所剩不多的参数中,还能继续删除不需要的参数。例如,第 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
9 include = /etc/samba/usershares.conf
最终精简后的配置文件如下所示:
root@linuxprobe:~# cat /etc/samba/smb.conf
1 [global]
2 workgroup = SAMBA
3 security = user
4 passdb backend = tdbsam
5 include = /etc/samba/usershares.conf
Tips :
删除不需要的代码是常规操作。通过关闭非必要的功能,可以让服务程序“轻装前进”,让服务程序把硬件资源都用到刀刃上,使其具有更好的性能。而且,还能让运维人员更快地找到所需的代码。与几十行代码相比,从不到十行的代码中找到一个参数要容易很多。所以只要对参数有正确的认识,那么就大胆地操作吧!
在上面的代码中,security 参数代表用户登录 Samba 服务时采用的验证方式,总共有4 种。
share:主机无须验证密码。这相当于 vsftpd 服务的匿名公开访问模式,虽然方便, 但安全性很差。
user:登录 Samba 服务时需要使用账户和密码进行验证,通过后才能获取文件。这是默认的验证方式,最为常用。
domain:通过域控制器进行身份验证,用来限制用户的来源域。
server:使用独立主机验证来访用户提供的密码,这相当于集中管理账户,并不常用。
在早期的 RHEL/CentOS 系统中,Samba 服务使用 PAM(可插拔身份验证模块)来调用本地账户和密码信息。后来在 5、6 版本中,替换为用smbpasswd 命令来设置独立的Samba 服务账户和密码。到了 RHEL 7 版本,传统的验证方式又发生了一次改革,改为使用 tdbsam 数据库进行验证。tdbsam 是一个专门用于保存 Samba 服务账户和密码的数据库,用户需要使用pdbedit 命令独立添加账户和密码,下文中会有实战演示。
12.1.1 配置共享资源
Samba 服务程序的主配置文件与之前学习的 Apache 服务很相似,包括全局配置参数和区域配置参数。全局配置参数用于设置整体的资源共享环境,对每一个独立的共享资源都有效。区域配置参数则用于设置单独的共享资源,仅对该资源有效。创建共享资源的方法很简单, 只要将表 12-1 中的参数写入 Samba 服务程序的主配置文件中,然后重启该服务即可。
表 12-1 用于设置 Samba 服务程序的参数以及作用
参数 | 作用 |
---|---|
[database] | 共享名称为 database |
comment = Do not arbitrarily modify the database file | 警告用户不要随意修改数据库 |
path = /home/database | 共享目录为/home/database |
public = no | 关闭“所有人可见” |
writable = yes | 允许写入操作 |
第 1 步:创建用于访问共享资源的账户信息。在 RHEL 10 系统中,Samba 服务程序默认使用的是账户密码验证方式(user)。这种验证方式可以确保仅让有密码且受信任的账户访问共享资源,且验证过程十分简单。不过,只有建立账户信息数据库后,才能使用账户密码验证方式。此外,Samba 服务程序的数据库要求账户必须在当前系统中已经存在,否则创建文件时将导致文件权限属性混乱,进而引发错误。
pdbedit 命令用于管理 Samba 服务程序的账户信息数据库,格式为“pdbedit [参数] 账户”。在第一次将账户信息写入数据库时需要使用-a 参数,以后在执行修改密码、删除账户等操作时就不再需要该参数了。pdbedit 命令中使用的参数及其作用如表 12-2 所示。
表 12-2 用于 pdbedit 命令的参数及其作用
参数 | 作用 |
---|---|
-a 账户名 | 建立 Samba 账户 |
-x 账户名 | 删除 Samba 账户 |
-L | 列出账户列表 |
-Lv | 列出账户详细信息的列表 |
root@linuxprobe:~# id linuxprobe
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),10(wheel)
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-1663959641-2503989833-3304495206-1000
Primary Group SID: S-1-5-21-1663959641-2503989833-3304495206-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: Tue, 25 Mar 2025 21:48:33 CST
Password can change: Tue, 25 Mar 2025 21:48:33 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-1 提到的格式写入共享信息。
root@linuxprobe:~# vim /etc/samba/smb.conf
[global]
workgroup = SAMBA
security = user
passdb backend = tdbsam
include = /etc/samba/usershares.conf
[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'.
为了避免防火墙限制用户访问,记得把 Samba 服务添加到 firewalld 防火墙中,确保万无一失。
root@linuxprobe:~# firewall-cmd --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
Password for [SAMBA\linuxprobe]: 此处输入该账户在Samba服务数据库中的密码
Sharename Type Comment
--------- ---- -------
database Disk Do not arbitrarily modify the database file
IPC$ IPC IPC Service (Samba 4.20.2)
SMB1 disabled -- no workgroup available
12.1.2 Windows挂载共享
无论 Samba 共享服务是部署 Windows 系统上还是部署在 Linux 系统上,通过 Windows 系统进行访问时,其步骤和方法都是一样的。下面假设 Samba 共享服务部署在Linux 系统上, 并通过 Windows 系统来访问 Samba 服务。Samba 共享服务器和 Windows 客户端的 IP 地址可以根据表 12-3 来设置。
表 12-3 Samba 服务器和 Windows 客户端使用的操作系统以及 IP 地址
主机名称 | 操作系统 | IP 地址 |
---|---|---|
Samba 共享服务器 | RHEL 10 | 192.168.10.10 |
Linux 客户端 | RHEL 10 | 192.168.10.20 |
Windows 客户端 | Windows 11 | 192.168.10.30 |
要在 Windows 系统中访问共享资源,只需要单击 Windows 系统的“开始”按钮后输入两个反斜杠,然后再添加服务器的 IP 地址即可,如图 12-2 所示。
图12-2 在Windows系统中访问共享资源
现在应该能看到Samba 共享服务的登录界面了。刘遄老师在这里先使用 linuxprobe 账户的系统本地密码尝试登录,结果出现了如图 12-3 所示的报错信息。由此可以验证, 在 RHEL 10 系统中,Samba 服务程序使用的是独立的账户信息数据库。在 Linux 系统和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-4 来设置 Samba 服务程序所在主机(即 Samba 共享服务器) 和 Linux 客户端使用的 IP 地址,然后在客户端安装支持文件共享服务的软件包(cifs-utils)。
表 12-4 Samba 共享服务器和 Linux 客户端各自使用的操作系统以及 IP 地址
主机名称 | 操作系统 | IP 地址 |
---|---|---|
Samba 共享服务器 | RHEL 10 | 192.168.10.10 |
Linux 客户端 | RHEL 10 | 192.168.10.20 |
Windows 客户端 | Windows 11 | 192.168.10.30 |
root@linuxprobe:~# dnf install cifs-utils
Updating Subscription Management repositories.
Last metadata expiration check: 0:17:57 ago on Tue 25 Mar 2025 09:45:22 PM CST.
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
cifs-utils x86_64 7.0-5.el10 BaseOS 100 k
Installing dependencies:
keyutils x86_64 1.6.3-4.el10 BaseOS 80 k
………………省略部分输出信息………………
Installed:
cifs-utils-7.0-5.el10.x86_64 keyutils-1.6.3-4.el10.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
/dev/mapper/rhel-root 17G 3.8G 13G 23% /
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 1.9G 84K 1.9G 1% /dev/shm
efivarfs 256K 56K 196K 23% /sys/firmware/efi/efivars
tmpfs 776M 9.7M 767M 2% /run
tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-journald.service
/dev/sda2 960M 272M 689M 29% /boot
/dev/sr0 6.5G 6.5G 0 100% /media/cdrom
/dev/sda1 599M 8.3M 591M 2% /boot/efi
tmpfs 388M 124K 388M 1% /run/user/0
//192.168.10.10/database 17G 3.7G 13G 23% /database
如果在每次重启电脑后都需要使用mount 命令手动挂载远程共享目录,是不是觉得很麻烦呢?其实可以按照 Samba 服务的账户名、密码、共享域的顺序将相关信息写入一个认证文件中,然后让/etc/fstab 文件和系统自动加载它。为了保证不被其他人随意看到,最后把这个认证文件的权限修改为仅 root 管理员才能够读写。
root@linuxprobe:~# vim auth.smb
username=linuxprobe
password=redhat
domain=SAMBA
root@linuxprobe:~# chmod 600 auth.smb
将挂载信息写入/etc/fstab 文件中,以确保共享挂载信息在服务器重启后依然生效。
root@linuxprobe:~# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Mar 12 20:08:04 2025
#
# 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.
#
UUID=016bb74f-bfa8-4d80-aa6d-d5693c39a844 / xfs defaults 0 0
UUID=c34124dd-c66e-4cbe-ba04-528666d30dc0 /boot xfs defaults 0 0
UUID=9A1A-B195 /boot/efi vfat umask=0077,shortname=winnt 0 2
UUID=299dacfd-f999-48d8-bca4-e5274ac600a8 none 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:~# systemctl daemon-reload
root@linuxprobe:~# mount -a
Linux 客户端成功挂载了 Samba 服务的共享资源。进入挂载目录/database 后就可以看到 Windows 系统访问 Samba 服务程序时留下来的文件了(即文件 Memo.txt)。当然,也可以对该文件进行读写操作并保存。
root@linuxprobe:~# cat /database/Memo.txt
i can edit it .
12.2 NFS
如果大家觉得 Samba 服务程序的配置太麻烦,而且恰巧需要共享文件的主机都是Linux 系统,此时非常推荐大家在客户端部署 NFS(网络文件系统)服务来共享文件。NFS 服务可以将远程 Linux 系统上的文件共享资源挂载到本地主机的目录上,从而使得本地主机(Linux 客户端)基于 TCP/IP,像使用本地主机上的资源那样读写远程 Linux 系统上的共享文件。
由于在 RHEL 10 系统中配置 NFS 服务实在是太简单了,因此刘遄老师在授课时会将其戏称为 Need For Speed(极品飞车)。
第 1 步:安装NFS 服务所需的软件包。
root@linuxprobe:~# dnf install nfs-utils
Updating Subscription Management repositories.
BaseOS 2.7 MB/s | 2.7 kB 00:00
AppStream 2.7 MB/s | 2.8 kB 00:00
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
nfs-utils x86_64 1:2.7.1-1.el10 BaseOS 481 k
Installing dependencies:
gssproxy x86_64 0.9.2-7.el10 BaseOS 122 k
keyutils x86_64 1.6.3-4.el10 BaseOS 80 k
libev x86_64 4.33-12.el10 BaseOS 56 k
libnfsidmap x86_64 1:2.7.1-1.el10 BaseOS 67 k
libverto-libev x86_64 0.3.2-9.el10 BaseOS 15 k
rpcbind x86_64 1.2.7-2.el10 BaseOS 62 k
sssd-nfs-idmap x86_64 2.10.0~beta2-3.el10 BaseOS 34 k
………………省略部分输出信息………………
Installed:
gssproxy-0.9.2-7.el10.x86_64 keyutils-1.6.3-4.el10.x86_64
libev-4.33-12.el10.x86_64 libnfsidmap-1:2.7.1-1.el10.x86_64
libverto-libev-0.3.2-9.el10.x86_64 nfs-utils-1:2.7.1-1.el10.x86_64
rpcbind-1.2.7-2.el10.x86_64 sssd-nfs-idmap-2.10.0~beta2-3.el10.x86_64
Complete!
第 2 步:为了检验 NFS 服务配置的效果,我们需要使用两台Linux 主机(一台充当 NFS服务器,一台充当 NFS 客户端),并按照表 12-5 来设置它们所使用的 IP 地址。
表 12-5 两台 Linux 主机所使用的操作系统以及 IP 地址
主机名称 | 操作系统 | IP 地址 |
---|---|---|
NFS 服务器 | RHEL 10 | 192.168.10.10 |
NFS 客户端 | RHEL 10 | 192.168.10.20 |
另外,不要忘记配置好防火墙,以免默认的防火墙策略禁止正常的 NFS 服务。
root@linuxprobe:~# firewall-cmd --permanent --add-service=nfs
success
root@linuxprobe:~# firewall-cmd --permanent --add-service=rpc-bind
success
root@linuxprobe:~# firewall-cmd --permanent --add-service=mountd
success
root@linuxprobe:~# firewall-cmd --reload
success
第 3 步:在 NFS 服务器上建立用于 NFS 文件共享的目录,并设置足够的权限确保其他人也有写入权限。
root@linuxprobe:~# mkdir /nfsfile
root@linuxprobe:~# chmod -R 777 /nfsfile
root@linuxprobe:~# echo "welcome to linuxprobe.com" > /nfsfile/readme
第 4 步:NFS 服务程序的配置文件为/etc/exports,默认情况下里面没有任何内容。我们可以按照“共享目录的路径 允许访问的 NFS 客户端(共享权限参数)”的格式,定义要共享的目录与相应的权限。
例如,如果想要把/nfsfile 目录共享给 192.168.10.0/24 网段内的所有主机,让这些主机都拥有读写权限,在将数据写入 NFS 服务器的磁盘中后才会结束操作,最大限度地保证数据不丢失,以及将访问客户端的 root 管理员映射为本地的匿名用户,则可以按照下面命令中的格式,将表 12-6 中的参数写到 NFS 服务程序的配置文件中。
表 12-6 用于配置 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.20(rw,sync,root_squash)
在 NFS 服务的配置文件中巧用通配符能够实现很多便捷功能,比如匹配 IP 地址就有 3 种方法:第一种是直接写* 号,代表任何主机都可以访问;第二种则是实验中采用的192.168.10.通配符格式,代表来自 192.168.10.0/24 网段的主机可以访问;第三种则是直接写对方的 IP 地址,如 192.168.10.20,代表仅允许某个主机进行访问。
第 5 步:启动和启用 NFS 服务程序。由于在使用 NFS 服务进行文件共享之前,需要使用 RPC(Remote Procedure Call,远程过程调用)服务将 NFS 服务器的IP 地址和端口号等信息发送给客户端。因此,在启动 NFS 服务之前,还需要顺带重启并启用 rpcbind 服务程序, 并将这两个服务一并加入开机启动项中。
root@linuxprobe:~# systemctl restart rpcbind
root@linuxprobe:~# systemctl enable rpcbind
root@linuxprobe:~# systemctl restart 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-7,其输出格式为“共享的目录名称 允许使用客户端地址”。
表 12-7 showmount 命令中可用的参数以及作用
参数 | 作用 |
---|---|
-e | 显示 NFS 服务器的共享列表 |
-a | 显示所有已挂载 NFS 的客户端主机名和挂载点 |
-v | 显示版本号 |
执行如下命令,安装客户端工具:
root@linuxprobe:~# dnf install showmount
Updating Subscription Management repositories.
BaseOS 2.7 MB/s | 2.7 kB 00:00
AppStream 2.7 MB/s | 2.8 kB 00:00
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
nfs-utils x86_64 1:2.7.1-1.el10 BaseOS 481 k
Installing dependencies:
gssproxy x86_64 0.9.2-7.el10 BaseOS 122 k
keyutils x86_64 1.6.3-4.el10 BaseOS 80 k
libev x86_64 4.33-12.el10 BaseOS 56 k
libnfsidmap x86_64 1:2.7.1-1.el10 BaseOS 67 k
libverto-libev x86_64 0.3.2-9.el10 BaseOS 15 k
rpcbind x86_64 1.2.7-2.el10 BaseOS 62 k
sssd-nfs-idmap x86_64 2.10.0~beta2-3.el10 BaseOS 34 k
………………省略部分输出信息………………
Installed:
gssproxy-0.9.2-7.el10.x86_64 keyutils-1.6.3-4.el10.x86_64
libev-4.33-12.el10.x86_64 libnfsidmap-1:2.7.1-1.el10.x86_64
libverto-libev-0.3.2-9.el10.x86_64 nfs-utils-1:2.7.1-1.el10.x86_64
rpcbind-1.2.7-2.el10.x86_64 sssd-nfs-idmap-2.10.0~beta2-3.el10.x86_64
Complete!
然后查看服务器上的共享目录信息:
root@linuxprobe:~# showmount -e 192.168.10.10
Export list for 192.168.10.10:
/nfsfile 192.168.10.20
最后,在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
/dev/mapper/rhel-root 17G 3.8G 13G 23% /
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 1.9G 84K 1.9G 1% /dev/shm
efivarfs 256K 56K 196K 23% /sys/firmware/efi/efivars
tmpfs 776M 9.7M 767M 2% /run
tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-journald.service
/dev/sda2 960M 272M 689M 29% /boot
/dev/sr0 6.5G 6.5G 0 100% /media/cdrom
/dev/sda1 599M 8.3M 591M 2% /boot/efi
tmpfs 388M 124K 388M 1% /run/user/0
192.168.10.10:/nfsfile 17G 3.7G 13G 23% /nfsfile
挂载成功后就应该能够顺利地看到在执行前面的操作时写入的文件内容了。
root@linuxprobe:~# cat /nfsfile/readme
welcome to linuxprobe.com
如果希望 NFS 文件共享服务能一直有效,则需要将其写入 fstab 文件中:
#
# /etc/fstab
# Created by anaconda on Wed Mar 12 20:08:04 2025
#
# 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.
#
UUID=016bb74f-bfa8-4d80-aa6d-d5693c39a844 / xfs defaults 0 0
UUID=c34124dd-c66e-4cbe-ba04-528666d30dc0 /boot xfs defaults 0 0
UUID=9A1A-B195 /boot/efi vfat umask=0077,shortname=winnt 0 2
UUID=299dacfd-f999-48d8-bca4-e5274ac600a8 none 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.
Last metadata expiration check: 0:12:01 ago on Tue 25 Mar 2025 11:37:58 PM CST.
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
autofs x86_64 1:5.1.9-10.el10 BaseOS 395 k
Installing dependencies:
libsss_autofs x86_64 2.10.0~beta2-3.el10 BaseOS 36 k
………………省略部分输出信息………………
Installed:
autofs-1:5.1.9-10.el10.x86_64 libsss_autofs-2.10.0~beta2-3.el10.x86_64
Complete!
处于生产环境中的 Linux 服务器,一般会同时管理许多设备的挂载操作。如果把这些设备的挂载信息都写入 autofs 服务的主配置文件中,无疑会让主配置文件变得臃肿,这不仅会拖慢 autofs 服务的响应速度,还会使主配置文件的可读性变差,给后续的修改和维护工作带来极大不便。因此,在 autofs 服务程序的主配置文件中,需要按照“挂载目录 子配置文件”的格式进行填写。挂载目录是设备挂载位置的上一级目录。例如,光盘设备一般挂载到/media/cdrom 目录中,那么挂载目录写成/media 即可。对应的子配置文件则对这个挂载目录内的挂载设备信息作进一步说明。子配置文件需要用户自行定义,文件名字没有严格要求,但后缀建议以.misc 结束。具体的配置参数如第 7 行所示。
root@linuxprobe:~# vim /etc/auto.master
1 #
2 # Sample auto.master file
3 # This is a 'master' automounter map and it has the following format:
4 # mount-point [map-type[,format]:]map [options]
5 # For details of the format look at auto.master(5).
6 #
7 /media /etc/iso.misc
8 /misc /etc/auto.misc
9 #
10 # NOTE: mounts done from a hosts map will be mounted with the
11 # "nosuid" and "nodev" options unless the "suid" and "dev"
12 # options are explicitly given.
13 #
14 /net -hosts
15 #
16 # Include /etc/auto.master.d/*.autofs
17 # To add an extra map using this mechanism you will need to add
18 # two configuration items - one /etc/auto.master.d/extra.autofs file
19 # (using the same line format as the auto.master file)
20 # and a separate mount map (e.g. /etc/auto.extra or an auto.extra NIS map)
21 # that is referred to by the extra.autofs file.
22 #
23 +dir:/etc/auto.master.d
24 #
25 # If you have fedfs set up and the related binaries, either
26 # built as part of autofs or installed from another package,
27 # uncomment this line to use the fedfs program map to access
28 # your fedfs mounts.
29 #/nfs4 /usr/sbin/fedfs-map-nfs4 nobind
30 #
31 # Include central master map if it can be found using
32 # nsswitch sources.
33 #
34 # Note that if there are entries for /net or /misc (as
35 # above) in the included master map any keys that are the
36 # same will not be seen as the first read key seen takes
37 # precedence.
38 #
39 +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
/dev/mapper/rhel-root 17G 3.8G 13G 23% /
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 1.9G 84K 1.9G 1% /dev/shm
efivarfs 256K 56K 196K 23% /sys/firmware/efi/efivars
tmpfs 776M 9.7M 767M 2% /run
tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-journald.service
/dev/sda2 960M 272M 689M 29% /boot
/dev/sda1 599M 8.3M 591M 2% /boot/efi
tmpfs 388M 128K 388M 1% /run/user/0
root@linuxprobe:~# cd /media
root@linuxprobe:/media# ls
root@linuxprobe:/media#
但是,我们却可以使用 cd 命令切换到这个 iso 子目录中,而且光盘设备会被立即自动挂载上,然后也就能顺利查看光盘内的内容了。
root@linuxprobe:/media# cd iso
root@linuxprobe:/media/iso# ls
AppStream EFI GPL RPM-GPG-KEY-redhat-beta
BaseOS EULA images RPM-GPG-KEY-redhat-release
boot extra_files.json media.repo
root@linuxprobe:/media/iso# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 17G 3.8G 13G 23% /
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 1.9G 84K 1.9G 1% /dev/shm
efivarfs 256K 56K 196K 23% /sys/firmware/efi/efivars
tmpfs 776M 9.7M 767M 2% /run
tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-journald.service
/dev/sda2 960M 272M 689M 29% /boot
/dev/sr0 6.5G 6.5G 0 100% /media/iso
/dev/sda1 599M 8.3M 591M 2% /boot/efi
tmpfs 388M 128K 388M 1% /run/user/0
Tips :
咦?怎么光盘设备的名称变成了/dev/sr0 呢?实际上它是/dev/cdrom 的快捷方式,只是名称不同而已。root@linuxprobe:~# ls -l /dev/cdrom
lrwxrwxrwx. 1 root root 3 Mar 13 04:06 /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 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:/misc/nfsfile# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 17G 3.8G 13G 23% /
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 1.9G 84K 1.9G 1% /dev/shm
efivarfs 256K 56K 196K 23% /sys/firmware/efi/efivars
tmpfs 776M 9.7M 767M 2% /run
tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-journald.service
/dev/sda2 960M 272M 689M 29% /boot
/dev/sr0 6.5G 6.5G 0 100% /media/cdrom
/dev/sda1 599M 8.3M 591M 2% /boot/efi
tmpfs 388M 124K 388M 1% /run/user/0
192.168.10.10:/nfsfile 17G 3.8G 13G 23% /misc/nfsfile
真棒!又学习到了一个全新的技能。有了 autofs 服务,我们的工作变得更加便捷,也就不用总想着挂载设备的问题了,它会帮我们自动完成。
稍作休息,准备继续前进!
复习题
-
要想实现Linux 系统与 Windows 系统之间的文件共享,能否使用NFS 服务?
答:不可以,应该使用 Samba 服务程序,NFS 服务仅能实现 Linux 系统之间的文件共享。
-
用于管理Samba 服务程序的独立账户信息数据库的命令是什么?
答:pdbedit 命令。
-
简述在 Windows 系统中使用 Samba 服务程序共享资源的方法。
答:在Windows 的“运行”命令框中按照\192.168.10.10 的格式输入访问命令并按回车键即可。
-
简述在 Linux 系统中使用Samba 服务程序共享资源的方法。
答:首先应创建密码验证文件以及挂载目录,然后把挂载信息写入/etc/fstab 文件中, 最后执行 mount -a 命令挂载使用。
-
如果Linux 系统默认没有安装NFS 服务程序,则需要安装什么软件包?
答:NFS 服务程序的软件包名字为 nfs-utils,因此执行 yum install nfs-utils命令即可。
-
在使用 NFS 服务共享资源时,若希望无论 NFS 客户端使用什么账户访问共享资源,都会被映射为本地匿名用户,则需要添加哪个参数?
答:需要添加all_squash 参数,这可以更好地保证服务器的安全。
-
客户端在查看远程NFS 服务器上的共享资源列表时,需要使用哪个命令?
答:使用 showmount 命令即可看到 NFS 服务器上的资源共享情况。
-
简述autofs 服务程序的作用。
答:可以实现动态灵活的设备挂载操作,而且只有检测到用户试图访问一个尚未挂载的文件系统时,才自动挂载该文件系统。
-
autofs 服务的主配置文件在哪里?
答:位于/etc/auto.master。
-
autofs 服务的子配置文件的后缀是什么?
答:建议后缀使用.misc,但实测用其他后缀也没有影响。