LVM:移动物理卷

在虚拟服务器(Debian GNU / Linux 8 amd64)中,我有以下磁盘和文件系统:

# pvscan PV /dev/vda1 VG vg0 lvm2 [100.00 GiB / 0 free] PV /dev/vdb1 VG vg0 lvm2 [46.56 GiB / 0 free] PV /dev/vda2 VG vg0 lvm2 [100.00 GiB / 0 free] PV /dev/vdc1 VG vg0 lvm2 [60.00 GiB / 60.00 GiB free] Total: 4 [306.55 GiB] / in use: 4 [306.55 GiB] / in no VG: 0 [0 ] # lvdisplay --- Logical volume --- LV Path /dev/vg0/root LV Name root VG Name vg0 LV UUID qpeei3-v1nW-pYVR-lK7Y-4wwy-Y4Y4-c9yQEl LV Write Access read/write LV Creation host, time nomos, 2015-03-17 16:34:05 +0100 LV Status available # open 1 LV Size 246.56 GiB Current LE 63119 Segments 3 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0 # df -h Filesystem Size Used Avail Use% Mounted on /dev/dm-0 243G 135G 98G 59% / [... no other on-disk filesystems] 

根文件系统是ext4。

由于/dev/vda有足够的空间容纳我的所有数据,我想删除/dev/vdb/dev/vdc 。 后者是作为一个临时空间,只为所需的演习提供空间。 在删除/dev/vdb1之前,应将/dev/vdb1上的数据移至/dev/vda* 。 但是,根文件系统目前跨越全部三个分区/dev/vda1/dev/vda2/dev/vdb1

问题是我只能在非常短的时间内停止使用虚拟机(几秒钟,只是重新启动),所以我不能缩小根文件系统的大小,因为这需要卸载虚拟机并保持服务器不运行相当长的时间。 如果需要,我可以添加其他磁盘,高达500GB。

我运行pvmove将数据从驱动器中移出:

 # pvmove /dev/vdb1 Detected pvmove in progress for /dev/vdb1 /dev/vdb1: Moved: 4.0% 

一直等到100%。 但是,pvmove将数据移动到/dev/vdc1

 # pvs PV VG Fmt Attr PSize PFree /dev/vda1 vg0 lvm2 a-- 100.00g 0 /dev/vda2 vg0 lvm2 a-- 100.00g 0 /dev/vdb1 vg0 lvm2 a-- 46.56g 46.56g /dev/vdc1 vg0 lvm2 a-- 60.00g 13.43g 

现在? 我可能会删除/dev/vdb1 ,但我坚持我的数据在/dev/vdc1 。 我真正需要的是将根文件系统的已分配inode从/dev/vdb1移到/dev/vda*的空闲文件系统空间。 然后,我梦想我可以移动/dev/vdb1 ,因为文件系统移动到/dev/vda* 。 我意识到这不会自动工作,但我无法想象一个迁移策略,即使手动,我也可以做,而不会缩小根文件系统。

你能帮忙吗?

以下程序只是一个想法,从来没有尝试过,但我认为它可以工作:

  1. 考虑Btrfs的利弊,事实上它并不是真正的生产准备呢 (好吧,到2015年为止 ,但是我在这个问题上还找不到更多的东西)。 我们假设你想要它。
  2. 备份备份备份
  3. 将ext4文件系统转换为Btrfs,因为Btrfs 支持从ext4进行在线迁移
  4. 收缩新的根文件系统,现在Btrfs,因为Btrfs 支持在线收缩
  5. 收缩LVM容器卷(vg0 / root)
  6. 将数据closures/dev/vdb1 (现在/dev/vdb1如果我们已经把它移到/dev/vdc1
  7. 删除/dev/vdb1 (或/dev/vdc1 /dev/vdb1
  8. 永远告别ext4

假设没有其他更好的答案张贴,我会尝试这个,并在这里报告的细节。

好的,你从vdb1分离出你的数据。 现在:

  • 使用vgreduce vg0 /dev/vdb1删除/dev/vdb1 vgreduce vg0 /dev/vdb1
  • 使用pvmove/dev/vdc1 pvmove中删除数据
  • 发出vgreduce vg0 /dev/vdc1将其从卷组中删除

在这一点上,你的数据应该只在vda*

在删除物理卷之前要非常小心 ,因为您应该确保您的数据是从要删除的设备中分离出来的。 在做任何事之前做备份

你的问题是resize2fs一个活的根文件系统,并将其缩小到200 GB。 一个可能的方法是在Unix.SE 如何缩小根文件系统的问题 。 它使用pivot_root两次,需要手动重启大多数操作系统进程和服务。 它导致最近的数据丢失,所以如果你有一个活的数据库,你就不能使用它; 说得温和一点,真是可怕。 但是,这也是人们试图取得一些成功的另一种select。