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命令才能激活自动挂载。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • jQuery设置checked标签后但是不显示勾选

    当使用jQuery的attr(attr,value)给<input type='checkbox'/> 赋值checked时,查看代码已经复制了,但是页面上却不...

    zhangheng
  • Mapped Statements collection does not contain

    Mapped Statements collection does not contain value for后面是什么类什么方法之类的 错误原因

    zhangheng
  • 使用mailx发送邮件

    如何在linux系统中,使用命令行发送邮件?又或是使用简单的命令来发送邮件?linux系统中提供了名为mailx的程序,能帮助我们实现在命令行里发送邮件。

    zhangheng
  • 青铜到王者 ,快速提升你 Go语言的段位! "狗"语言实战(一)-介绍1 导读

    JavaEdge
  • 【DB笔试面试265】在Oracle中,SYS登录报权限不足(ORA-01031: Insufficient)的常见原因有哪些?

    在Oracle中,SYS用户登录报权限不足(ORA-01031: Insufficient Privileges)的常见原因有哪些?

    小麦苗DBA宝典
  • cocos creator的box2d

    本来是打算和前面一篇混在一起的,后来想了下,两个完全不相干的主题,放在一起不好,而且既然我的文章产出率这么低,不如拆成2篇,混一混更新频率…… 首先就是,coc...

    沙因Sign
  • NFS存储服务部署

    什么是NFS 中文意思是网络文件系统,主要功能是通过网络(一般是局域网)让不同主机之间可以共享文件或目录 NFS属于本地文件存储服务  缺点1: windows...

    863987322
  • k8s1.5.4挂载volume之nfs

    /usr/local/kubernetes/examples/volumes/nfs

    三杯水Plus
  • 产品资讯|传说中的人脸识别签到来啦

    腾讯智能会议签到系统是腾讯优图基于世界领先的人脸识别技术推出的一整套会议签到解决方案。会议现场只需要刷一下脸,无需更多繁琐步骤,即可完整签到,方便、快捷、准确。

    优图实验室
  • php使用tcp长连接的一种优化思路

    一、面向人群 如果站点架构满足以下几点,那么本文的优化方案会非常适合: 1)使用php等脚本语言作为开发语言 2)需要连接后端服务,例如RPC服务、memcac...

    架构师之路

扫码关注云+社区

领取腾讯云代金券