第82课 - NFS 网络文件系统
学习目标
通过本节课的学习,你将能够:
- 理解NFS的基本概念及其在Linux系统中的作用。
- 掌握NFS服务器端的安装、配置与导出(export)共享目录。
- 掌握NFS客户端的挂载(mount)与使用共享资源。
- 了解NFS的安全配置选项,包括权限控制和防火墙设置。
- 能够配置NFS的自动挂载(autofs)以实现按需访问。
核心概念
想象一下,在一个办公室里,大家需要访问同一份项目文件。最笨的办法是每个人电脑上都存一份,这样既浪费空间,又容易版本混乱。聪明的办法是把这份文件放在一个公共的“共享文件夹”里,所有人都去那里访问。
NFS(Network File System,网络文件系统) 就是Linux世界里的“共享文件夹”技术。它允许一台服务器(我们称为NFS服务器)将自己的某个目录分享出来,然后网络中其他客户端机器可以像访问本地磁盘一样访问这个目录。
工作流程
- 服务器端:将本地的一个目录(如
/shared_data)通过NFS服务“导出(export)”给指定的客户端。 - 客户端:将服务器导出的远程目录“挂载(mount)”到自己的一个目录(如
/mnt/nfs_share)上。 - 访问:之后,客户端对
/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秒(或配置的超时时间)后,该挂载会自动卸载。
实践练习
-
基础操作:
- 在两台虚拟机(模拟服务器和客户端)上,重现“示例一”的完整步骤。
- 在服务器端创建一个新的共享目录
/srv/nfs/project,并只导出给客户端IP。 - 在客户端将其挂载到
/mnt/project。 - 验证在客户端创建的文件是否出现在服务器端。
-
自动挂载配置:
- 基于练习1的环境,在客户端上配置
autofs。 - 配置目标:实现访问
/nfs_mnt/project时自动挂载服务器端的/srv/nfs/project。 - 测试:仅通过
cd /nfs_mnt/project和ls命令来触发挂载。
- 基于练习1的环境,在客户端上配置
-
高级配置(挑战):
- 在服务器的
/etc/exports中,使用root_squash选项(这是默认值)导出一个目录。 - 在客户端,使用
sudo权限在该挂载目录下创建文件。 - 观察服务器端该文件的所有者是谁(是
root还是nobody)?思考并解释root_squash的安全意义。
- 在服务器的
常见错误
-
“mount.nfs: Connection timed out”:
- 原因:网络不通、NFS服务器未运行、防火墙阻拦。
- 排查:
ping测试连通性;在服务器检查systemctl status nfs-server;检查防火墙规则(sudo ufw status或sudo firewall-cmd --list-all)。
-
挂载后权限被拒绝 (“Permission denied”):
- 原因:服务器端
/etc/exports配置的客户端IP不匹配;共享目录本身的系统权限(chmod/chown)限制了NFS映射的用户。 - 排查:检查
/etc/exports中的IP是否正确;检查服务器上共享目录的本地权限;理解root_squash,all_squash等用户映射选项的影响。
- 原因:服务器端
-
服务器端修改
/etc/exports后未生效:- 原因:未使用
exportfs -arv命令重新导出配置。 - 解决:每次修改
/etc/exports后,务必执行sudo exportfs -arv,通常也需要重启NFS服务。
- 原因:未使用
-
客户端开机卡住或启动缓慢:
- 原因:在
/etc/fstab中配置了NFS挂载,但开机时网络或NFS服务器还未就绪。 - 解决:使用
_netdev挂载选项;或者改用autofs实现按需挂载,这是更推荐的做法。
- 原因:在
小结
本节课我们学习了NFS网络文件系统,它是实现Linux系统间文件共享的基石。
- 核心价值:NFS使得多个客户端可以透明地访问服务器上的集中存储,简化了数据管理。
- 配置流程:服务器端负责安装软件、创建目录、配置
/etc/exports并启动服务。客户端负责安装工具、创建挂载点并执行挂载命令。 - 安全与权限:需理解服务器端导出规则中的IP限制和用户映射选项(如
root_squash),以及共享目录本身的文件系统权限,两者共同决定了客户端的最终访问能力。 - 生产实践:对于开机挂载,
autofs优于/etc/fstab,因为它更灵活、更健壮,避免了因网络或服务器故障导致的启动问题。
掌握NFS,你就掌握了构建小型集群存储、共享开发环境、集中备份等运维任务的关键技能。下一课,我们将学习 vmstat 与 iostat 工具,来监控系统的性能。