背景
我的一个Xen虚拟服务器需要在周末进行400G磁盘分割和调整大小,我想将停机时间缩短到最小。 磁盘使用了240G,其中235G是/ backup
目录,剩下的5G专用于普通的Debian Linux安装。 我想将磁盘分成两个磁盘 - 一个包含Linux系统的20GB磁盘,以及一个300G磁盘挂接为/ backup
。 然后我可以应用我的DRBD设置将该300G备份分区复制到另一台第二备份机。
我不想最终在不得不在物理主机上复制数据的情况,我当然不希望虚拟机在我做的时候停机。
设置图像
虚拟机的磁盘映像位于/vm/domains/b1/disk.img
和随附的swap.img
,我们不需要担心。
问题:
losetup -a
找到所有使用的环路设备。 在我的例子中,/ dev / loop20是第一个免费的设备。 接下来,我将为图像设置一个环回设备,然后安装它:
mkdir -p /mnt/loop-copy-from /mnt/loop-copy-to
losetup /dev/loop20 /vm/domains/b1/disk.img
mount /dev/loop20 /mnt/loop-copy-from
创建一个新的空稀疏图像
现在,我们不会移动/备份
,而是将其他所有内容移至新的20G图像。 我们将创建一个20G的稀疏图像文件:
dd if=/dev/zero of=/vm/domains/b1/disk-root.img bs=1k count=1 seek=$(((20*1024*1024)-1))
接下来,我们需要设置一个新的循环设备,创建一个文件系统,最后挂载这个新的图像
losetup /dev/loop21 /vm/domains/b1/disk-root.img
mkfs.ext3 /dev/loop21
mount /dev/loop21 /mnt/loop-copy-to
复制根文件系统
现在,我将从/ mnt / loop-copy-from
/ mnt / loop-copy中的所有内容复制到
235G备份目录之外:
rsync -arplogu --exclude "/backup" --stats --progress /mnt/loop-copy-from/ /mnt/loop-copy-to
清理现有的文件系统
我想从/ mnt / loop-copy-from
(备份目录除外)中删除所有内容:
cd /mnt/loop-copy-from; ls | grep -v 'backup' | xargs rm -rf
然后,我们将卸载两个设备:
umount /mnt/loop-copy-from
umount /mnt/loop-copy-to
收缩现有文件系统
我现在需要将/ dev / loop20从400G
缩小到300G:
e2fsck -f /dev/loop20
resize2fs /dev/loop20 300G
复制引导数据
然后,在销毁环回设备之前复制引导数据:
dd if=/dev/loop20 of=/dev/loop21 bs=1 count=512
losetup -d /dev/loop20
losetup -d /dev/loop21
Xen配置和VM启动
现在编辑Xen VM配置文件,在我的例子中,/ etc/xen/b1.cfg
,更改:
disk = [ 'file:/vm/domains/b1/disk.img,xvda2,w', 'file:/vm/domains/b1/swap.img,xvda1,w', ]
有:
disk = [ 'file:/vm/domains/b1/disk-root.img,xvda2,w', 'file:/vm/domains/b1/disk.img,xvda3,w', 'file:/vm/domains/b1/swap.img,xvda1,w', ]最后:
xm create b1.cfg