118. NFS(Network File System)¶
NFS网络文件系统,可以使不同系统之间共享文件或者目录。 带来的好处, 每台主机消耗更少的硬盘空间,因为可以通过过NFS共享同一个文件。操作远程目录就像在本地一样方便。
118.1. 安装¶
# ubuntu服务端
apt install nfs-kernel-server
# ubuntu客户端
apt install nfs-common
redhat官方教程
yum install nfs-utils
118.2. 配置¶
配置共享文件路径,配置文件是
/etc/exports
参考内容:
[root@readhat76 ~]# cat /etc/exports
/ubuntu *(ro,sync,no_root_squash)
/home *(rw,sync,no_root_squash)
/root/nfs-test-dir *(rw,sync,no_root_squash)
修改配置文件后,可能需要执行命令以使配置文件生效
exportfs -r
118.3. 重启服务¶
# redhat
systemctl restart nfs-server
# ubuntu
systemctl start nfs-kernel-server.service
118.4. 查看共享¶
showmount -e ip
# 在服务端使用showmount查看是否exports成功
showmount -e localhost
可以使用systemctl查看服务的名字。
注意redhat需要关闭防火墙或者配置防火墙之后才才可以mount
注意redhat需要关闭防火墙或者配置防火墙之后才才可以mount
注意redhat需要关闭防火墙或者配置防火墙之后才才可以mount
118.5. 挂载¶
在客户端挂载
mount -o vers=3 192.168.1.227:/root/nfs-test-dir ./1620-mount-point/
# -o 表示option
# vers=3 表示NFSv3
# 192.168.1.227:/root/nfs-test-di 表示挂载服务器下,由前面exports指定的目录
# ./1620-mount-point/ 表示本机目录,在本机目录上的操作等同于操作远程目录
在客户端卸载
umount /root/1620-mount-point/
#如果出现 umount.nfs: /root/1620-mount-point: device is busy,可以使用-f选项
umount -f /root/1620-mount-point/
118.6. 查看nfs服务¶
pi@raspberrypi:/usr/lib/systemd/system $ rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 55205 mountd
100005 1 tcp 52029 mountd
100005 2 udp 54228 mountd
100005 2 tcp 42297 mountd
100005 3 udp 45438 mountd
100005 3 tcp 56119 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049
100021 1 udp 46797 nlockmgr
100021 3 udp 46797 nlockmgr
100021 4 udp 46797 nlockmgr
100021 1 tcp 42021 nlockmgr
100021 3 tcp 42021 nlockmgr
100021 4 tcp 42021 nlockmgr
118.6.1. 设置静态端口¶
有时候希望nfs服务能运行在指定端口,可以观察到原来使用的端口号如下:
pi@raspberrypi:/etc/default $ rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 41487 mountd
100005 1 tcp 41073 mountd
100005 2 udp 53337 mountd
100005 2 tcp 43843 mountd
100005 3 udp 59561 mountd
100005 3 tcp 37855 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049
100021 1 udp 47977 nlockmgr
100021 3 udp 47977 nlockmgr
100021 4 udp 47977 nlockmgr
100021 1 tcp 41839 nlockmgr
100021 3 tcp 41839 nlockmgr
100021 4 tcp 41839 nlockmgr
ubuntu或者树莓派,请参考debian的教程:https://wiki.debian.org/SecuringNFS
设置完之后的效果
pi@raspberrypi:/media/pi $ rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 4002 mountd
100005 1 tcp 4002 mountd
100005 2 udp 4002 mountd
100005 2 tcp 4002 mountd
100005 3 udp 4002 mountd
100005 3 tcp 4002 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049
100021 1 udp 32768 nlockmgr
100021 3 udp 32768 nlockmgr
100021 4 udp 32768 nlockmgr
100021 1 tcp 32768 nlockmgr
100021 3 tcp 32768 nlockmgr
100021 4 tcp 32768 nlockmgr
118.6.2. 只启用NFSv4¶
有时候希望只启用NFSv4
vim /etc/default/nfs-kernel-server
#修改
RPCMOUNTDOPTS="--manage-gids"
#变为
RPCMOUNTDOPTS="--manage-gids -N 2 -N 3"
#重启服务
sudo systemctl restart nfs-kernel-server
设置之后在客户端可以观察到只有v4成功
ubuntu@ubuntu:~$ sudo mount -t nfs -o vers=3 192.168.1.201:/home/me/syncfile dir_name
mount.nfs: requested NFS version or transport protocol is not supported
ubuntu@ubuntu:~$ sudo mount -t nfs -o vers=2 192.168.1.201:/home/me/syncfile dir_name
mount.nfs: Protocol not supported
ubuntu@ubuntu:~$ sudo mount -t nfs -o vers=4 192.168.1.201:/home/me/syncfile dir_name
118.6.3. 问题1 Stale file handle¶
[root@redhat76 fio-test-dir]# rm config-bash: cannot create temp file for here-document: Stale file handle
^C
可能原因有多个,我遇到的情况是因为在之前使用
mount -t nfs -ver=3 locahost:/roo/test-dir /tmp
然后没有卸载,导致系统认为/tmp满了,解决办法是
umount /tmp