Linux 下使用 NFS 文件共享

Linux NFS

Posted by alovn on November 14, 2020

什么是NFS

NFS 全程是 Network File System,即网络文件系统,是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样,其实现主要是采用远程过程调用RPC机制。

NFS 和 SAMBA 的区别

那么它和SAMBA的文件共享有哪些区别呢? SMB主要是解决类UNIX系统和windows之间的文件共享。而NFS主要是用在类UNIX系统上的, 在Linux系统上使用NFS比SMB性能好。目前Windows下也支持连接使用NFS的。

为什么使用NFS

NFS允许网络中的计算机之间通过网络共享资源, 而K8S和Docker也对NFS提供了原生支持,这样子就可以帮助我们解决K8S是数据储存的问题。k8s是容器编排系统,容器就涉及到cpu,内存,硬盘等调度分配,NFS是K8S储存的其中一个解决方案。

如果是家庭NAS搭建NFS也是一个方案, 另外想要吐槽的是Mac下连接SMB传输文件真的是太慢了~。

怎么搭建NFS

在Linux上搭建NFS是比较简单的,安装NFS需要安装两个工具:nfs-utils 和 rpcbind。我这里以 CentOS 7 为例:

1
yum install nfs-utils rpcbind -y

nfs-utils:NFS服务的全程序,包括rpc.nfsd、rpc.mountd这两个daemons和相关文档说明,以及执行命令文件等。

rpcbind:Centos.x下面RPC的主程序。NFS可视为一个rpc程序,在互动任何一个RPC程序之前,需要做好端口和功能的对应映射工作,这个映射工作就是由RPCBIND服务来完成的。因此,在提供NFS服务之前必须先启动RPCBIND服务, 如果启动顺序不对会导致报错。

启动NFS

1
2
3
systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs

配置NFS共享目录

NFS下共享只需要修改/etc/exports配置文件中配置即可

1
2
3
4
5
6
7
8
vi /etc/exports

/nfs-data/ 172.16.10.0/24(rw,sync,no_root_squash)

# 编辑完成后,重新加载NFS服务,使配置文件生效
systemctl reload nfs 
或
export -r

格式: 共享目录的路径 允许访问的NFS客户端(共享权限参数)

如上,共享目录是/nfs-data/, 它允许 172.16.10.0网段的客户端连接, 权限为可读可写, 注意,权限之间是逗号分割,NFS客户端地址与权限之间没有空格。

配置权限参数说明:

参数作用
ro只读
rw读写
root_squash当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户
no_root_squash当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员
all_squash无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户
sync同时将数据写入到内存与硬盘中,保证不丢失数据
async优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据

Linux下挂载NFS

我们可以用 showmount 命令验证配置的NFS是否成功:

1
2
3
4
5
6
7
8
showmount -e 172.16.10.11 //NFS所在的IP

Export list for 172.16.10.11:
/nfs-data 172.16.10.0/24

# 挂载到客户机
# /nfs-data-test/ 为本地文件夹,需要先创建好
mount -t nfs 172.16.10.11:/nfs-data/ /nfs-data-test

不让这样挂载重启的话需要重新挂载,我们也可以让它开机自动挂载:

1
echo "mount -t nfs 172.16.10.11:/nf-datadata /nfs-data-test" >>/etc/rc.local

或者写入文件 /etc/fstab

1
172.16.10.11:/nfs-data /nfs-data-test nfs defaults 0 0

如果遇到了在客户机通过将NFS网络文件mount到本地后,目录是可以访问了,但无法写入的问题,请检查是是否有配置 no_root_squash 的权限参数(PS:我在实验的过程中就忘记了配置)。

no_root_squash: NFS客户端使用共享目录的用户,如果是root 的话,所有的操作均在服务器端映射为root用户,拥有共享目录的root权限!

root_squash: 默认参数,在登入 NFS 主机export目录的使用者如果当root时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody 那个身份。 因为客户端是使用root登录的,自然权限被压缩为nobody了,难怪无法写入。

Windows下挂载NFS

window下挂载NFS, 需要先在控制面板–>添加程序和功能–>添加NFS组件。

在此电脑,映射驱动器中添加nfs地址,和要共享的文件夹, 地址填写格式:

1
\\172.16.10.11\nfs-data-test

如果是大型网站NFS网络文件系统可替代为分布式文件系统, 如:Moosefs(mfs)、GlusterFs、FastDFS、Ceph 等。