任务
周五遇到一个容量为300多G的SAS盘,MBR分区表,只有一个文件系统为ext4的分区,已用空间只有7GB。我们打算把SAS物理盘的数据迁移到虚拟机的磁盘文件,如何进行快速迁移呢?
方案
有两个方案比较容易想到
– 分区拷贝方案:使用resize2fs+dd进行全盘迁移
– 数据拷贝方案: 新建分区,复制MBR,PBR及数据
其中第一个方案操作较为简单,但是需要拷贝的数据为resize2fs后的容量。我们打算给目标分区留50G的空间,如果resize2fs直接调整为50G,则拷贝的时间会比较长。如果resize2fs到8GB,则resize2fs原地读写的时间会很长。所以这个方案相比而言在时间上不占优势。
而方案二,由于只在源分区上单纯读,在目标位置上单纯写,性能会最好,且直接操作文件内容,只需要拷贝7GB的数据,时间最短。
因此我们选择方案二
实操
新建磁盘文件
我们打算在磁盘上提前预留所有空间,因此采用预分配的形式创建磁盘文件
1 2 |
dd if=/dev/zero of=local66-sda-50G.img bs=1M count=51200 status=progress |
实际在RAID10的阵列上不到2分钟执行完毕。
创建分区与文件系统
首先我们将磁盘文件挂载到一台kvm虚拟机上,挂载后设备文件为vdb。
首先进行分区,执行fdisk /dev/vdb
,使用n
创建新分区,使用a
命令设置为启动分区,使用w
命令确认写入。
然后格式化分区,执行mkfs.ext4 /dev/vdb1
接下来重点来了,我们要迁移MBR和PBR及grub的coreimg。首先在旧机器A上执行以下命令
1 2 3 4 |
dd if=/dev/sda of=mbr.bin bs=1 count=446 dd if=/dev/sda of=core.img bs=512 skip=1 count=2047 dd if=/dev/sda1 of=pbr.bin bs=1 count=1024 |
接下来在kvm虚拟机上将MBR和PBR及coreimg进行还原
1 2 3 4 |
dd if=mbr.bin of=/dev/vdb dd if=core.img of=/dev/vdb bs=512 seek=1 dd if=pbr.bin of=/dev/vdb1 |
另外,我们还需要还原一下分区的UUID,保证启动时可以正常找到分区
在旧机器上使用blkid
找到sda1的UUID,保存下来
在kvm机器上使用tune2fs
进行配置
1 2 |
tune2fs -U [需要还原的UUID] /dev/vdb1 |
这样分区UUID就还原完成了
拷贝文件
首先在kvm上挂载/dev/vdb1
1 2 |
mount /dev/vdb1 /path/to/rootfs |
在旧设备上使用rsync将文件从旧设备拷贝到新分区中,由于rootfs中有挂载的/data/
和/data2/
目录,我们要忽略掉。
1 2 |
rsync -avP --numeric-ids --exclude='/dev' --exclude='/proc' --exclude='/sys' --exclude='/data' --exclude='/data2' / root@[kvm机器host]:/path/to/rootfs |
执行完成后,在kvm机器上执行ls来确认文件系统正常拷贝
至此磁盘、分区与数据均拷贝完成
验证
最后将构建好的磁盘文件挂载到最终的kvm机器,并设置为启动磁盘。
启动虚拟机,确认机器正常引导。迁移完成。