跳到主要内容

准备

hostnameip
test-n110.8.30.152nfs server
test-n210.8.30.150nfs client
...

搭建 NFS 服务器

1. 安装 NFS 服务

$ sudo apt update

$ sudo apt install nfs-kernel-server

一旦安装完成,NFS 服务将会自动启动。默认情况下,在 Ubuntu 18.04 及以上版本中 NFS 版本 2 被禁用。NFS 3 和 NFS 4 都可以用。你可以运行下面的命令去验证:

$ sudo cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2

NFSv2 非常古老,没有理由去启用它。 NFS 服务器配置选项在/etc/default/nfs-kernel-server/etc/default/nfs-common文件。默认的设置对于我们的使用场景已经足够了。

2. 创建文件系统

当配置 NFSv4 服务器的时候,最好的实践就是使用一个全局的 NFS 根目录,并且在这里挂载实际的目录。在这个例子中,我们将会使用/data作为 NFS root 目录。

我们将会分享两个目录(/var/www/opt/backups),使用不同的配置,来更好的解释如何配置 NFS 挂载。

/var/www/归属于用户和用户组www-data,并且/opt/backups归属于root

使用mkdir命令创建导出文件系统:

$ sudo mkdir -p /data/{www,backups}

挂载实际的目录:

$ sudo mount --bind /opt/backups /data/backups

$ sudo mount --bind /var/www /data/www

想要这个挂载持久化,开机自动挂载, 修改 /etc/fstab文件

$ sudo vi /etc/fstab
/opt/backups    /data/backups   none    bind    0   0
/var/www /data/www none bind 0 0

3. 导出文件系统

下一步就是定位将要被 NFS 服务器导出的文件系统,共享选项和被允许访问文件系统的客户端。想要这么做,打开/etc/exports

$ sudo nano /etc/exports

/etc/exports文件包含了注释,解释如何导出一个目录。

/data/          10.8.30.0/24(rw,sync,no_subtree_check,crossmnt,fsid=0)
/data/backups 10.8.30.0/24(ro,sync,no_subtree_check) 10.8.30.150(rw,sync,no_subtree_check)
/data/www 10.8.30.150(rw,sync,no_subtree_check)

第一行包含fsid=0定义了 NFS 根目录/data/.来自10.8.30.0/24网络的所有客户端被允许访问 NFS 卷。crossmnt选项是必要的,用来分享被导出目录的子目录。

第二行显示了如何针对一个文件系统指定多个导出规则。它导出了/data/backups目录,并且允许来自10.8.30.0/24的客户端只读访问,而来自10.8.30.150的客户端同时读写可访问。这个sync选项告诉了 NFS 在回复之前将修改写入磁盘。

最后一行应该是自解释的。想要了解更多可用选项,在终端输入man exports

保存文件并且导出分享:

$ sudo exportfs -ra

每次你修改/etc/exports文件你都需要运行一次上面的命令。如果有任何的错误或者警告,它们会被显示在终端上。

想要查看当前活跃的导出和它们的状态,使用:

$ sudo exportfs -v

输出将会包含所有分享以及它们的选项。就像你能看到的,还有我们没有在/etc/exports文件定义的选项。那些是默认选项,如果你想修改他们,你需要显式的设置那些选项。

/data/jenkins/jenkins_home  10.8.30.0/24(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/data/jenkins/versions 10.8.30.0/24(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/data 10.8.30.0/24(rw,wdelay,no_root_squash,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

在 Ubuntu 系统上,root_squash默认被启用。它是一个最重要的选项,关系到 NFS 安全性。它阻止来自客户端 root 用户拥有被挂载分享目录的 root 权限。 它将会将 rootUIDGID映射到nobody/nogroupUIDGID

对于那些通过客户端机器访问的用户,NFS 预期会把客户端的用户和用户组 ID 匹配服务器上的用户和用户组。另外一个选项,就是使用 NFSv4 idmapping 特性,它能将用户和用户组 ID 转换成名字或者其他的方式。

就这些。此时,你已经在你的 Ubuntu 服务器上建立了一个 NFS 服务器。你可以看下一步,并且配置客户端,以便连接 NFS 服务器。

4. 防火墙配置

如果你在网络上运行了防火墙,你将需要添加一个规则,允许 流量通过 NFS 端口。

假设你使用UFW管理你的防火墙,你需要运行下面的命令,允许来自10.8.30.0/24的访问

$ sudo ufw allow from 10.8.30.0/24 to any port nfs

想要验证修改,运行:

$ sudo ufw status

输出显示,流量允许从2049通过:

To                         Action      From
-- ------ ----
2049 ALLOW 10.8.30.0/24
22/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)

NFS 客户端

以上完成了 NFS 服务端配置,下一步就是配置客户端.

1. 安装 NFS 客户端

在客户端机器上需要安装,远程挂载 NFS 文件系统的工具软件

# 在 Ubuntu/Debian 上安装 `nfs-common`
$ sudo apt update
$ sudo apt install nfs-common -y

# 在 centos 上安装 `nfs-utils`
$ sudo yum install nfs-utils

2. 挂载文件系统

我们将在 IP 为10.8.30.150的客户端机器上操作。这台机器拥有对/data/www的读写操作权限,和对/data/backups文件的只读访问权限。

创建两个新目录作为挂载点。你可以在任何位置创建这些目录:

$ sudo mkdir -p /{backups,www}

使用 mount 命令挂载文件系统

$ sudo  mount -t nfs -o vers=4 10.8.30.152:/data/backups /backups

$ sudo mount -t nfs -o vers=4 10.8.30.152:/data/www /www

10.8.30.152 是 NFS 服务器的 IP, 你也可使用主机名

查看 文件系统是否成功挂载, 使用 df 命令:

$ df -h
Filesystem                              Size  Used Avail Use% Mounted on
udev 16G 0 16G 0% /dev
tmpfs 3.2G 4.9M 3.2G 1% /run
/dev/sdd2 915G 60G 809G 7% /
tmpfs 16G 0 16G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 16G 0 16G 0% /sys/fs/cgroup
/dev/mapper/lvm_data-lvmdata 1.8T 77M 1.7T 1% /data
/dev/sdd1 511M 6.7M 505M 2% /boot/efi
/dev/sda 916G 6.8G 863G 1% /home/fs-test
tmpfs 3.2G 0 3.2G 0% /run/user/1000
/dev/loop1 99M 99M 0 100% /snap/core/11081
/dev/loop0 100M 100M 0 100% /snap/core/11167
10.8.30.152:/data/jenkins/jenkins_home 1.8T 198G 1.6T 12% /home/fastest/jenkins_home

想要持久化这些挂载,打开/etc/fstab文件:

添加

10.8.30.152:/backups /backups   nfs   defaults,timeo=900,retrans=5,_netdev  0 0
10.8.30.152:/www /www nfs defaults,timeo=900,retrans=5,_netdev 0 0

另外一个挂载远程文件系统的选项是: autofs.

3. 测试 nfs 访问

让我们通过在共享目录中创建新文件来测试对共享文件夹的访问。

首先,通过使用touch命令在/data/backups目录下创建一个测试文件:

sudo touch /backups/test.txt

backup文件系被导出为只读,并且你应该会看到一个类似Permission denied的错误信息:

touch: cannot touch ‘/backups/test’: Permission denied

下一步,通过 sudo 命令以 root 用户身份在/data/www目录下创建一个测试文件:

再一次,你将会看到Permission denied信息。

touch: cannot touch ‘/srv/www’: Permission denied

4. 取消挂载

sudo umount /backups