凌峰创科服务平台

Ubuntu NFS服务器配置步骤是怎样的?

Ubuntu NFS 服务器配置完整指南

NFS (Network File System) 允许您通过网络将文件系统挂载到另一台计算机上,就像使用本地硬盘一样,这对于需要在多台服务器之间共享文件(Web 服务器的静态文件、用户主目录等)的场景非常有用。

Ubuntu NFS服务器配置步骤是怎样的?-图1
(图片来源网络,侵删)

本指南将分为以下几个部分:

  1. 服务器端配置
  2. 客户端配置
  3. 防火墙设置
  4. 高级选项与优化
  5. 常见问题排查

第一部分:服务器端配置

这部分操作在您的 Ubuntu 服务器上进行。

步骤 1: 更新系统并安装 NFS 服务器

更新软件包列表并安装 nfs-kernel-server 包。

sudo apt update
sudo apt install nfs-kernel-server -y

步骤 2: 创建要共享的目录

选择一个您希望共享的目录,这里我们创建一个 /srv/nfs/share 目录作为示例。

Ubuntu NFS服务器配置步骤是怎样的?-图2
(图片来源网络,侵删)
sudo mkdir -p /srv/nfs/share

为了方便演示,我们给这个目录设置一些基本的权限。

# 设置目录所有者为 root,组为 root
sudo chown -R root:root /srv/nfs/share
# 设置目录的权限为 755 (所有者读写执行,组和其他用户读执行)
sudo chmod -R 755 /srv/nfs/share

步骤 3: 配置 /etc/exports 文件

/etc/exports 文件是 NFS 服务器的核心配置文件,它定义了哪些目录共享给哪些客户端,以及共享的权限。

使用您喜欢的编辑器(如 nanovim)打开该文件:

sudo nano /etc/exports

在文件末尾添加以下配置行,格式为: <共享目录> <客户端1>(选项1,选项2) <客户端2>(选项3)

Ubuntu NFS服务器配置步骤是怎样的?-图3
(图片来源网络,侵删)

示例配置:

允许特定 IP 地址访问 假设您想允许 IP 地址为 168.1.10 的客户端访问。

/srv/nfs/share    192.168.1.10(rw,sync,no_subtree_check)

允许特定子网访问 如果您想允许整个 168.1.0/24 网段的所有客户端访问。

/srv/nfs/share    192.168.1.0/24(rw,sync,no_subtree_check)

允许任何客户端访问 (不推荐用于生产环境) 仅用于测试,非常不安全。

/srv/nfs/share    *(rw,sync,no_subtree_check)

配置选项详解:

  • rw: 允许客户端以读写方式挂载,这是最常用的选项。
  • ro: 只读方式挂载。
  • sync: 文件写入到磁盘后,才对客户端返回确认,这保证了数据的一致性,但性能稍差。
  • async: 数据先在内存中缓存,稍后再写入磁盘,性能更好,但有数据丢失的风险(例如服务器断电)。
  • no_subtree_check: 禁用子树检查,当共享的目录是文件系统的一部分时,这个选项可以避免一些问题,特别是在客户端有文件被移动或删除时。强烈推荐使用此选项。
  • no_root_squash: 如果客户端以 root 用户身份访问,那么在 NFS 共享上,它也将拥有 root 权限。对于管理工具或需要 root 权限的脚本很有用,但有安全风险。
  • root_squash: 这是默认行为,客户端的 root 用户会被映射成匿名用户(通常是 nfsnobody),从而限制了其权限,这是更安全的选择。
  • all_squash: 将所有用户(包括 root)都映射成匿名用户,当您希望所有客户端用户都使用同一个匿名账户时很有用。

步骤 4: 应用新的导出配置

修改完 /etc/exports 文件后,需要让 NFS 服务器重新读取配置并应用它。

# 重新导出所有共享目录
sudo exportfs -a
# 或者重启 NFS 服务
sudo systemctl restart nfs-kernel-server

步骤 5: 启动并启用 NFS 服务

确保 NFS 服务正在运行,并设置为开机自启。

# 检查服务状态
sudo systemctl status nfs-kernel-server
# 如果未运行,启动它
sudo systemctl start nfs-kernel-server
# 设置为开机自启
sudo systemctl enable nfs-kernel-server

至此,NFS 服务器端配置完成!


第二部分:客户端配置

这部分操作在需要挂载 NFS 共享的 Ubuntu (或其他 Linux) 客户端上进行。

步骤 1: 安装 NFS 客户端工具

客户端需要安装 nfs-common 包来提供挂载 NFS 共享所需的功能。

sudo apt update
sudo apt install nfs-common -y

步骤 2: 创建本地挂载点

在客户端上创建一个目录,作为 NFS 共享的挂载点。

sudo mkdir -p /mnt/nfs_share

步骤 3: 手动挂载 NFS 共享

使用 mount 命令进行手动挂载,格式为: mount <服务器IP>:<共享目录> <本地挂载点>

假设您的服务器 IP 是 168.1.100

sudo mount 192.168.1.100:/srv/nfs/share /mnt/nfs_share

步骤 4: 验证挂载

检查共享是否成功挂载。

# 使用 df -h 命令查看磁盘使用情况
df -h | grep nfs_share
# 或者使用 mount 命令
mount | grep nfs_share

如果看到类似以下的输出,说明挂载成功: 168.1.100:/srv/nfs/share on /mnt/nfs_share type nfs4 (rw,relatime,vers=4.0,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.10,locallock=none,addr=192.168.1.100)

步骤 5: 测试读写

在挂载点创建一个文件,以测试写权限。

sudo touch /mnt/nfs_share/test_file.txt
ls -l /mnt/nfs_share/

如果文件创建成功,说明配置正确。

步骤 6: 设置开机自动挂载 (可选)

为了让客户端在重启后自动挂载 NFS 共享,需要修改 /etc/fstab 文件。

警告: 编辑 /etc/fstab 错误可能导致系统无法启动,请务必谨慎。

使用 blkidmount 命令获取 NFS 共享的详细信息,特别是 vers=4 等选项,以确保兼容性。

# 获取挂载信息
mount | grep nfs_share

用编辑器打开 /etc/fstab

sudo nano /etc/fstab

在文件末尾添加以下行:

# <服务器IP>:<共享目录>  <本地挂载点>  nfs  <选项>  0  0
192.168.1.100:/srv/nfs/share /mnt/nfs_share nfs defaults,timeo=600,retrans=2,_netdev 0 0

/etc/fstab 选项说明:

  • defaults: 使用默认的挂载选项(包括 rw, suid, dev, exec, auto, nouser, async)。
  • _netdev: 这是一个重要的选项,它告诉系统这是一个网络设备,应该在网络启动之后再尝试挂载。
  • timeo=600: 设置 NFS 操作超时时间,单位为十分之一秒(600 = 60秒),在网络不稳定的环境下很有用。
  • retrans=2: 设置重传次数。
  • x-systemd.automount (更现代的方案): 使用 systemd 的自动挂载服务,可以实现按需挂载,提高系统启动速度和网络性能。

保存文件后,可以通过以下命令测试 fstab 是否正确配置:

# 卸载已挂载的目录
sudo umount /mnt/nfs_share
# 尝试根据 fstab 重新挂载所有
sudo mount -a

如果命令没有报错,说明 fstab 配置正确,再次使用 df -h 验证。


第三部分:防火墙设置

如果您的服务器启用了 UFW (Uncomplicated Firewall),需要开放 NFS 使用的端口。

NFS v4 主要使用 TCP 的 2049 端口,但 rpcbindmountdnlockmgrstatd 等服务也需要开放端口,最简单的方法是使用 ufw 的应用配置。

# 允许 NFS 服务
sudo ufw allow 'NFS'
# 如果还需要允许其他服务,如 Samba (SMB) 或 RPC,可以一并开放
# sudo ufw allow 'Samba'
# sudo ufw allow 'rpcbind'
# 重新加载防火墙规则
sudo ufw reload

如果您使用的是 iptables,则需要手动添加规则,

sudo iptables -A INPUT -p tcp --dport 2049 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 2049 -j ACCEPT
# ... 其他端口规则
sudo iptables-save | sudo tee /etc/iptables/rules.v4

第四部分:高级选项与优化

NFSv4 vs NFSv3 vs NFSv2

  • NFSv4 (推荐): 是最新的稳定版本,安全性更高(内置了 Kerberos 认证),通过单一 TCP 端口 (2049) 进行通信,配置更简单,性能也更好,现代 Linux 发行版默认使用 NFSv4。
  • NFSv3: 仍然广泛使用,但需要多个端口,配置稍复杂。
  • NFSv2: 已经过时,不推荐使用。

如何指定 NFS 版本?

/etc/exports 文件中,可以使用 fsid 选项来明确指定为 NFSv4 共享。

/srv/nfs/share    192.168.1.0/24(rw,sync,no_subtree_check,fsid=0)

fsid=0 告诉 NFS 客户端这是 NFSv4 的根文件系统。

在客户端挂载时,可以指定版本:

# 强制使用 NFSv4
sudo mount -t nfs4 -o vers=4 192.168.1.100:/srv/nfs/share /mnt/nfs_share

NFS 缓存和性能优化

  • rsizewsize: 定义了读/写操作的数据块大小,较大的值(如 1048576,即 1MB)可以提高性能,但需要网络支持。
    • /etc/fstab 中添加:rsize=1048576,wsize=1048576
  • async vs sync: 如前所述,async 性能更好但有数据丢失风险,对于非关键数据可以考虑使用。
  • noatime: 禁用文件访问时间更新,可以减少磁盘 I/O,提升性能。
    • /etc/fstab 中添加:noatime

第五部分:常见问题排查

  1. mount.nfs: access denied by server while mounting

    • 原因: 服务器 /etc/exports 文件配置错误,或客户端 IP 不在允许列表中。
    • 解决: 检查服务器端 /etc/exports 文件,确保客户端 IP 或子网配置正确,使用 showmount -e <服务器IP> 查看服务器当前导出的共享列表。
  2. rpc.statd: unable to contact statmon service

    • 原因: 服务器端的 statd 服务未运行或防火墙阻止了相关端口。
    • 解决: 确保服务器上 nfs-kernel-server 服务正在运行,检查防火墙规则是否放开了 rpc.statd 的端口。
  3. mount.nfs: requested NFS version or transport protocol is not supported

    • 原因: 客户端或服务器端不支持您指定的 NFS 版本。
    • 解决: 检查两端系统是否都安装了 NFS 相关软件包,尝试不指定版本进行挂载,或指定一个更通用的版本(如 vers=3)。
  4. showmount: unable to retrieve localhost

    • 原因: rpcbind 服务未运行。
    • 解决: 在服务器上启动 rpcbind 服务:sudo systemctl start rpcbind && sudo systemctl enable rpcbind
  5. 挂载后出现 "Operation not permitted" 或 "Permission denied"

    • 原因: 通常是文件系统权限问题,检查服务器端共享目录的权限 (ls -ld /srv/nfs/share) 和文件所有者,检查 /etc/exports 中的 root_squash 选项,如果客户端需要 root 权限,服务器端可能需要设置 no_root_squash(但请注意安全风险)。

希望这份详细的指南能帮助您成功配置和使用 Ubuntu NFS 服务器!

分享:
扫描分享到社交APP
上一篇
下一篇