Warning: Invalid argument supplied for foreach() in /www/wwwroot/edu729/wp-content/plugins/learnpress/inc/class-lp-assets.php on line 180
首页 - 所有文章 - wordpress - 正文

NFS最佳实践

Network File System(NFS) 是操作系统通过网络共享文件夹和文件的服务。NFS客户端通过挂载(mount)的方式将NFS服务端的共享文件夹挂载到自己的操作系统上,NFS客户端上的用户和程序就能像访问本地磁盘内容一样访问NFS服务端所共享的文件夹。和NFS功能类似的还有samba服务。

NFS可以提供以下好处:

  1. 众多客户端通过共享一个文件夹从而节约空间。例如NFS服务端有一部电影,那么所有NFS客户端都可以读取这部电影,而不用存一份电影到本地磁盘。
  2. 同一个用户的home文件夹可以在不同的计算机上共享。例如,一个用户有多台个人电脑,那么可以通过共享home文件夹,从而实现在多台电脑上操作同一份数据。
  3. 不同的存储设备(例如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/24IP段,可以这样设置:

/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中只用配置local1local2就可以了。

/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/shareNFS目录到该文件夹上。

完成上述配置后,重启autofs服务。

systemctl restart autofs

配置完成后,需要使用ls /mnt/localcd /mnt/local才能激活autofs的自动挂载动作。

3 小结

NFS服务搭建需要注意的点如下。

  • 服务端安装后,注意要设置开机启动。在配置时注意压缩所有用户权限。配置后用exportfs -arv命令加载配置。
  • 客户端安装后,还需要使用autofs来挂载,autofs需要设置开机启动。如果有可能,尽可能设置访问超时时间,这样可以增加磁盘使用寿命。
  • 使用autofs后,注意需要使用ls或cd命令才能激活自动挂载。