一些背景

  • 我有一个主机跑 PVE , 我本来有一块 8T 的机械硬盘,分了 4T 给飞牛。
  • 后来感觉 4T 可能不够,就又买了一个 8T 的盘,又从新盘分了 4T 给飞牛,在里面用的是 lvm + btrfs.
  • 最近想着我本来就两块磁盘,而且 lvm 还是 stripe 的,没有 mirror, 没有 raid, 用两块磁盘纯属徒增故障率,就想把其中一块直通得了,总容量还是 8t 左右。

开始操作

操作的步骤如下:

  1. 因为我的数据是 5t 多,直接 pvmove 的话搞不定,于是先从 pve 上创建一个 2T 的磁盘给飞牛,用于周转。

         # 备份数据,删除了一部分没用的,保证文件系统用量在去除一个pv 后不会爆掉
         # 在pve 上加盘,在飞牛上加入新pv, 用于周转
         pvcreate /dev/sde
         vgextend vg-name /dev/sde
    

    我怕出故障丢数据,就把飞牛上的一些数据往移动硬盘上备份了一份,结果这速度实在是太感人了,1.8T 的数据备份了 4 个多小时。

  2. 缩文件系统

         # 停掉fnos 上的占用服务磁盘的服务,卸载 /vol1
         umount -l /vol1
         btrfs filesystem resize -4t /vol1
    

    差不多用了 5 个小时!

  3. 转移数据,移除硬盘 2

         pvmove /dev/sdc1
         vgreduce vg-name /dev/sdc1
         pvremove /dev/sdc1
    

    这一步用了将近 8 个小时,速度差不多两小时 1T, 合 145MB/s.

  4. PVE 上删除这个虚拟磁盘,然后整个磁盘直通给给飞牛

         # pve 上执行
         # source: https://pve.proxmox.com/wiki/Passthrough_Physical_Disk_to_Virtual_Machine_(VM)
         qm set 107 -scsi2 /dev/disk/by-id/ata-ST8000VN004-3CP101_WRQ0QV3T
    
  5. 把数据都转移到直通的磁盘上,移除之前的 4T 虚拟磁盘和用于周转的 2T 磁盘

         pvcreate /dev/sdc
         # 转移数据
         pvmove /dev/sdb1
         vgreduce vg-name /dev/sdb1
         pvremove /dev/sdb1
         # 周转磁盘
         pvmove /dev/sde
         vgreduce vg-name /dev/sde
         pvremove /dev/sde
    

    又是八个小时。。。

  6. btrfs 扩文件系统

         btrfs filesystem resize max /vol1
    
  7. 飞牛关机,PVE 移除磁盘,重启飞牛,大功告成!

完事

整个过程其实比较常规,而且运气不错没丢数据,但是其中几个 pvmove 耗费了大量时间,前后花了一天一夜才完成。不得不说 btrfs 扩缩文件系统都挺方便的。

而且看起来也不应该新建一个周转磁盘,直接扩原来的磁盘得了,还不用盯着啥时候 pvmove 结束。