Press "Enter" to skip to content

[最佳实践] 群晖 NAS + PVE + iSCSI:打造高性能、权限完美且可灾备的虚拟化存储方案

前言:为什么要抛弃 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 imageContainer
    • 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 层面对磁盘进行快照、扩容和备份,而不影响虚拟机运行。

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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注