下面给你一套**在 Debian 12 + NFSv4 环境下,将 A 服务器 `/dev/vdb1` 共享给 B 服务器 `/mnt`,并支持双向即时读写的较安全方案**。
我会按 **架构 → 分区与挂载 → NFS 服务 → 权限与用户映射 → 安全加固 → 验证与排错 → 数据安全保障** 的顺序来说明。
---
# 一、总体架构说明
| 角色 | 主机名 | IP | 磁盘 |
|---|---|---|---|
| NFS Server | A | 1.2.3.4 | `/dev/vdb1` |
| NFS Client | B | 5.6.7.8 | `/dev/sda1`(本地盘,不用于本次共享) |
目标:
- A 的 `/data/nfs_share`(由 `/dev/vdb1` 挂载)通过 **NFSv4** 共享
- B 挂载到 `/mnt`
- **双向即时读写**(同一导出目录)
- 强调 **权限一致性 + 网络与数据安全**
---
# 二、磁盘准备(A 服务器)
## 1. 分区与文件系统(若尚未格式化)
⚠️ 以下会清空磁盘,仅首次执行
```bash
mkfs.ext4 /dev/vdb1
```
建议使用 `ext4` 或 `xfs`(推荐 `xfs` 更适合大文件/并发)
```bash
mkfs.xfs /dev/vdb1
```
## 2. 创建挂载点并挂载
```bash
mkdir -p /data/nfs_share
mount /dev/vdb1 /data/nfs_share
```
## 3. 设置开机自动挂载
编辑 `/etc/fstab`:
```bash
nano /etc/fstab
```
添加:
```text
/dev/vdb1 /data/nfs_share xfs defaults,nofail 0 2
```
测试:
```bash
mount -a
df -hT /data/nfs_share
```
---
# 三、NFSv4 服务端配置(A 服务器)
## 1. 安装 NFS 服务
```bash
apt update
apt install nfs-kernel-server -y
```
确认 NFSv4:
```bash
cat /proc/fs/nfsd/versions
```
应至少包含 `+4 +4.1 +4.2`
---
## 2. 配置导出目录
编辑:
```bash
nano /etc/exports
```
添加:
```text
/data/nfs_share 5.6.7.8(rw,sync,no_root_squash,no_subtree_check)
```
参数说明(重点):
| 参数 | 作用 |
|---|---|
| rw | 读写 |
| sync | 同步写入(数据安全)✅ |
| no_root_squash | 允许 root 权限(谨慎) |
| no_subtree_check | 提高性能 |
⚠️ **如果你担心权限风险,可改为 `root_squash` + 统一 UID/GID**
---
## 3. 导出并启动服务
```bash
exportfs -r
systemctl restart nfs-server
systemctl enable nfs-server
```
检查:
```bash
exportfs -v
```
---
# 四、客户端配置(B 服务器)
## 1. 安装 NFS 客户端
```bash
apt update
apt install nfs-common -y
```
## 2. 创建挂载点
```bash
mkdir -p /mnt
```
## 3. 手动挂载测试
```bash
mount -t nfs4 1.2.3.4:/data/nfs_share /mnt
```
查看:
```bash
df -hT /mnt
```
## 4. 开机自动挂载
编辑 `/etc/fstab`:
```bash
nano /etc/fstab
```
添加:
```text
1.2.3.4:/data/nfs_share /mnt nfs4 rw,sync,_netdev 0 0
```
测试:
```bash
mount -a
```
---
# 五、权限与用户一致性(非常关键)
## ✅ 推荐方案:统一 UID/GID(最安全)
假设用户为 `appuser`:
```bash
id appuser
```
输出示例:
```text
uid=1001(appuser) gid=1001(appuser)
```
在 **A / B 两台机器** 上保持一致:
```bash
usermod -u 1001 appuser
groupmod -g 1001 appuser
```
然后:
```bash
chown -R appuser:appuser /data/nfs_share
```
---
## ❌ 不推荐但可用:no_root_squash
如果你必须使用 root 写入:
```text
/data/nfs_share 5.6.7.8(rw,sync,no_root_squash)
```
⚠️ 风险:客户端 root 可对服务器文件为所欲为
---
# 六、安全加固(强烈建议)
## 1. 防火墙(UFW)
### A 服务器(NFS Server)
```bash
ufw allow from 5.6.7.8 to any port nfs
ufw reload
```
### B 服务器(Client)
无需开放 NFS 端口
---
## 2. 禁用 NFSv3(防降级)
编辑:
```bash
nano /etc/nfs.conf
```
确保:
```ini
[nfsd]
vers3=n
vers4=y
```
重启:
```bash
systemctl restart nfs-server
```
---
## 3. 使用 Kerberos(企业级安全,可选)
如需 **身份认证 + 加密传输**,可使用 `sec=krb5p`
但部署复杂度较高,适合内网高安全环境。
---
# 七、即时读写验证
在 B 上:
```bash
echo "hello from B" > /mnt/test.txt
```
在 A 上:
```bash
cat /data/nfs_share/test.txt
```
反向测试:
```bash
echo "hello from A" >> /mnt/test.txt
```
✅ 实时可见即成功
---
# 八、数据安全与可靠性建议
## ✅ 必做项
1. **定期备份**
```bash
rsync -avxH --delete /data/nfs_share /backup/
```
2. **监控磁盘健康**
```bash
smartctl -a /dev/vdb
```
3. **使用 UPS(防止断电损坏文件系统)**
---
## ✅ 进阶建议
| 场景 | 建议 |
|---|---|
| 高并发 | 使用 `xfs` |
| 断线保护 | `hard,intr` 挂载选项 |
| 数据校验 | 定期 `rsync --checksum` |
| 快照 | LVM / btrfs snapshot |
---
# 九、常见坑位排查
| 问题 | 解决 |
|---|---|
| 权限拒绝 | UID/GID 不一致 |
| 卡死 | 使用 `hard,intr` |
| 无法写入 | `no_root_squash` 或权限 |
| 重启后未挂载 | `_netdev` |
---
# 十、总结一句话
> ✅ 本方案基于 **NFSv4 + ext4/xfs + 统一 UID/GID + sync 写入**,在保证 **双向即时读写** 的同时,最大程度保障 **数据一致性与安全性**。
如果你愿意,我可以:
- 给你一套 **生产环境标准 exports 模板**
- 或帮你设计 **LVM + 快照 + 自动备份方案**
- 或评估是否 **iSCSI / CephFS 更适合你的场景**
欢迎继续交流 👍



文章评论