Linux系统中,NFS(Network File System)网络文件系统允许客户端通过网络挂载远程服务器上的文件系统。
在这篇博客中,我们将深入探讨 NFS(网络文件系统)及其在 Linux 环境中的实际应用。通过四个实验,帮助您全面了解 NFS 的安装、配置和使用,适合所有希望学习文件共享的用户。
一、环境准备
假设我们有两台机器:
- NFS服务器:
nfs-server.example.com
(IP: 192.168.220.80) - NFS客户端:
nfs-client.example.com
(IP: 192.168.220.123)
实验 1:一般的操作
1.1安装NFS服务器软件包
1.1.1如果不知道具体的名称,我们可以先搜索一下需要安装软件的具体名称是什么:
[root@server ~]# yum search nfs
1.1.2然后下载刚刚搜索出来的:nfs-utils.x86_64:
[root@server ~]# yum install nfs-utils.x86_64
1.1.3我这里提醒我已经安装好了的,没有需要安装的内容。
1.2 启动 NFS 服务
1.2.1下载好了之后就启动 NFS 服务:
[root@server ~]# systemctl start nfs-server.service
1.3创建并配置共享目录
1.3.1这里我创建了一个实验用的目录:/div/div1
[root@server ~]# mkdir -p /div/div1
1.3.2修改权限为757:
[root@server ~]# chown 757 /div/div1
- 所有者: 读取、写入、执行
- 组: 读取、执行
- 其他人: 读取、执行、写入
1.4 编辑 NFS 配置文件 /etc/exports
1.4.1新建并编辑/etc/exports.d/Chen.exports
文件,添加共享目录配置:
[root@server ~]# vim /etc/exports.d/Chen.exports
1.4.2vim里面添加以下行:将 /div/div1
目录导出给指定的客户端地址或者一个网段也可以是*表示所有。
/div/div1 192.168.220.0/24(rw,sync)
-
/div/div1
是共享目录的路径。 -
本次实验给出的是一个网段,也可以是台主机或者只用*
表示允许任何主机访问。 -
rw
表示读写权限。 -
sync
确保所有的写操作在返回之前会被写入磁盘。
1.5重新启动NFS服务
[root@server ~]# systemctl restart nfs-server.service
1.6关闭防火墙、导出共享目录
1.6.1运行以下命令来关闭防火墙:
[root@server ~]# systemctl stop firewalld.service
1.6.2运行以下命令来导出共享的 NFS 目录:
[root@server ~]# exportfs -ra
1.7在客户端安装 NFS 客户端
1.7.1在 NFS 客户端上也需要安装 NFS 客户端:
[root@client ~]# yum install nfs-utils
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered with an entitlement server. You can use subscription-manager to register.
Error: There are no enabled repositories in "/etc/yum.repos.d", "/etc/yum/repos.d", "/etc/distro.repos.d".
1.7.2我们发现报错了,提示我们没有仓库,这时候就需要我们去配置一个仓库,如果你懒得写可以把服务器的仓库给拷贝过来,我们接下来进行一个拷贝操作:
[root@client ~]# scp 192.168.220.80:/etc/yum.repos.d/redhat.repo /etc/yum.repos.d/redhat.repo
1.7.3下方代码询问我们是否 要连接服务器那台主机:yes,然后输入服务器主机的密码。就可以看见拷贝完成。
[root@client ~]# scp 192.168.220.80:/etc/yum.repos.d/redhat.repo /etc/yum.repos.d/redhat.repo
The authenticity of host '192.168.220.80 (192.168.220.80)' can't be established.
ED25519 key fingerprint is SHA256:IeAJ+MnUouBCj8SWNMeSwT9PzuvCEtOkq+/1J+a7ToI.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.220.80' (ED25519) to the list of known hosts.
root@192.168.220.80's password:
redhat.repo 100% 477 215.3KB/s 00:00
1.7.4然后我们也可以查看仓库是否成功的被拷贝过来了没有。
[root@client ~]# ll /etc/yum.repos.d
total 4
-rw-r--r--. 1 root root 477 Jan 8 14:17 redhat.repo
[root@client ~]# cat /etc/yum.repos.d/redhat.repo
#
# Certificate-Based Repositories
# Managed by (rhsm) subscription-manager
#
# *** This file is auto-generated. Changes made here will be over-written. ***
# *** Use "subscription-manager repo-override --help" if you wish to make changes. ***
#
# If this file is empty and this system is subscribed consider
# a "yum repolist" to refresh available repos
[appStream]
name=1
baseurl=/mnt/AppStream
enable=1
gpgcheck=0
[app]
nane=2
baseurl=/mnt/BaseOS
enable=1
gpgcheck=0
1.7.5仓库拷贝好了之后我们别忘记了还要挂载一下光盘,提示我们挂载成功了:
[root@client ~]# mount /dev/sr0 /mnt
mount: /mnt: WARNING: source write-protected, mounted read-only.
1.7.6挂载完成时候就可以开始继续安装我们需要的软件了:
[root@client ~]# yum install nfs-utils
1.8重新启动客户端软件
1.8.1和服务器一样,我们安装完成之后就把软件启动一下:
[root@client ~]# systemctl start nfs-utils.service
1.8.2这里还得再启动另外一个服务:rpcbind.service。如果服务器没有启动这个服务也是需要启动一下的:
[root@client ~]# systemctl start rpcbind.service
1.8.3我们查看一下有没有服务器导出来的一个目录,发现有的,就是刚刚创建的/div/div1。
[root@client ~]# showmount -e 192.168.220.80
Export list for 192.168.220.80:
/div/div1 192.168.220.0/24
1.9 挂载 NFS 共享
1.9.1然后我们进行一个挂载操作,假设我们使用/opt
作为挂载点:
[root@client ~]# mount 192.168.220.80:/div/div1 /opt
1.9.2检查挂载的文件系统,确认 NFS 共享已经挂载成功:
df -h
实验 2:指定挂载项
2.1新建文件验证共享
我们查看了/opt下面没有文件或目录,我们尝试给他创建一个文件file1,发现可以成功创建,原因就是我们刚刚给服务器的/div/div1的其他用户权限是可读可写可执行:
[root@client ~]# touch /opt/file1
[root@client ~]# ll /opt
total 0
-rw-r--r--. 1 nobody nobody 0 Jan 8 14:55 file1
通过上述代码我们发现root_squash默认情况下客户端root用户创建的文件的所属用户和组会映射到nobody,如果需要指定一个用户和组需要更改我们的/etc/exports.d/Chen.exports文件,更改为:
/div/div1 192.168.220.0/24(rw,root_squash,anonuid=用户uid,anongid=组uid)
root_squash,anonuid=用户uid,anongid=组uid :客户端root用户映射到指定uid\gid的用户\组
如:root_squash,anonuid=10086,anongid=24578
no_all_squash:客户端的普通用户,默认不做映射。也就是客户端用户的 uid是什么,在服务端uid就是什么。
no_root_squash
在客户端用 root 用户身份进行的所有操作将被视为在 NFS 服务器上的有效 root 用户访问。all_squash,anonuid=1008,anongid=1999 :客户端的普通用户映射到指定uid\gid的用户\组。
记得在每次更改配置完成后,重新启动该服务:systemctl restart nfs-server.service 并使用:
exportfs -ra
命令重新导出 NFS 共享,使更改生效。
实验 3:开机自动挂载
3.1创建一个挂载目录
创建一个目录作为挂载点:bendi_dir
[root@client ~]# mkdir /bendi_dir
3.2 编辑 /etc/fstab
3.2.1为了使 NFS 共享在系统启动时自动挂载,请编辑 /etc/fstab
文件:
[root@client ~]# vim /etc/fstab
并添加新的一行:
192.168.220.80:/div/div1 /bendi_dir nfs defaults 0 0
3.2.1然后先查看挂载,发现挂载在/opt上面
[root@client ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 866M 0 866M 0% /dev/shm
tmpfs 347M 7.2M 340M 3% /run
/dev/mapper/rhel-root 47G 4.7G 42G 10% /
/dev/nvme0n1p2 960M 293M 668M 31% /boot
/dev/nvme0n1p1 599M 7.0M 592M 2% /boot/efi
tmpfs 174M 128K 174M 1% /run/user/0
/dev/sr0 9.9G 9.9G 0 100% /mnt
192.168.220.80:/div/div1 65G 4.8G 60G 8% /opt
3.2.3取消挂载:
[root@client ~]# umount /opt
3.2.4再次查看发现取消挂载已经完成:
[root@client ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 866M 0 866M 0% /dev/shm
tmpfs 347M 7.2M 340M 3% /run
/dev/mapper/rhel-root 47G 4.7G 42G 11% /
/dev/nvme0n1p2 960M 293M 668M 31% /boot
/dev/nvme0n1p1 599M 7.0M 592M 2% /boot/efi
tmpfs 174M 128K 174M 1% /run/user/0
/dev/sr0 9.9G 9.9G 0 100% /mnt
3.2.5 然后我们这里mount -a 一下,确保可以正确挂载,它用于挂载 /etc/fstab
文件中列出的所有文件系统。这个命令通常用于在系统启动时自动挂载所有文件系统,也可以在修改 /etc/fstab
后使用,以确保所有配置的文件系统均被正确挂载。
[root@client ~]# mount -a
[root@client ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 866M 0 866M 0% /dev/shm
tmpfs 347M 7.2M 340M 3% /run
/dev/mapper/rhel-root 47G 4.7G 42G 11% /
/dev/nvme0n1p2 960M 293M 668M 31% /boot
/dev/nvme0n1p1 599M 7.0M 592M 2% /boot/efi
tmpfs 174M 128K 174M 1% /run/user/0
/dev/sr0 9.9G 9.9G 0 100% /mnt
192.168.220.80:/div/div1 65G 4.8G 60G 8% /bendi_dir
3.2.6 再次取消挂载:
[root@client ~]# umount /bendi_dir
3.3验证开机自动挂载
3.3.1 关机重启,看它是否会开机自动挂载:
[root@client ~]# reboot
3.3.2 重新启动后输入:df -h查看挂载情况,发现已经帮我们挂载好了 ,包含 /bendi_dir下的NFS 共享:192.168.220.80:/div/div1 65G 4.8G 60G 8% /bendi_dir
[root@redhat-9 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 866M 0 866M 0% /dev/shm
tmpfs 347M 7.2M 340M 3% /run
/dev/mapper/rhel-root 47G 4.7G 42G 11% /
/dev/nvme0n1p2 960M 293M 668M 31% /boot
/dev/nvme0n1p1 599M 7.0M 592M 2% /boot/efi
192.168.220.80:/div/div1 65G 4.8G 60G 8% /bendi_dir
tmpfs 174M 56K 174M 1% /run/user/42
tmpfs 174M 40K 174M 1% /run/user/0
3.3.3 也可以成功看见里面的内容,所以说是没有问题的
[root@redhat-9 ~]# ll /bendi_dir
total 0
-rw-r--r--. 1 nobody nobody 0 Jan 8 14:55 file1
实验 4:自动挂载
这是在客户机上进行的操作,先取消自动挂载一下:
[root@redhat-9 ~]# umount /bendi_dir
4.1 安装 autofs
4.1.1 我们可以先搜索一下需要安装软件的具体名称是什么:
[root@client ~]# yum search autofs
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered with an entitlement server. You can use subscription-manager to register.
Repository 'app' is missing name in configuration, using id.
Last metadata expiration check: 3:37:22 ago on Wed 08 Jan 2025 02:58:30 PM CST.
============================================== Name Exactly Matched: autofs ===============================================
autofs.x86_64 : A tool for automatically mounting and unmounting filesystems
============================================= Name & Summary Matched: autofs ==============================================
libsss_autofs.x86_64 : A library to allow communication between Autofs and SSSD
4.1.2 然后下载刚刚搜索出来的:autofs.x86_64
[root@client ~]# yun install autofs.x86_64 -y
4.1.3 发现系统报错了,校验码不正确
[root@client ~]# yum install autofs.x86_64 -y
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered with an entitlement server. You can use subscription-manager to register.
Repository 'app' is missing name in configuration, using id.
Last metadata expiration check: 3:40:14 ago on Wed 08 Jan 2025 02:58:30 PM CST.
Dependencies resolved.
===========================================================================================================================
Package Architecture Version Repository Size
===========================================================================================================================
Installing:
autofs x86_64 1:5.1.7-55.el9 app 392 k
Installing dependencies:
libsss_autofs x86_64 2.9.1-2.el9 app 44 k
Transaction Summary
===========================================================================================================================
Install 2 Packages
Total download size: 436 k
Installed size: 1.1 M
Downloading Packages:
Error opening /mnt/BaseOS/Packages/autofs-5.1.7-55.el9.x86_64.rpm: No such file or directory
Package "autofs-1:5.1.7-55.el9.x86_64" from local repository "app" has incorrect checksum
Error opening /mnt/BaseOS/Packages/libsss_autofs-2.9.1-2.el9.x86_64.rpm: No such file or directory
Package "libsss_autofs-2.9.1-2.el9.x86_64" from local repository "app" has incorrect checksum
Error: Some packages from local repository have incorrect checksum
4.1.4为了解决这个问题,我们需要重新挂载一下光盘:
[root@client ~]# ll /mnt
total 0
drwxr-xr-x. 2 root root 6 Jan 8 09:54 hgfs
[root@client ~]# mount /dev/sr0 /mnt
mount: /mnt: WARNING: source write-protected, mounted read-only.
4.1.5 查看一下发现挂载成功了的:
[root@client ~]# ll /mnt
total 44
drwxr-xr-x. 1 root root 2048 Oct 25 2023 AppStream
drwxr-xr-x. 1 root root 2048 Oct 25 2023 BaseOS
drwxrwxr-x. 1 root root 2048 Oct 25 2023 EFI
-r--r--r--. 1 root root 8154 Oct 25 2023 EULA
-r--r--r--. 1 root root 1455 Oct 25 2023 extra_files.json
-r--r--r--. 1 root root 18092 Oct 25 2023 GPL
drwxrwxr-x. 1 root root 2048 Oct 25 2023 images
drwxrwxr-x. 1 root root 2048 Oct 25 2023 isolinux
-r--r--r--. 1 root root 103 Oct 25 2023 media.repo
-r--r--r--. 1 root root 1669 Oct 25 2023 RPM-GPG-KEY-redhat-beta
-r--r--r--. 1 root root 3682 Oct 25 2023 RPM-GPG-KEY-redhat-release
4.1.6 然后继续刚才的安装,发现成功的完成了软件的安装:
[root@client ~]# yum install autofs.x86_64 -y
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered with an entitlement server. You can use subscription-manager to register.
Repository 'app' is missing name in configuration, using id.
Last metadata expiration check: 3:47:28 ago on Wed 08 Jan 2025 02:58:30 PM CST.
Dependencies resolved.
===========================================================================================================================
Package Architecture Version Repository Size
===========================================================================================================================
Installing:
autofs x86_64 1:5.1.7-55.el9 app 392 k
Installing dependencies:
libsss_autofs x86_64 2.9.1-2.el9 app 44 k
Transaction Summary
===========================================================================================================================
Install 2 Packages
Total size: 436 k
Installed size: 1.1 M
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : libsss_autofs-2.9.1-2.el9.x86_64 1/2
Installing : autofs-1:5.1.7-55.el9.x86_64 2/2
Running scriptlet: autofs-1:5.1.7-55.el9.x86_64 2/2
Verifying : autofs-1:5.1.7-55.el9.x86_64 1/2
Verifying : libsss_autofs-2.9.1-2.el9.x86_64 2/2
Installed products updated.
Installed:
autofs-1:5.1.7-55.el9.x86_64 libsss_autofs-2.9.1-2.el9.x86_64
Complete!
4.1.7 安装完成后还是老规矩先启动服务,再检查服务的状态是否是开启,发现服务是active(running)开启状态的:
[root@client ~]# systemctl start autofs.service
[root@client ~]# systemctl status autofs.service
● autofs.service - Automounts filesystems on demand
Loaded: loaded (/usr/lib/systemd/system/autofs.service; disabled; preset: disabled)
Active: active (running) since Wed 2025-01-08 18:47:47 CST; 25s ago
Main PID: 35873 (automount)
Tasks: 6 (limit: 10681)
Memory: 1.8M
CPU: 15ms
CGroup: /system.slice/autofs.service
└─35873 /usr/sbin/automount --systemd-service --dont-check-daemon
Jan 08 18:47:47 redhat-9 systemd[1]: Starting Automounts filesystems on demand...
Jan 08 18:47:47 redhat-9 automount[35873]: setautomntent: lookup(sss): setautomountent: entry for map auto.master not found
Jan 08 18:47:47 redhat-9 automount[35873]: setautomntent: lookup(sss): setautomountent: entry for map auto_master not found
Jan 08 18:47:47 redhat-9 automount[35873]: setautomntent: lookup(sss): setautomountent: entry for map auto.master not found
Jan 08 18:47:47 redhat-9 systemd[1]: Started Automounts filesystems on demand.
4.2 配置 autofs
4.2.1查看刚刚安装的软件在我们系统里面生成了哪些文件:
[root@client ~]# rpm -ql autofs
4.2.1 先修改一下配置文件:/etc/auto.master
[root@client ~]# vim /etc/auto.master
打开后在里面添加一行,内容如下: /nfs_share /etc/auto.misc
4.2.3 更改配置文件:/etc/auto.misc
[root@client ~]# vim /etc/auto.misc
在里面添加一行,添加内容如下:
xixi -fstype=nfs 192.168.220.80:/div/div1
4.2.4 保存退出后就重新启动该服务:
[root@client ~]# systemctl restart autofs.service
4.2.5 我们查看发现现在是还没有挂载的情况:
[root@client ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 866M 0 866M 0% /dev/shm
tmpfs 347M 7.2M 340M 3% /run
/dev/mapper/rhel-root 47G 4.7G 42G 11% /
/dev/nvme0n1p2 960M 293M 668M 31% /boot
/dev/nvme0n1p1 599M 7.0M 592M 2% /boot/efi
tmpfs 174M 56K 174M 1% /run/user/42
tmpfs 174M 40K 174M 1% /run/user/0
/dev/sr0 9.9G 9.9G 0 100% /mnt
4.3验证自动挂载
4.3.1 访问进入到刚刚修改的配置文件的目录下:cd /nfs_share/xixi 可以看见服务器/div/div1下面的文件file1
[root@client ~]# cd /nfs_share/xixi
[root@client /nfs_share/xixi]# ll
total 0
-rw-r--r--. 1 nobody nobody 0 Jan 8 14:55 file1
4.3.2 这个时候我们再查看挂载发现已经成功挂载了: 192.168.220.80:/div/div1 65G 4.8G 60G 8% /nfs_share/xixi
[root@client /nfs_share/xixi]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 866M 0 866M 0% /dev/shm
tmpfs 347M 7.2M 340M 3% /run
/dev/mapper/rhel-root 47G 4.7G 42G 11% /
/dev/nvme0n1p2 960M 293M 668M 31% /boot
/dev/nvme0n1p1 599M 7.0M 592M 2% /boot/efi
tmpfs 174M 56K 174M 1% /run/user/42
tmpfs 174M 40K 174M 1% /run/user/0
/dev/sr0 9.9G 9.9G 0 100% /mnt
192.168.220.80:/div/div1 65G 4.8G 60G 8% /nfs_share/xixi
总结
通过本实验,您学习了如何在 Linux 系统中设置和使用 NFS,包括基本操作、设置挂载选项、自动挂载和使用 autofs
配置自动挂载。NFS 在不同平台之间共享文件非常有效,尤其是在大规模网络环境中。
希望您通过此指南对 NFS 有更深入的理解!如有问题或建议,欢迎在下方留言讨论,我们共同探讨 NFS 的更多应用.