前言:为什么要抛弃 NFS 挂载?


在家庭实验室或企业生产环境中,我们经常面临一个需求:**让 Linux 虚拟机(计算节点)拥有海量的存储空间,同时利用 NAS(存储节点)的 RAID 机制保护数据。**

很多人(包括曾经的我)第一反应是使用 NFS 挂载。然而,NFS 在此场景下存在诸多痛点:

1. 权限噩梦:群晖的 ACL 权限与 Linux 的 POSIX 权限冲突,导致文件变成 777(绿色背景色),或者出现 Permission Denied。
2. 性能瓶颈:网络文件协议在高频随机读写(如编译、数据库)下性能一般。
3. 依赖性强:如果 NAS 网络抖动,Linux 虚拟机容易卡死(I/O Wait)。

**最佳的解决方案是:iSCSI + PVE 分层存储。**

本方案将存储层(Synology)、管理层(PVE)和计算层(VM)解耦,**让虚拟机认为自己在使用一块本地物理硬盘**,彻底解决权限问题,并利用 PVE 实现极简的灾难恢复。

---

架构拓扑


- 存储层:群晖 NAS (RAID 保护) -> 提供 iSCSI Block 存储。
- 虚拟化层:Proxmox VE (PVE) -> 连接 iSCSI -> 创建 LVM 卷组。
- 计算层:CentOS/Ubuntu VM -> 挂载虚拟磁盘 (VirtIO) -> 格式化为 EXT4/XFS。

---

第一阶段:群晖 NAS 端配置 (iSCSI Target)


我们需要在群晖上切出一块“裸磁盘”给 PVE 使用。

1. 打开 SAN Manager:
登录群晖 DSM,打开 SAN Manager (旧版本为 iSCSI Manager)。
2. 创建 LUN (逻辑单元号):

- 点击 LUN -> 新增。
- 位置:选择你做了 RAID 的存储空间。
- 容量:输入你需要的大小(例如 500GB)。
- 空间分配:建议选择 厚置备 (Thick Provisioning) 以获得最佳性能(或选精简置备以节省空间)。
- 点击下一步,完成创建。
3. 创建 Target (目标):

- 群晖会自动创建iSCSI的target,点击下面的iSCSI菜单就能看到

> 记录信息:创建完成后,请记下 Target 的 IQN 字符串(例如 iqn.2000-01.com.synology:nas.Target-1.xxx)。

---

第二阶段:PVE 宿主机配置 (挂载与 LVM)


这一步将群晖的磁盘“拉”到 PVE 中,并纳入 PVE 的存储管理体系。

1. 建立 iSCSI 连接:

- 登录 PVE 管理网页。
- 依次点击 Datacenter (数据中心) -> Storage (存储) -> Add (添加) -> iSCSI。
- ID: 输入标识符,例如 synology-iscsi。
- Portal: 输入群晖的 IP 地址。
- Target: 输入 IP 后,点击下拉菜单,PVE 会自动扫描出群晖的 Target,选中它。
- 关键点:取消勾选 "Use LUNs directly" (我们要用更高级的 LVM 模式)。
- 点击 Add。
2. 创建 LVM 卷组:

- 再次点击 Add (添加) -> LVM。
- ID: 输入名字,例如 synology-lvm (这个名字以后会用来给虚拟机选盘)。
- Base Storage: 选择刚才创建的 synology-iscsi。
- Base Volume: 下拉选择对应的 LUN。
- Content: 确保选中 Disk image 和 Container。
- Shared: 如果是单机 PVE,不勾选;如果是集群,请勾选。
- 点击 Add。

此时,在 PVE 左侧的存储列表中,你应该能看到 synology-lvm,容量就是你在群晖分配的大小。

---

第三阶段:虚拟机配置 (挂载与格式化)


这一步是将“硬盘”插到虚拟机上,体验原生 Linux 磁盘。

1. 给 VM 添加磁盘:

- 选择你的 Linux 虚拟机 (VM)。
- Hardware (硬件) -> Add (添加) -> Hard Disk (硬盘)。
- Storage: 选择 synology-lvm。
- Disk size: 输入你想分配给这台虚拟机的大小(例如 200GB)。
- Bus/Device: 强烈建议选择 VirtIO Block (性能损耗最小)。
- 点击 Add。
2. 虚拟机内部格式化 (以 CentOS 为例):
无需重启 VM,Linux 内核通常支持热插拔。

# 1. 查看新磁盘(通常是 /dev/vdb 或 /dev/sdb)
lsblk

# 2. 格式化磁盘(建立纯净的 EXT4 文件系统,无 ACL 干扰)
# 注意:请确认 /dev/vdb 是新盘,数据无价!
mkfs.ext4 /dev/vdb

# 3. 创建挂载点
mkdir /data

# 4. 挂载测试
mount /dev/vdb /data

# 5. 修改权限(让普通用户可写,永久解决权限问题)
chown -R <你的用户名>:<你的组名> /data
chmod 755 /data

3. 设置开机自动挂载:

# 1. 获取磁盘 UUID
blkid /dev/vdb
# 复制输出的 UUID="..."

# 2. 编辑 fstab
vi /etc/fstab

# 3. 添加以下内容(注意替换 UUID)
UUID=你的UUID值  /data  ext4  defaults  0 0


注:此时不需要 _netdev 参数,因为 PVE 已经帮我们处理好了网络层,VM 认为这就是本地硬盘。

---

第四阶段:灾难恢复演练 (核心价值)


假设最坏的情况发生了:**PVE 宿主机系统盘损坏,或者硬件彻底报废。**
你需要在一台全新的机器上重装 PVE,并找回之前存在群晖里的数据。

**前提条件**:群晖 NAS 及其数据完好。

恢复步骤


1. 重装 PVE:在修好的机器上安装全新的 Proxmox VE。
2. 重新连接 iSCSI:

- 进入新 PVE 的 Storage -> Add -> iSCSI。
- 填入群晖 IP,扫描并选中之前的 Target。
- 点击 Add。
- 此时 PVE 已经连上了数据源,但还不知道怎么读取。
3. 找回 LVM 卷组 (关键):

- 正常情况下,直接去 Storage -> Add -> LVM。
- Base Storage 选 iSCSI。
- Base Volume 下拉菜单中,你应该能看到之前的 LUN。
- 重要警告:如果 PVE 弹出提示询问 "Wipe Disk?" 或 "Initialize?",绝对选 NO!
- 如果直接添加成功,恭喜你,数据识别完毕。

如果界面无法自动识别旧数据,请使用命令行手动扫描:
打开 PVE Shell:

# 扫描物理卷,确认旧数据存在
pvs
# 输出示例:/dev/sdb   synology-lvm   lvm2 a--  <500.00g <100.00g

# 扫描卷组
vgs
# 你会看到原来的卷组名


确认卷组存在后,再通过界面 Add LVM 添加,通常就能直接挂载了。
4. 将旧磁盘挂载给新虚拟机:

- 新建一个虚拟机 (例如 ID 101)。
- 在 PVE Shell 中执行命令扫描未使用的磁盘卷:

qm rescan

- 回到虚拟机 101 的 Hardware 界面,你会惊喜地发现多了一行:Unused Disk 0。
- 双击它,点击 Add。
- 启动虚拟机。

**结果**:CentOS 启动后,/data 目录下的数据完整无缺,权限完好,仿佛什么都没发生过。

---

总结


通过 **Synology (iSCSI) -> PVE (LVM) -> VM** 的架构,我们实现了:

1. 完美的权限控制:Linux 内部使用原生 EXT4/XFS,彻底告别 NAS ACL 导致的 777 权限异常。
2. 极高的数据安全性:底层由群晖 RAID 保护,即使计算节点 (PVE) 彻底崩溃,数据依然在 NAS 中安然无恙且可秒级恢复。
3. 灵活的管理:可以在 PVE 层面对磁盘进行快照、扩容和备份,而不影响虚拟机运行。

这就是当下虚拟化环境中最推荐的**存算分离**最佳实践。