NFS最佳实践
Network File System(NFS) 是操作系统通过网络共享文件夹和文件的服务。NFS客户端通过挂载(mount)的方式将NFS服务端的共享文件夹挂载到自己的操作系统上,NFS客户端上的用户和程序就能像访问本地磁盘内容一样访问NFS服务端所共享的文件夹。和NFS功能类似的还有samba服务。
NFS可以提供以下好处:
- 众多客户端通过共享一个文件夹从而节约空间。例如NFS服务端有一部电影,那么所有NFS客户端都可以读取这部电影,而不用存一份电影到本地磁盘。
- 同一个用户的home文件夹可以在不同的计算机上共享。例如,一个用户有多台个人电脑,那么可以通过共享home文件夹,从而实现在多台电脑上操作同一份数据。
- 不同的存储设备(例如U盘、光盘)可以通过网络共享给其他计算机,这样就不用频繁移动这些存储设备。
0 场景
现有linux server一台IP:192.168.10.103。linux desktop一台IP:192.168.10.102。
现在准备在server上共享目录/mnt/share
,在desktop上将server共享目录挂载到本地目录/mnt/local
。
1 服务端配置
1.1 安装
// ubuntu/debian
apt install nfs-kernel-server rpcbind nfs-common
// centos
yum install nfs-utils rpcbind
安装完成后,建议配置成开机自动启动:
// ubuntu/debian
systemctl enable rpcbind
systemctl enable nfs-kernel-server
// centos
systemctl enable rpcbind
systemctl enable nfs
1.2 配置文件
当安装完nfs服务端程序后,可以通过编辑/etc/exports
文件来配置共享的目录。
配置的格式是:共享的目录 主机名或IP或IP段(参数,参数)
其中参数是可选的,当不指定参数时,NFS将使用默认选项:sync,ro,root_squash,no_delay。
常见参数:
- ro readonly共享目录只读
- rw readwrite共享目录可读可写
- sync 客户端对数据的写会同步写入到磁盘,效率低,但可以保证数据一致性
- async 数据会先写入到内存,必要时才写入磁盘,效率高。但不建议使用,有丢数据风险
- secure NFS通过1024以下的TCP/IP端口收发数据
- insecure NFS通过1024以上的端口收发数据
- wdelay 如果多个客户端要进行写操作,则将这些操作集中执行。对于有多个客户端写的场景,可以提高效率。
- no_wdelay 如果多个客户端要进行写操作,则每个客户端会立即写入。当使用async时,该设置无效。
- hide 不共享目录中的子目录
- no_hide 共享NFS目录的子目录(默认)
- subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
- no_subtree_check 和上面相对,不检查父目录权限
- all_squash 用户权限压缩,不管客户端访问用户的身份是什么,在NFS共享目录中的操作用户都会变成nfsnobody,UID=65534,适合目录共享给多个客户端
- no_all_squash 用户权限不压缩,客户端的UID和GID对共享目录生效(默认)
- root_squash root权限压缩,root用户的所有请求映射成如anonymous用户一样的权限 (默认)
- no_root_squash root权限不压缩,root用户对共享目录具有root权限
- anonuid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的UID
- anongid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的GID
当主机名或IP为空时,则代表共享给任意客户机。
将同一目录共享给不同客户机,但需要设置不同权限时,可以这样设置:
共享的目录 主机名或IP或IP段(参数,参数) 主机名或IP或IP段(参数,参数)
这里假设我们要将/mnt/share
目录共享给192.168.10.0/24
IP段,可以这样设置:
/mnt/share 192.168.10.0/24(rw,sync,all_squash,root_squash)
1.3 配置加载
当配置完成后,需要让NFS重新加载配置文件,可以使用exportfs
命令。
exportfs命令
- -a 全部挂载或者全部卸载
- -r 重新挂载
- -u 卸载某一个目录
- -v 显示共享目录
exportfs -arv
1.4 配置确认
当设置并重新加载配置文件后,可以使用showmount -e
确定配置是否生效。
shoumount命令
- -a或--all : 以 host:dir 这样的格式来显示客户主机名和挂载点目录。
- -d或--directories : 仅显示被客户挂载的目录名。
- -e或--exports : 显示NFS服务器的输出清单。
- -h或--help : 显示帮助信息。
- -v或--version : 显示版本信。
- --no-headers : 禁止输出描述头部信息。
showmount -e
或
showmount -e localhost
2 客户端配置
2.1 安装
当NFS服务端配置完成后,就可以在客户端进行操作了。
// ubuntu/debian
apt install nfs-common
// centos
yum install nfs-utils
2.2 服务查询
我们可以使用showmount
命令查看目前可用的NFS服务端列表。
showmount -e 192.168.10.103
2.3 挂载
2.3.1 手动挂载
找到共享的目录后,使用mount命令挂载目录到本地。
mount -t nfs 192.168.10.103:/mnt/share /mnt/local
挂载完成后,使用df -h
命令查看挂载情况
最后,可以使用umount /mnt/local
卸载已经挂载的目录。
2.3.2 fstab挂载
如果需要开机挂载nfs目录,不建议使用修改/etc/fstab
来实现开机挂载。这样做不仅会导致开机速度变慢,并且也不会挂载成功。
具体原因是开机时,系统还没有完成network服务启动,所以nfs服务不能正常使用。
2.3.3 rc.local挂载
使用/etc/rc.d/rc.local
可以解决上述问题:
sleep 5;mount -t nfs 192.168.10.103:/mnt/share /mnt/local
2.3.4 autofs挂载(推荐)
autofs是一个可以根据需要自动挂载目录的工具。它会在用户或程序尝试访问需要挂载的目录时,自动挂载目录。
安装
// ubuntu/debian
apt install autofs
// centos
yum install autofs
设置开机启动
systemctl enable autofs
安装完成后,修改/etc/auto.master
文件:
/mnt /etc/auto.nfs --timeout=60
其中/mnt
是要挂载的本地目录的父目录,例如需要挂载/mnt/local1
和/mnt/local2
,如果在这里配置了/mnt
,则在/etc/auto.nfs
中只用配置local1
和local2
就可以了。
/etc/auto.nfs
是NSF挂载配置文件。
--timeout=60
是指在多少秒没有访问后,自动卸载。
接下来配置/etc/auto.nfs
:
local -fstype=nfs,rw 192.168.10.101:/mnt/share
他的含义是,如果用户或程序试图访问/mnt/local
文件夹,就自动挂载192.168.10.101:/mnt/share
NFS目录到该文件夹上。
完成上述配置后,重启autofs
服务。
systemctl restart autofs
配置完成后,需要使用ls /mnt/local
或cd /mnt/local
才能激活autofs
的自动挂载动作。
3 小结
NFS服务搭建需要注意的点如下。
- 服务端安装后,注意要设置开机启动。在配置时注意压缩所有用户权限。配置后用
exportfs -arv
命令加载配置。 - 客户端安装后,还需要使用
autofs
来挂载,autofs
需要设置开机启动。如果有可能,尽可能设置访问超时时间,这样可以增加磁盘使用寿命。 - 使用autofs后,注意需要使用ls或cd命令才能激活自动挂载。