82·存储管理高级

NFS 网络文件系统

nfsnetwork-storage

第82课 - NFS 网络文件系统

学习目标

通过本节课的学习,你将能够:

  1. 理解NFS的基本概念及其在Linux系统中的作用。
  2. 掌握NFS服务器端的安装、配置与导出(export)共享目录。
  3. 掌握NFS客户端的挂载(mount)与使用共享资源。
  4. 了解NFS的安全配置选项,包括权限控制和防火墙设置。
  5. 能够配置NFS的自动挂载(autofs)以实现按需访问。

核心概念

想象一下,在一个办公室里,大家需要访问同一份项目文件。最笨的办法是每个人电脑上都存一份,这样既浪费空间,又容易版本混乱。聪明的办法是把这份文件放在一个公共的“共享文件夹”里,所有人都去那里访问。

NFS(Network File System,网络文件系统) 就是Linux世界里的“共享文件夹”技术。它允许一台服务器(我们称为NFS服务器)将自己的某个目录分享出来,然后网络中其他客户端机器可以像访问本地磁盘一样访问这个目录。

工作流程

  1. 服务器端:将本地的一个目录(如 /shared_data)通过NFS服务“导出(export)”给指定的客户端。
  2. 客户端:将服务器导出的远程目录“挂载(mount)”到自己的一个目录(如 /mnt/nfs_share)上。
  3. 访问:之后,客户端对 /mnt/nfs_share 的所有操作,实际上都是在操作服务器上的 /shared_data 目录。多个客户端可以同时访问,实现文件共享。

关键组件

  • NFS服务器守护进程nfs-server(或 nfsd)。这是核心服务。
  • RPC服务rpcbind。NFS依赖于RPC(远程过程调用)来协商端口,rpcbind服务必须运行。
  • 导出配置文件/etc/exports。这是NFS服务器的“共享清单”,定义了哪个目录可以被谁访问,以及有什么权限。

代码示例

示例一:基础NFS服务器与客户端配置

场景:在服务器 server1 (IP: 192.168.1.100) 上创建一个共享目录 /srv/nfs/share,允许客户端 client1 (IP: 192.168.1.200) 以读写权限访问。

步骤1:在NFS服务器 (server1) 上操作

# 1. 安装NFS服务器软件包
sudo apt update
sudo apt install nfs-kernel-server  # Debian/Ubuntu
# 或
sudo yum install nfs-utils         # CentOS/RHEL

# 2. 创建共享目录并设置权限(重要!)
sudo mkdir -p /srv/nfs/share
# 为了演示方便,设置宽松权限。生产环境应根据需求严格设置。
sudo chmod -R 777 /srv/nfs/share
sudo chown nobody:nogroup /srv/nfs/share  # 通常NFS映射的匿名用户

# 3. 编辑导出配置文件
sudo nano /etc/exports
# 添加以下一行(允许单个客户端IP)
/srv/nfs/share 192.168.1.200(rw,sync,no_subtree_check)
# 参数解释:
# rw: 读写权限
# sync: 数据同步写入磁盘(更安全,但性能略低)
# no_subtree_check: 提高可靠性,禁用子目录检查

# 4. 重新导出共享目录并重启NFS服务
sudo exportfs -arv  # -a: 全部导出,-r: 重新导出,-v: 显示详细过程
sudo systemctl restart nfs-kernel-server
sudo systemctl enable nfs-kernel-server

# 5. 检查防火墙(确保放行NFS相关端口)
# 如果是UFW (Ubuntu)
sudo ufw allow from 192.168.1.200 to any port nfs
# 如果是firewalld (CentOS)
sudo firewall-cmd --add-service=nfs --permanent
sudo firewall-cmd --reload

步骤2:在NFS客户端 (client1) 上操作

# 1. 安装NFS客户端工具
sudo apt update
sudo apt install nfs-common   # Debian/Ubuntu
# 或
sudo yum install nfs-utils    # CentOS/RHEL

# 2. 创建本地挂载点
sudo mkdir -p /mnt/nfs_share

# 3. 手动挂载NFS共享
sudo mount -t nfs 192.168.1.100:/srv/nfs/share /mnt/nfs_share

# 4. 验证挂载
df -h | grep nfs          # 查看挂载信息
ls -ld /mnt/nfs_share     # 查看挂载点信息
touch /mnt/nfs_share/testfile_from_client.txt  # 在客户端创建文件

# 5. 到服务器端验证
# 在服务器上执行 `ls -l /srv/nfs/share`,应该能看到新创建的文件。

步骤3:配置开机自动挂载(客户端)

# 编辑fstab文件
sudo nano /etc/fstab
# 添加以下行
192.168.1.100:/srv/nfs/share  /mnt/nfs_share  nfs  defaults,_netdev  0  0
# _netdev 选项确保在网络可用后再挂载,这是网络文件系统的关键。

示例二:使用Autofs实现NFS按需自动挂载

场景:避免 /etc/fstab 配置的挂载在服务器不可用时阻塞系统启动。使用 autofs 实现:当访问 /nfs_server/shares 时,自动挂载远程共享;空闲一段时间后自动卸载。

步骤1:在客户端 (client1) 上安装并配置autofs

# 1. 安装autofs
sudo apt install autofs  # 或 sudo yum install autofs

# 2. 编辑主配置文件 `/etc/auto.master`
# 添加一行,指定挂载点父目录和映射文件
/nfs_server  /etc/auto.nfs_server --timeout=300
# `/nfs_server` 是本地挂载点的父目录
# `/etc/auto.nfs_server` 是自定义的映射文件
# `--timeout=300` 表示空闲300秒后自动卸载

# 3. 创建并编辑映射文件 `/etc/auto.nfs_server`
sudo nano /etc/auto.nfs_server
# 内容如下(格式:挂载点子目录 -选项 服务器:共享路径)
shares  -rw,soft,intr  192.168.1.100:/srv/nfs/share
# 解释:当访问 `/nfs_server/shares` 时,自动挂载服务器的共享目录。
# soft: 如果服务器无响应,返回错误而非重试。
# intr: 允许中断无响应的NFS操作。

# 4. 重启autofs服务
sudo systemctl restart autofs
sudo systemctl enable autofs

步骤2:测试按需挂载

# 此时,`/nfs_server/shares` 目录看起来是空的。
ls /nfs_server/shares

# 当你第一次尝试访问它时,autofs会自动触发挂载。
ls -l /nfs_server/shares
# 你将看到服务器上 `share` 目录里的内容。

# 使用 `mount | grep autofs` 可以观察到挂载状态。
# 等待300秒(或配置的超时时间)后,该挂载会自动卸载。

实践练习

  1. 基础操作

    • 在两台虚拟机(模拟服务器和客户端)上,重现“示例一”的完整步骤。
    • 在服务器端创建一个新的共享目录 /srv/nfs/project,并只导出给客户端IP。
    • 在客户端将其挂载到 /mnt/project
    • 验证在客户端创建的文件是否出现在服务器端。
  2. 自动挂载配置

    • 基于练习1的环境,在客户端上配置 autofs
    • 配置目标:实现访问 /nfs_mnt/project 时自动挂载服务器端的 /srv/nfs/project
    • 测试:仅通过 cd /nfs_mnt/projectls 命令来触发挂载。
  3. 高级配置(挑战)

    • 在服务器的 /etc/exports 中,使用 root_squash 选项(这是默认值)导出一个目录。
    • 在客户端,使用 sudo 权限在该挂载目录下创建文件。
    • 观察服务器端该文件的所有者是谁(是 root 还是 nobody)?思考并解释 root_squash 的安全意义。

常见错误

  1. “mount.nfs: Connection timed out”:

    • 原因:网络不通、NFS服务器未运行、防火墙阻拦。
    • 排查ping 测试连通性;在服务器检查 systemctl status nfs-server;检查防火墙规则(sudo ufw statussudo firewall-cmd --list-all)。
  2. 挂载后权限被拒绝 (“Permission denied”):

    • 原因:服务器端 /etc/exports 配置的客户端IP不匹配;共享目录本身的系统权限(chmod/chown)限制了NFS映射的用户。
    • 排查:检查 /etc/exports 中的IP是否正确;检查服务器上共享目录的本地权限;理解 root_squash, all_squash 等用户映射选项的影响。
  3. 服务器端修改 /etc/exports 后未生效:

    • 原因:未使用 exportfs -arv 命令重新导出配置。
    • 解决:每次修改 /etc/exports 后,务必执行 sudo exportfs -arv,通常也需要重启NFS服务。
  4. 客户端开机卡住或启动缓慢:

    • 原因:在 /etc/fstab 中配置了NFS挂载,但开机时网络或NFS服务器还未就绪。
    • 解决:使用 _netdev 挂载选项;或者改用 autofs 实现按需挂载,这是更推荐的做法。

小结

本节课我们学习了NFS网络文件系统,它是实现Linux系统间文件共享的基石。

  • 核心价值:NFS使得多个客户端可以透明地访问服务器上的集中存储,简化了数据管理。
  • 配置流程服务器端负责安装软件、创建目录、配置 /etc/exports 并启动服务。客户端负责安装工具、创建挂载点并执行挂载命令。
  • 安全与权限:需理解服务器端导出规则中的IP限制和用户映射选项(如 root_squash),以及共享目录本身的文件系统权限,两者共同决定了客户端的最终访问能力。
  • 生产实践:对于开机挂载,autofs 优于 /etc/fstab,因为它更灵活、更健壮,避免了因网络或服务器故障导致的启动问题。

掌握NFS,你就掌握了构建小型集群存储、共享开发环境、集中备份等运维任务的关键技能。下一课,我们将学习 vmstatiostat 工具,来监控系统的性能。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「vmstat 与 iostat 性能监控」 以巩固所学知识。