如何在Debian 9上安装NFS共享

什么是网络文件系统(NFS)

网络文件系统(NFS)是一种文件系统协议,允许类Unix系统的用户通过网络访问文件,就像使用本地存储一样。这对于跨Internet上的多个腾讯云CVM服务器或其他计算机共享文件很有用。例如,您可以通过NFS共享用户或系统配置文件的主目录。

但是,请注意NFS(版本3及更早版本)的一个限制是服务器和客户端必须限制为本地或受信任的专用网络,因为数据从一台计算机未加密传输到另一台计算机。NFS版本4解决了这个缺点,它依赖于Kerberos进行身份验证和加密。然而,设置用于NFS的Kerberos相当复杂,并且需要密钥分发中心,这超出了本教程的范围。

本教程将指导您完成两个腾讯云CVM服务器的设置; 一个是NFS服务器,另一个是客户端。在此示例中,两个腾讯云CVM服务器都位于同一数据中心,并将使用其专用IP地址进行通信,因此您的数据永远不会离开腾讯云CVM服务器的网络。警告:其他NFS设置可能会通过公共Internet发送流量。

注意 本教程是为非root用户编写的。需要提升权限的命令带有sudo前缀。

准备

  • 将两个Debian 9腾讯云CVM服务器部署在同一个数据中心。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。
  • 将腾讯云CVM服务器配置为使用私有IP。

NFS服务器设置

选择一个腾讯云CVM服务器作为您的NFS服务器。并按照以下说明进行配置。

  • 更新软件包来源:
代码语言:javascript
复制
sudo apt update
  • 安装NFS服务器包nfs-kernel-server
代码语言:javascript
复制
sudo apt install nfs-kernel-server
  • 安装Portmapper软件包portmap
代码语言:javascript
复制
sudo apt-get install portmap
  • 默认情况下,通过将以下行添加到hosts.deny文件中来阻止访问NFS使用的服务。
代码语言:javascript
复制
   rpcbind mountd nfsd statd lockd rquotad : ALL
  • 允许访问NFS用于客户端和localhost的服务。将以下行添加到您的hosts.allow文件中,替换example_IP为客户端腾讯云CVM服务器的私有IPv4地址。
代码语言:javascript
复制
    rpcbind mountd nfsd statd lockd rquotad : 127.0.0.1 : allow
    rpcbind mountd nfsd statd lockd rquotad : example_IP : allow
    rpcbind mountd nfsd statd lockd rquotad : ALL : deny
  • 在本地文件系统中创建一个目录,以用作NFS共享的root位置:
代码语言:javascript
复制
sudo mkdir /var/nfsroot
  • 为NFS共享的root分配适当的所有权:
代码语言:javascript
复制
sudo chown nobody:nogroup /var/nfsroot/
  • 将以下行添加到/etc/exports文件中,替换example_IP为客户端腾讯云CVM服务器的私有IPv4地址。确保/ 17和左括号之间没有空格,并且文件末尾有一个空行。
代码语言:javascript
复制
    /var/nfsroot     example_IP/17(rw,root_squash,subtree_check)
  • 使用以下命令更新导出的文件系统表:
代码语言:javascript
复制
sudo exportfs -ra
  • 在服务器腾讯云CVM服务器上重新启动NFS服务以使更改生效:
代码语言:javascript
复制
sudo systemctl restart nfs-kernel-server

完成!现在,您在其中一个腾讯云CVM服务器上已经有了一个基本NFS服务器,并配置为将/ var / nfsroot目录提供给第二个腾讯云CVM服务器。

NFS客户端设置

第二个腾讯云CVM服务器将是您的NFS客户端。请按照以下说明进行配置。

  • 更新软件包来源:
代码语言:javascript
复制
sudo apt update
  • 安装NFS客户端软件包nfs-common
代码语言:javascript
复制
sudo apt install nfs-common
  • 在客户端腾讯云CVM服务器的本地文件系统中创建一个目录,作为远程文件系统的挂载点:
代码语言:javascript
复制
sudo mkdir /mnt/remotenfs
  • 使用您喜欢的编辑器将以下行添加到客户端的fstab文件中,替换example_IP为服务器腾讯云CVM服务器的私有IPv4地址。
代码语言:javascript
复制
1   example_IP:/var/nfsroot /mnt/remotenfs nfs rw,async,hard,intr,noexec 0 0
  • 通过运行以下命令挂载文件系统:
代码语言:javascript
复制
sudo mount /mnt/remotenfs

你已经完成了!现在,从客户端腾讯云CVM服务器,您可以访问腾讯云CVM服务器 NFS服务器上托管的远程文件系统。您可以通过将更多客户端添加到服务器的/etc/exports文件来添加更多客户端,然后为每个客户端重复客户端设置。

高级配置

NFS提供各种挂载选项。在本教程中,我们使用了读写访问,异步文件传输和可中断硬等待的标准行为,但您可以使用以下选项在NFS共享上配置其他行为。

客户端选项

这些选项可以在fstab中指定,也可以使用带有-o开关的mount命令手动指定,后跟逗号分隔的挂载选项列表。

  • rw:读/写文件系统。
  • ro:只读文件系统。远程NFS客户端无法修改文件系统。
  • hard:如果服务器出现故障,使用存储在NFS上的文件的应用程序将始终等待。除非设置了选项intr,否则用户无法终止该过程。
  • soft:如果服务器出现故障,使用存储在NFS上的文件的应用程序将等待指定的时间(使用timeo选项),之后将抛出错误。
  • intr:允许用户中断等待NFS请求的进程。
  • timeo = <num>:用于soft选项。指定NFS请求的超时。
  • nolock:禁用文件锁。适用于较旧的NFS服务器。
  • noexec:禁用NFS共享上的二进制文件或脚本的执行。
  • nosuid:阻止用户获得NFS共享上文件的所有权。
  • rsize = <num>:设置读取块数据大小。在NFSv2和NFSv3上默认为8192,在NFSv4上默认为32768。
  • wsize = <num>:设置写入块数据大小。在NFSv2和NFSv3上默认为8192,在NFSv4上默认为32768。

服务器选项

可以在/etc/exports条目中指定这些选项:

  • rw:读/写文件系统。
  • ro:强制客户端仅以只读文件系统模式进行连接。
  • no_root_squash:客户端计算机上的root帐户将具有与服务器计算机上的root相同的权限级别。该选项有安全隐患; 除非你确定需要,否则不要使用它。另一方面,root_squash导致客户端上的root与服务器上的nobody具有相同的访问类型 - 从而阻止客户端上的root将不需要的文件传播到其他文件。
  • no_subtree_check:禁用部分卷导出的文件位置检查。此选项将加快全量导出的传输速度。
  • 同步:强制所有传输在同步模式下运行,因此所有客户端都将等待,直到其操作完成。这可以避免在服务器崩溃时数据损坏。

示例

在客户端的/ mnt / remotenfs中创建一个名为testfile.txt的测试文件::

代码语言:javascript
复制
sudo echo "Hello World" > /mnt/remotenfs/testfile.txt

如果一切按预期进行,则/mnt/remotenfs/testfile.txtnobody:nogroup拥有。 你可以使用以下命令查看

代码语言:javascript
复制
ls -l /mnt/remotenfs/testfile.txt

同样,如果您这样做,则应在服务器中显示相同的权限

代码语言:javascript
复制
ls -l /var/nfsroot/testfile.txt

现在让我们用服务器上的/ etc / exports中的no_root_squash替换root_squash,并更新导出共享表,如上面NFS Server Setup 中的替换example_IP为客户端腾讯云CVM服务器的私有IPv4地址步骤中所述。 最后,我们将通过在同一目录(/ mnt / remotenfs)中创建另一个测试文件(testfile2.txt)来重复上述操作:

代码语言:javascript
复制
sudo echo "Hi everyone" > /mnt/remotenfs/testfile2.txt

如果您在客户端或服务器上检查testfile2.txt的所有权,您将看到它现在由root:root拥有。 这些简单的例子说明了root_squashno_root_squash的用法和含义。 为了您的安全,请不要忘记删除后者并尽快在/ etc / exports中重新添加前者。

了解更多

想要了解更多关于NFS的内容请前往腾讯云+社区学习。


参考文献:《How to Mount NFS Shares on Debian 9》