NFS文件共享
2. NFS文件共享
NFS 叫网络文件系统,用于多个服务之间进行数据共享。它也是主从架构,需要有服务来暴露共享的目录,然后客户通过挂载的形式与服务进行连接。
要想使用 NFS 功能,服务端和客户端都需要安装 nfs-utils 工具包。
dnf install nfs-utils -y
注意:服务端和客户端都要安装。
2.1 配置服务端
1、创建共享目录
[root@server ~]# mkdir /opt/nfs/data -p
2、将这个目录暴露出去,需要修改 /etc/exports 文件。
[root@server ~]# vim /etc/exports
在文件中添加如下的内容:
/opt/nfs/data 192.168.72.0/24(rw,sync)
[!CAUTION]
这个文件配置需要注意如下几点:
- 每一行代表暴露一个目录
- IP地址可以写成主机名,也可定成IP,还可以写成IP段。多个 IP 之间使用空格分隔
- IP地址和后面的圆括号之间不能有空格。
- 圆括号中都有默认值,但是值与值之间使用逗号分隔且不能有空格。
4、防火墙放行相关服务
# 查看目录放行的服务
[root@server ~]# firewall-cmd --list-service
cockpit dhcpv6-client ntp ssh[root@server ~]# firewall-cmd --permanent --add-service=nfs --add-service=rpc-bind --add-service=mountd
success
[root@server ~]# firewall-cmd --reload
success
[root@server ~]# firewall-cmd --list-services
cockpit dhcpv6-client mountd nfs ntp rpc-bind ssh
5、启动NFS服务
[root@server ~]# systemctl start nfs-server
[root@server ~]# systemctl status nfs-server
● nfs-server.service - NFS server and servicesLoaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; preset: disabled)Active: active (exited) since Wed 2025-10-29 20:36:40 CST; 6s agoDocs: man:rpc.nfsd(8)man:exportfs(8)Process: 13571 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)Process: 13572 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)Process: 13593 ExecStart=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl reload gssproxy ; fi (code=exited>Main PID: 13593 (code=exited, status=0/SUCCESS)CPU: 28msOct 29 20:36:40 server systemd[1]: Starting NFS server and services...
Oct 29 20:36:40 server systemd[1]: Finished NFS server and services.
2.2 配置客户端
1、创建挂载点
[root@client ~]# mkdir /opt/data -p
2、将挂载点与共享目录关联
[root@client ~]# showmount -e 192.168.72.133
Export list for 192.168.72.133:
/opt/nfs/data 192.168.72.0/24# 将共享目录挂载到挂载点
[root@client ~]# mount -t nfs 192.168.72.133:/opt/nfs/data /opt/data
[root@client ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 966M 0 966M 0% /dev/shm
tmpfs 387M 5.7M 381M 2% /run
efivarfs 256K 56K 196K 23% /sys/firmware/efi/efivars
/dev/mapper/rhel-root 65G 1.9G 63G 3% /
/dev/nvme0n1p2 960M 200M 761M 21% /boot
/dev/nvme0n1p1 599M 7.1M 592M 2% /boot/efi
/dev/sr0 12G 12G 0 100% /mnt
/dev/mapper/rhel-home 32G 258M 32G 1% /home
tmpfs 194M 0 194M 0% /run/user/0
192.168.72.133:/opt/nfs/data 65G 1.9G 63G 3% /opt/data
上面是临时挂载,如果要想永久挂载我们可以有两种方式:
修改 /etc/fstab 文件,在文件的最后添加如下内容:
192.168.72.133:/opt/nfs/data /opt/data nfs defaults 0 0添加好后执行 mount -a 测试,如果没有错误信息则表示成功。
第二种方式是安装 autofs 软件,然后再进行配置。
2.3 共享测试
2.3.1 服务端测试
1、在服务端创建文件
[root@server ~]# cd /opt/nfs/data/
[root@server data]# mkdir d1
[root@server data]# touch f1
2、在客户端查看
[root@client ~]# cd /opt/data/
[root@client data]# ls
d1 f1
2.3.2 客户端测试
1、在客户端创建文件
[root@client data]# mkdir d2
mkdir: cannot create directory ‘d2’: Permission denied
[root@client data]# touch f2
touch: cannot touch 'f2': Permission denied
发现不能成功创建!
为了解决这个问题,我们先将服务端的共享目录设置权限为 777:
[root@server data]# ll -d /opt/nfs/data
drwxr-xr-x. 3 root root 26 Oct 29 20:45 /opt/nfs/data
[root@server data]# chmod 777 /opt/nfs/data -R
[root@server data]# ll -d /opt/nfs/data
drwxrwxrwx. 3 root root 26 Oct 29 20:45 /opt/nfs/data
设置好后,我们再在客户端来创建文件:
[root@client data]# mkdir d2
[root@client data]# touch f2
[root@client data]# ll
total 0
drwxrwxrwx. 2 root root 6 Oct 29 20:45 d1
drwxr-xr-x. 2 nobody nobody 6 Oct 29 20:49 d2
-rwxrwxrwx. 1 root root 0 Oct 29 20:45 f1
-rw-r--r--. 1 nobody nobody 0 Oct 29 20:49 f2
可以发现,此时能够创建成功,但是所创建的文件的所有者和所属组都是 nobody,这个用户从哪里来的?
[root@client data]# grep nobody /etc/passwd
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
可以发现这个用户是一个系统用户,但是这个用户不能进行登录。而我们前面讲过,系统用户的 UID 范围在 201 ~ 999,普通用户的 UID 范围在 1000 ~ 60000 之间,而这个用户的 UID 不在这两个范围之内。所以它是一个非常特殊的用户。
因此,我们可以将服务端的共享目录的所有者和所属组设置为 nobody,而不要设置 777。
[root@server data]# chmod u=rwx,g=rx,o=rx /opt/nfs/data
[root@server data]# ll -d /opt/nfs/data
drwxr-xr-x. 4 root root 46 Oct 29 20:49 /opt/nfs/data
[root@server data]# chown -R nobody: /opt/nfs/data
[root@server data]# ll -d /opt/nfs/data
drwxr-xr-x. 4 nobody nobody 46 Oct 29 20:49 /opt/nfs/data
设置好后,我们再次通过客户端来测试。
[root@client data]# mkdir d3
[root@client data]# touch f3
[root@client data]# echo hello > f1
[root@client data]# cat f1
hello
2.4 查看服务相关端口
[root@server data]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 13570/rpc.mountd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:46127 0.0.0.0:* LISTEN 13566/rpc.statd
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 941/sshd: /usr/sbin
tcp 0 0 0.0.0.0:35239 0.0.0.0:* LISTEN -
tcp6 0 0 :::20048 :::* LISTEN 13570/rpc.mountd
tcp6 0 0 :::35783 :::* LISTEN -
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 :::2049 :::* LISTEN -
tcp6 0 0 :::22 :::* LISTEN 941/sshd: /usr/sbin
tcp6 0 0 :::42425 :::* LISTEN 13566/rpc.statd
udp 0 0 127.0.0.1:323 0.0.0.0:* 1641/chronyd
udp 0 0 0.0.0.0:47591 0.0.0.0:* -
udp 0 0 0.0.0.0:20048 0.0.0.0:* 13570/rpc.mountd
udp 0 0 0.0.0.0:37698 0.0.0.0:* 13566/rpc.statd
udp 0 0 127.0.0.1:1023 0.0.0.0:* 13566/rpc.statd
udp 0 0 0.0.0.0:111 0.0.0.0:* 1/systemd
udp 0 0 0.0.0.0:123 0.0.0.0:* 1641/chronyd
udp6 0 0 ::1:323 :::* 1641/chronyd
udp6 0 0 :::60877 :::* 13566/rpc.statd
udp6 0 0 :::20048 :::* 13570/rpc.mountd
udp6 0 0 :::51236 :::* -
udp6 0 0 :::111 :::* 1/systemd
或者使用如下命令:
[root@server data]# ss -lntup
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:* users:(("chronyd",pid=1641,fd=5))
udp UNCONN 0 0 0.0.0.0:47591 0.0.0.0:*
udp UNCONN 0 0 0.0.0.0:20048 0.0.0.0:* users:(("rpc.mountd",pid=13570,fd=4))
udp UNCONN 0 0 0.0.0.0:37698 0.0.0.0:* users:(("rpc.statd",pid=13566,fd=8))
udp UNCONN 0 0 127.0.0.1:1023 0.0.0.0:* users:(("rpc.statd",pid=13566,fd=7))
udp UNCONN 0 0 0.0.0.0:111 0.0.0.0:* users:(("rpcbind",pid=13564,fd=5),("systemd",pid=1,fd=77))
udp UNCONN 0 0 0.0.0.0:123 0.0.0.0:* users:(("chronyd",pid=1641,fd=7))
udp UNCONN 0 0 [::1]:323 [::]:* users:(("chronyd",pid=1641,fd=6))
udp UNCONN 0 0 [::]:60877 [::]:* users:(("rpc.statd",pid=13566,fd=10))
udp UNCONN 0 0 [::]:20048 [::]:* users:(("rpc.mountd",pid=13570,fd=6))
udp UNCONN 0 0 [::]:51236 [::]:*
udp UNCONN 0 0 [::]:111 [::]:* users:(("rpcbind",pid=13564,fd=7),("systemd",pid=1,fd=79))
tcp LISTEN 0 4096 0.0.0.0:20048 0.0.0.0:* users:(("rpc.mountd",pid=13570,fd=5))
tcp LISTEN 0 4096 0.0.0.0:111 0.0.0.0:* users:(("rpcbind",pid=13564,fd=4),("systemd",pid=1,fd=76))
tcp LISTEN 0 4096 0.0.0.0:46127 0.0.0.0:* users:(("rpc.statd",pid=13566,fd=9))
tcp LISTEN 0 64 0.0.0.0:2049 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=941,fd=3))
tcp LISTEN 0 64 0.0.0.0:35239 0.0.0.0:*
tcp LISTEN 0 4096 [::]:20048 [::]:* users:(("rpc.mountd",pid=13570,fd=7))
tcp LISTEN 0 64 [::]:35783 [::]:*
tcp LISTEN 0 4096 [::]:111 [::]:* users:(("rpcbind",pid=13564,fd=6),("systemd",pid=1,fd=78))
tcp LISTEN 0 64 [::]:2049 [::]:*
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=941,fd=4))
tcp LISTEN 0 4096 [::]:42425 [::]:* users:(("rpc.statd",pid=13566,fd=11))
