NFS_0">1.NFS
1.1 案例
要设置NFS共享,需要至少两台 Linux/Unix 机器。下面使用两台服务器来演示 NFS 安装、配置及使用。
角色 | IP | 主机名 | 系统 |
---|---|---|---|
服务器 | 192.168.88.113 | nfs-server | RHEL9 |
服务器 | 192.168.88.114 | nfs-client | RHEL9 |
1.2 实现
1.2.1 克隆两台服务器
服务器端和客户端按照同样步骤克隆,只需要修改名字和存放位置即可
单击右键(红色框位置)→ 选择管理 → 克隆
修改名字和位置,点击完成即可
1.2.2 配置仓库
两台虚拟机中都要执行
在nfs-server虚拟机上配置好本地仓库
[root@localhost ~]# vi /etc/yum.repos.d/dnf.repo
[root@localhost ~]# cat /etc/yum.repos.d/dnf.repo
[BaseOS]
name=BaseOS
baseurl=/mnt/BaseOS
gpgcheck=0
[AppStream]
name=AppStream
baseurl=/mnt/AppStream
gpgcheck=0root@localhost ~]# yum repolist
#用于显示已配置的 yum 软件仓库及其状态。
#Repo-id: 仓库的唯一标识符。
#Repo-name: 仓库的名称,通常比ID更具描述性。
#Status: 表示仓库的状态,通常是启用(Enabled)或禁用(Disabled)。
Updating Subscription Management repositories.
Unable to read consumer identityThis system is not registered with an entitlement server. You can use "rhc" or "subscription-manager" to register.repo id repo name
AppStream AppStream
BaseOS BaseOS[root@localhost ~]# mount /dev/sr0 /mnt
mount: /mnt: WARNING: source write-protected, mounted read-only.
[root@localhost ~]# ls /mnt
AppStream EULA images RPM-GPG-KEY-redhat-beta
BaseOS extra_files.json isolinux RPM-GPG-KEY-redhat-release
EFI GPL media.repo
然后将这个仓库复制到nfs-client虚拟机中
[root@localhost ~]# scp /etc/yum.repos.d/dnf.repo root@192.168.88.135:/etc/yum.repos.d/
# scp: 发起安全复制请求的命令,基于SSH协议实现文件的安全传输。
# /etc/yum.repos.d/dnf.repo: 这是要复制的源文件路径。在这个例子中,是从本地机器上的 /etc/yum.repos.d/ 目录复制名为 dnf.repo 的文件。
# root@192.168.88.135: 指定目标主机的信息。
# :/etc/yum.repos.d/: 这是目标路径,表示将文件复制到远程服务器上的 /etc/yum.repos.d/ 目录下。The authenticity of host '192.168.88.135 (192.168.88.135)' can't be established.
ED25519 key fingerprint is SHA256:Rp6b3SoxbEe3x+BcVICF5OXozv2NHqCe6x1Y5ma+r5k.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? y
Please type 'yes', 'no' or the fingerprint: yes
Warning: Permanently added '192.168.88.135' (ED25519) to the list of known hosts.
root@192.168.88.135's password:
dnf.repo 100% 113 41.7KB/s 00:00
1.2.3 安装基本软件且设置主机名
两台系统都要执行
选择查看 → 撰写 → 撰写栏,就可以在撰写栏中输入指令在两台虚拟机中同时执行
[root@localhost ~]# dnf install net-tools wget curl bash-completion vim -y
设置主机名,一台为nfs-server,另一台为nfs-client
[root@localhost ~]# hostnamectl hostname nfs-server
[root@localhost ~]# hostnamectl hostname nfs-client
1.2.4 设置ip
两台虚拟机都要执行,注意ip段要是自己的比如我的是88
# 配置服务器IP
[root@nfs-server ~]# nmcli c modify ens160 ipv4.method manual ipv4.address 192.168.88.113/24 ipv4.dns 223.5.5.5 ipv4.gateway 192.168.88.2 connection.autoconnect yes# nmcli c modify ens160:c 是 connection 的缩写,表示您将要对一个网络连接进行操作。modify ens160 表示您希望修改名称或ID为 ens160 的网络连接配置。
# ipv4.method manual:设置IPv4的配置方法为手动(manual),
# ipv4.address 192.168.88.113/24:指定静态IPv4地址为 192.168.88.113,子网掩码为 /24(即255.255.255.0)。这意味着它位于192.168.88.0这个子网内。
# ipv4.dns 223.5.5.5:配置首选DNS服务器的地址为 223.5.5.5。这是一个公共DNS服务地址,由阿里云提供,用于域名解析。选择这个DNS服务器是因为它能够提供稳定且快速的域名解析服务。
# ipv4.gateway 192.168.88.2:设置默认网关的IP地址为 192.168.88.2。
# connection.autoconnect yes:设置此连接在系统启动时自动连接,确保在网络服务启动时该网络接口能自动获取配置并连接到网络。
[root@nfs-server ~]# nmcli c up ens160 #使用该命令连接端会断掉,需要重新连接
[root@nfs-server ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:37:20:d0 brd ff:ff:ff:ff:ff:ffaltname enp3s0inet 192.168.88.113/24 brd 192.168.88.255 scope global noprefixroute ens160valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe37:20d0/64 scope link noprefixroute valid_lft forever preferred_lft forever# 配置客户端IP
[root@nfs-client ~]# nmcli c modify ens160 ipv4.method manual ipv4.address 192.168.88.114/24 ipv4.dns 223.5.5.5 ipv4.gateway 192.168.88.2 connection.autoconnect yes
[root@nfs-client ~]# nmcli c up ens160
1.2.5 安装nfs服务
在两台系统中都要执行。
要重新挂载
mount /dev/sr0 /mntdnf install nfs-utils -y
1.2.6 启动服务
在两台系统中都要执行。
[root@nfs-server ~]# systemctl enable --now nfs-server
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.#查看服务是否启动成功
[root@nfs-server ~]# systemctl status nfs-server
● nfs-server.service - NFS server and servicesLoaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; preset: disabled)Active: active (exited) since Sun 2025-03-09 11:46:47 CST; 2min 13s agoDocs: man:rpc.nfsd(8)man:exportfs(8)Process: 14283 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)Process: 14284 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)Process: 14303 ExecStart=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl reload >Main PID: 14303 (code=exited, status=0/SUCCESS)CPU: 41msMar 09 11:46:47 nfs-server systemd[1]: Starting NFS server and services...
Mar 09 11:46:47 nfs-server systemd[1]: Finished NFS server and services.# 查看端口
[root@nfs-server ~]# netstat -lntup | grep 2049
#或者ss -lntup | grep 2049
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp6 0 0 :::2049 :::* LISTEN -
[root@nfs-server ~]# netstat -lntup | grep 111
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp6 0 0 :::111 :::* LISTEN 1/systemd
udp 0 0 0.0.0.0:111 0.0.0.0:* 1/systemd
udp6 0 0 :::111 :::* 1/systemd [root@nfs-server ~]# ps -ef |grep nfs
# 用于显示与 NFS(网络文件系统)相关的进程信息
root 856 1 0 11:52 ? 00:00:00 /usr/sbin/nfsdcld
root 1255 2 0 11:52 ? 00:00:00 [nfsd]
root 1256 2 0 11:52 ? 00:00:00 [nfsd]
root 1257 2 0 11:52 ? 00:00:00 [nfsd]
root 1258 2 0 11:52 ? 00:00:00 [nfsd]
root 1259 2 0 11:52 ? 00:00:00 [nfsd]
root 1260 2 0 11:52 ? 00:00:00 [nfsd]
root 1261 2 0 11:52 ? 00:00:00 [nfsd]
root 1262 2 0 11:52 ? 00:00:00 [nfsd]
root 1598 1542 0 12:18 pts/0 00:00:00 grep --color=auto nfs
1.2.7 放行防火墙
在两台系统中都要执行。
[root@nfs-server ~]# firewall-cmd --permanent --add-service=nfs
success
#通过firewall-cmd工具向防火墙规则中永久添加NFS(Network File System,网络文件系统)服务。
[root@nfs-server ~]# firewall-cmd --reload
success
#重新加载防火墙配置的命令,使更改生效。[root@nfs-client ~]# firewall-cmd --permanent --add-service=nfs
success
[root@nfs-client ~]# firewall-cmd --reload
success
验证是否放行成功firewall-cmd --list-all
#未加载防火墙之前
[root@nfs-server ~]# firewall-cmd --list-all#显示当前防火墙配置详细信息
public (active)target: defaulticmp-block-inversion: nointerfaces: ens160sources: services: cockpit dhcpv6-client sshports: protocols: forward: yesmasquerade: noforward-ports: source-ports: icmp-blocks: rich rules: #加载防火墙之后,在services栏多出了nfs
[root@nfs-server ~]# firewall-cmd --list-all
public (active)target: defaulticmp-block-inversion: nointerfaces: ens160sources: services: cockpit dhcpv6-client nfs sshports: protocols: forward: yesmasquerade: noforward-ports: source-ports: icmp-blocks: rich rules:
linux_246">1.2.8 关闭Selinux
在两台系统中都要执行。
[root@nfs-server ~]# getenforce
Enforcing
#查询当前 SELinux 的运行模式。输出结果可能是 Enforcing, Permissive, 或者 Disabled,分别表示 SELinux 正在强制执行安全策略、仅记录违反行为而不阻止它们、或者SELinux 完全未启用。
[root@nfs-server ~]# setenforce 0#临时有效,重启后无效
#参数 0 表示将 SELinux 设置为 Permissive 模式,在 Permissive 模式下,SELinux 不会阻止任何行为,但会记录所有违反其策略的行为。
[root@nfs-server ~]# getenforce
Permissive
未避免重启服务之后无效,要在/etc/selinux/config文件中修改,如下图所示:
#服务器端
[root@nfs-server ~]# vim /etc/selinux/config
#客户端
[root@nfs-client ~]# vim /etc/selinux/config
NFS_270">1.2.9 配置NFS
在NFS服务端完成。
1、首先创建一个用于存储文件目录
[root@nfs-server ~]# mkdir /nfs/data -p
2、将这个目录共享给客户端,编写 /etc/exports 文件,在文件中做如下的配置。
[root@nfs-server ~]# vim /etc/exports
# vim 编辑器打开了位于 /etc/ 目录下的 exports 文件。这个文件用于定义哪些目录可以通过 NFS 共享给其他机器以及设置相关的共享选项。
[root@nfs-server ~]# cat /etc/exports
/nfs/data 192.168.88.114(rw)
#/nfs/data: 这是要通过 NFS 共享的目录路径。在这个例子中,服务器上的 /nfs/data 目录将被共享。
#192.168.88.114: 这是允许访问 NFS 共享资源的客户端的 IP 地址。只有来自这个 IP 地址的请求才会被允许访问共享的目录。
#rw 表示读写权限,意味着指定的客户端既可以读取也可以写入共享目录的数据
3、暴露共享服务
# 配置好后,重启服务
[root@nfs-server ~]# systemctl restart nfs-server
# 然后暴露共享服务
[root@nfs-server ~]# showmount -e 192.168.88.113
Export list for 192.168.88.113:
/nfs/data 192.168.88.114
在客户端完成。
1、创建挂载目录
[root@nfs-client ~]# mkdir /data/nfs -p
2、将创建的目录挂载到服务端的共享目录
[root@nfs-client ~]# mount -t nfs 192.168.88.113:/nfs/data /data/nfs
# mount: 这是 Linux 系统中用于挂载文件系统的命令。
# -t nfs: 这个选项指定了要挂载的文件系统的类型,在这里是指 NFS(Network File System)。它告诉 mount 命令接下来的参数将涉及 NFS 类型的挂载。
# 192.168.88.113:/nfs/data: 这部分指定了 NFS 服务器的 IP 地址和需要挂载的共享目录路径。在这个例子中,192.168.88.113 是 NFS 服务器的地址,/nfs/data 是该服务器上已配置为可共享的目录。
# /data/nfs: 这是本地客户端系统上的一个目录路径,作为挂载点。通过执行这条命令,NFS 服务器上的 /nfs/data 目录将会被挂载到这个位置,使得客户端可以通过访问 /data/nfs 来读取或写入 NFS 服务器上的数据。
3、查看是否挂载成功
[root@nfs-client ~]# df /data/nfs
Filesystem 1K-blocks Used Available Use% Mounted on
192.168.88.113:/nfs/data 46587904 1755648 44832256 4% /data/nfs
# 命令用于显示文件系统的磁盘空间使用情况,特别是针对挂载在 /data/nfs 路径下的文件系统。
1.2.10 功能测试
1.2.10.1 测试客户端读
在服务器端建立1.txt
[root@nfs-server ~]# cd /nfs/data/
[root@nfs-server data]# ls
[root@nfs-server data]# touch 1.txt
在客户端查看是否有1.txt,且有无内容
[root@nfs-client ~]# ls /data/nfs/
1.txt
[root@nfs-client ~]# cat /data/nfs/1.txt在服务器端输入内容
[root@nfs-server data]# echo 1.txt > 1.txt
在客户端查看
[root@nfs-client ~]# cat /data/nfs/1.txt
1.txt
1.2.10.2 测试客户端写
客户端写入晚上好
[root@nfs-client ~]# echo good night > /data/nfs/nihao.txt
-bash: /data/nfs/nihao.txt: Permission denied
-
问题:我们在客户端写数据时,提示没有权限。如何解决呢?
-
- 我们需要给服务端的共享目录设置权限。
[root@nfs-server /]# chmod o+rw /nfs -R
# -R这个选项表示递归地应用更改,即不仅改变指定目录本身的权限,还会对目录下的所有文件和子目录进行同样的权限修改。
[root@nfs-server data]# cd /
[root@nfs-server /]# cd /nfs
[root@nfs-server nfs]# ll -d /nfs
drwxr-xrwx. 3 root root 18 Mar 9 12:45 /nfs
三个为一组 rwx:所属用户的权限(有读、写和执行(搜索)权限);r-w:所属用户组的权限(拥有读和执行权限,但没有写权限),rwx:其他用户权限
在服务端设置好权限后,再在客户端执行如下的代码:
[root@nfs-client ~]# echo good night > /data/nfs/nihao.txt
然后在服务端查看:
[root@nfs-server /]# cd /nfs/data
[root@nfs-server data]# ls
1.txt nihao.txt