简介
网络文件系统(NFS)是一个分布式文件系统协议,允许你通过网络共享远程文件夹,通过NFS的方式,将远程文件夹挂载到本地系统上,并且操作远程机器的文件,就像本地文件一样方便。
NFS 协议默认是不加密的,它不像 Samba,它不提供用户身份鉴别。服务端通过限定客户端的 IP 地址和端口来限制访问。
在本文中,将介绍如何在 Ubuntu 18.04 上建立 NFSV4 服务器以及如何挂载 NFS 到本地系统中
前提条件
使用一台Ubuntu 18.04 的机器作为服务端,在该服务端,我们将安装搭建NFS服务,另外一台linux 服务器作为 NFS 客户端,服务端和客户端之间能够通过局域网互相连接。
搭建 NFS 服务器
这里说明如何安装必要软件包,创建并导出NFS目录,配置防火墙
安装NFS服务器
刷新软件索引,并且安装NFS服务
sudo apt update
sudo apt install nfs-kernel-server
安装完成后,NFS 服务将会自动启动,默认在Ubuntu 18.04上NFS2 被禁用,NFS3和NFS4可以使用。
查看NFS的版本信息 + 表示支持 - 表示不支持
sudo cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2
创建文件系统
配置NFSv4 服务器,最好使用一个全局的NFS根目录,然后在这个根目录下挂载实际的目录,在这个例子中,/opt/nfsv4
作为NFS 的root 根目录。
分享两个目录(/var/data
和 /opt/back
),使用不同的配置,来说明如何挂载NFS,/var/data
归属于用户和用户组data
,/opt/back
归属于root
NFS 服务器的ip地址为192.168.174.10
- 创建导出文件系统
sudo mkdir -p /opt/nfsv4/data
sudo mkdir -p /opt/nfsv4/back
- 挂载实际的目录
sudo mount --bind /var/data /opt/nfsv4/data
sudo mount --bind /opt/back /opt/nfsv4/back
-
持久化挂载
- 打开文件
/etc/fstab
sudo nano /etc/fstab
- 添加条目
/var/data /opt/nfsv4/data none bind 0 0 /opt/back /opt/nfsv4/back none bind 0 0
- 打开文件
-
导出文件系统
-
修改配置文件
修改/etc/exports
文件,添加文件系统导出,
这里将data
和back
导出,并且配置网络访问权限sudo nano /etc/exports
添加如下内容
/opt/nfsv4 192.168.174.0/24(rw,sync,no_subtree_check,crossmnt,fsid=0) /opt/nfsv4/back 192.168.174.0/24(ro,sync,no_subtree_check) 192.168.174.20(rw,sync,no_subtree_check) /opt/nfsv4/data 192.168.174.30(rw,sync,no_subtree_check)
-
配置说明
第一行包含fsid=0
定义NFS根目录/opt/nfs4
,网络192.168.174.0/24
客户端允许访问NFS卷,crossmnt
选项是必要的,用来分享被导出目录的子目录
第二行表示如何针对一个文件系统,配置多个导出规则,导出目录/opt/nfs4/back
,允许192.168.174.0/24
客户端只读访问,允许192.168.174.20
客户端读写访问
第三行表示单个导出规则,导出目录/opt/nfs4/data
,允许192.168.174.30
客户端读写访问 -
导出分享
sudo exportfs -ra
-
查看当前活跃的导出和状态
sudo exportfs -v
输出会包含所有分享以及他们的选项,有些选项是默认的选项,如果需要修改这些,需要在配置中显示设置这些选项
/opt/nfsv4/back 192.168.174.20(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash) /opt/nfsv4/data 192.168.174.30(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash) /opt/nfsv4 192.168.174.0/24(rw,wdelay,crossmnt,root_squash,no_subtree_check,fsid=0,sec=sys,rw,secure,root_squash,no_all_squash) /opt/nfsv4/back 192.168.174.0/24(ro,wdelay,root_squash,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
-
配置防火墙
如果网络上有防火墙,需要在防火墙中添加一条规则,允许流量通过NFS端口
如果使用ufw
管理防火墙,运行命令添加防火墙
sudo ufw allow from 192.168.174.0/24 to any port nfs
查看防火墙的状态
sudo ufw status
输出结果
To Action From
-- ------ ----
2049 ALLOW 192.168.174.0/24
22/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
NFS客户端
安装NFS客户端
- 在Ubuntu 上安装NFS客户端,客户端的软件名称为
nfs-common
sudo apt install nfs-common
- 在Centos 上安装NFS客户端,客户端的软件名称为
nfs-utils
sudo yum install nfs-utils
挂载文件系统
客户端ip为192.168.174.30
,这台机器有对/opt/nfs4/back
有只读权限,对/opt/nfs4/data
有读写权限
创建两个新目录作为挂载点
sudo mkdir -p /opt/back
sudo mkdir -p /opt/data
使用mount
挂载文件系统
sudo mount -t nfs -o vers=4 192.168.174.10:/back /opt/back
sudo mount -t nfs -o vers=4 192.168.174.10:/data /opt/data
当挂载NFSV4 文件系统时,需要忽略NFS根目录,不使用
/opt/nfs4/data
,而是使用/data
使用df -h
命令可以查看NFS是否挂载成功
如果想要持久化挂载,需要修改/etc/fstab
文件,将挂载信息写入到此文件中
sudo nano /etc/fstab
添加如下内容
192.168.174.10:/back /opt/back nfs defaults,timeo=900,retrans=5,_netdev 0 0
192.168.174.10:/data /opt/data nfs defaults,timeo=900,retrans=5,_netdev 0 0
测试NFS访问
在/opt/back
中创建文件
sudo touch /backups/test.txt
back
文件系统为只读权限,会看到Read-only file system
的错误信息
以root 身份在/var/data
中中创建测试文件,依然提示Permission denied
sudo touch /var/data/test.txt
原因分析:
/var/data
归属于data
用户,并且这个分享有root_squash
选项,表示会将root用户映射成nobody
用户和nogroup
组,导致root用户对远程文件夹没有写入权限,假如data
用户在客户机上存在,并且GID
和UID
和远程服务器上的一致,则会有权限创建文件