前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在 Ubuntu 18.04 上安装和配置 NFS 服务器

如何在 Ubuntu 18.04 上安装和配置 NFS 服务器

作者头像
雪梦科技
发布2020-05-11 15:18:06
14.4K0
发布2020-05-11 15:18:06
举报
文章被收录于专栏:ITCoderITCoder

网络文件系统(NFS)是一个分布式文件系统协议,它允许你通过网络共享远程文件夹。通过 NFS,你可以将远程文件夹挂载到你的系统上,并且操作远程机器的文件,就像本地文件一样方便。

NFS 协议默认是不加密的,它不像 Samba,它不提供用户身份鉴别。服务端通过限定客户端的 IP 地址和端口来限制访问。

在这个指南中,我们将一起看看如何在 Ubuntu 18.04 上建立一个 NFSV4 服务器。我们将会为你展示如何在客户端上挂载 NFS 文件系统。

一、前提条件

我们假设你有一台运行 Ubuntu 18.04 的服务器,在这台服务器上,我们将会建立 NFS 服务器,并且另外一个运行其他 Linux 发行版的机器将作为 NFS 客户端。服务器和客户端应该能够通过私有局域网互相连接。如果无法提供私有 IP 地址,你可以使用公有地址,配置服务器的防火墙,并且允许来自可信源的流量通过端口2049

这个例子中的机器有如下 IPs:

代码语言:javascript
复制
NFS Server IP: 192.168.33.10
NFS Clients IPs: From the 192.168.33.0/24 range

二、建立 NFS 服务器

这一段讲解如何安装必要的软件包,创建并且导出 NFS 目录,并且配置防火墙。

2.1 安装 NFS 服务器

刷新软件索引并且安装 NFS 服务器软件包:

代码语言:javascript
复制
sudo apt update
sudo apt install nfs-kernel-server

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

代码语言:javascript
复制
sudo cat /proc/fs/nfsd/versions
代码语言:javascript
复制
-2 +3 +4 +4.1 +4.2

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

2.2 创建文件系统

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

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

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

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

代码语言:javascript
复制
sudo mkdir -p /srv/nfs4/backups
sudo mkdir -p /srv/nfs4/www

挂载实际的目录:

代码语言:javascript
复制
sudo mount --bind /opt/backups /srv/nfs4/backups
sudo mount --bind /var/www /srv/nfs4/www

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

代码语言:javascript
复制
sudo nano /etc/fstab

添加下面的条目到/etc/fstab文件:

代码语言:javascript
复制
/opt/backups /srv/nfs4/backups  none   bind   0   0
/var/www     /srv/nfs4/www      none   bind   0   0

2.3 导出文件系统

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

代码语言:javascript
复制
sudo nano /etc/exports
代码语言:javascript
复制
`/etc/exports`文件包含了注释,解释如何导出一个目录。

在我们的例子中,我们需要将 wwwbackups目录导出,并且仅仅允许来自192.168.33.0/24网络的访问: /etc/exports

代码语言:javascript
复制
/srv/nfs4         192.168.33.0/24(rw,sync,no_subtree_check,crossmnt,fsid=0)
/srv/nfs4/backups 192.168.33.0/24(ro,sync,no_subtree_check) 192.168.33.3(rw,sync,no_subtree_check)
/srv/nfs4/www     192.168.33.110(rw,sync,no_subtree_check)

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

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

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

保存文件并且导出分享:

代码语言:javascript
复制
sudo exportfs -ra

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

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

代码语言:javascript
复制
sudo exportfs -v

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

代码语言:javascript
复制
/srv/nfs4/backups
		192.168.33.3(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4/www 	192.168.33.110(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4     	192.168.33.0/24(rw,wdelay,crossmnt,root_squash,no_subtree_check,fsid=0,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4/backups
		192.168.33.0/24(ro,wdelay,root_squash,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)

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

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

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

2.4 防火墙配置

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

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

代码语言:javascript
复制
sudo ufw allow from 192.168.33.0/24 to any port nfs

想要验证修改,运行:

代码语言:javascript
复制
sudo ufw status

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

代码语言:javascript
复制
To                         Action      From
--                         ------      ----
2049                       ALLOW       192.168.33.0/24
22/tcp                     ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)

三、建立 NFS 客户端

现在 NFS 服务器已经设置并且分享也被导出了,下一步就是配置客户端,并且挂载远程文件系统。

你也可以在 macOS 和 Windows 机器上挂载 NFS 共享目录,但是我们将专注于在 Linux 系统上挂载共享目录。

3.1 安装 NFS 客户端

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

腾讯云:助力中小微企业上云,满足轻量级Web应用需求,云服务器钜惠 166元/年起
腾讯云:助力中小微企业上云,满足轻量级Web应用需求,云服务器钜惠 166元/年起
  • 在 Debian 和 Ubuntu 上安装 NFS 客户端 在基于 Debian 的发行版中,包含挂载 NFS 文件系统的软件包名是:nfs-common。安装运行: sudo apt update sudo apt install nfs-common
  • 在 CentOS 和 Fedora 上安装 NFS 客户端 在 Red Hat 和它的衍生版本上安装nfs-utils包: sudo yum install nfs-utils

3.2 挂载文件系统

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

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

代码语言:javascript
复制
sudo mkdir -p /backups
sudo mkdir -p /srv/www

使用mount命令挂载导出的文件系统:

代码语言:javascript
复制
sudo mount -t nfs -o vers=4 192.168.33.10:/backups /backups
sudo mount -t nfs -o vers=4 192.168.33.10:/www /srv/www

192.168.33.10是 NFS 服务器的 IP 地址。你也可以使用主机名,而不用 IP 地址,但是它需要在客户端机器上可以转换成 ip。这通常是在/etc/hosts本地文件中将主机名和 IP 进行映射来完成的。

当挂载 NFSv4 文件系统,你需要忽略 NFS 根目录,因此,不使用/srv/nfs4/backups,而使用/backups

验证远程文件系统是否成功挂载,使用df命令:

代码语言:javascript
复制
df -h

这个命令将会打印出所有被挂载的文件系统。最后两行是被挂载的分享:

代码语言:javascript
复制
...
Filesystem                       Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00   38G  1.7G   36G   5% /
devtmpfs                         236M     0  236M   0% /dev
tmpfs                            244M     0  244M   0% /dev/shm
tmpfs                            244M  4.5M  240M   2% /run
tmpfs                            244M     0  244M   0% /sys/fs/cgroup
/dev/sda2                       1014M   87M  928M   9% /boot
tmpfs                             49M     0   49M   0% /run/user/1000
192.168.33.10:/backups           9.7G  1.2G  8.5G  13% /backups
192.168.33.10:/www               9.7G  1.2G  8.5G  13% /srv/www

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

代码语言:javascript
复制
sudo nano /etc/fstab

添加下面的行:

代码语言:javascript
复制
192.168.33.10:/backups /backups   nfs   defaults,timeo=900,retrans=5,_netdev	0 0
192.168.33.10:/www /srv/www       nfs   defaults,timeo=900,retrans=5,_netdev	0 0

想要找到更多关于挂载 NFS 文件系统的可用选项的信息,在终端输入:man nfs

另外一个挂载远程文件系统的选项就是使用autofs工具或者创建一个 systemd 单元。

3.3 测试 NFS 访问

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

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

代码语言:javascript
复制
sudo touch /backups/test.txt

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

代码语言:javascript
复制
touch: cannot touch ‘/backups/test’: Permission denied

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

代码语言:javascript
复制
sudo touch /srv/www/test.txt

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

代码语言:javascript
复制
touch: cannot touch ‘/srv/www’: Permission denied

/var/www目录归属www-data用户,并且这个分享拥有root_squash选项,该选项将 root 用户映射成nobody用户和nogroup用户组,导致 root 用户对远程共享文件没有写入权限。

假设www-data用户在客户端机器上存在,并且GIDUID也和远程服务器上一样(比如,你在服务器和客户机上都安装了 www-data),你可以以www-data用户身份创建一个文件:

代码语言:javascript
复制
sudo -u www-data touch /srv/www/test.txt

这个命令不会显示任何输出,意味着文件被成功创建。

想要验证成功创建,列出/srv/www文件夹下的所有文件:

代码语言:javascript
复制
ls -la /srv/www

输出应该显示最新创建的文件:

代码语言:javascript
复制
drwxr-xr-x 3 www-data www-data 4096 Jun 23 22:18 .
drwxr-xr-x 3 root     root     4096 Jun 23 22:29 ..
-rw-r--r-- 1 www-data www-data    0 Jun 23 21:58 index.html
-rw-r--r-- 1 www-data www-data    0 Jun 23 22:18 test.txt

3.4 卸载 NFS 文件系统

如果你不再需要远程 NFS 共享,你可以使用 umount 命令卸载它。例如,想要卸载/backup,你可以运行:

代码语言:javascript
复制
sudo umount /backups

如果挂载点被定义在/etc/fstab文件,确保你移除了对应的行,或者使用#在行首进行了注释。

四、总结

在这篇指南中,我们为你演示了如何建立一个远程 NFS 服务器,以及如何在客户机上挂载远程文件系统。如果你在生产环境中使用 NFS,并且分享敏感数据,我们建议你启用 kerberos 身份验证和鉴权。

作为一个 NFS 替代方案,你可以使用 SSHFS,通过 SSH 连接来挂载远程目录。SSH 默认被加密,而且很容易配置和使用。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年12月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前提条件
  • 二、建立 NFS 服务器
    • 2.1 安装 NFS 服务器
      • 2.2 创建文件系统
        • 2.3 导出文件系统
          • 2.4 防火墙配置
          • 三、建立 NFS 客户端
            • 3.1 安装 NFS 客户端
              • 3.2 挂载文件系统
                • 3.3 测试 NFS 访问
                  • 3.4 卸载 NFS 文件系统
                  • 四、总结
                  相关产品与服务
                  访问管理
                  访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档