使用分区表的方式复制虚拟机

本文通过分区表的方式来复制虚拟机(宿主机和虚拟机都是 Centos6),我们的虚拟机有两块盘,系统盘和数据盘,系统盘分为三个部分,分别是 / 分区、swap 分区和一个 LVM,LVM 里面包含 root (或者 usr、tmp、var 等) lv。

 

原材料如下:

17h3925bj8_mbr   分区表信息,通过 dd 命令生成;

17h3925bj8_os   系统盘数据,tar 包。

17h3925bj8_lvmheader   系统盘中的 LVM header 信息(系统盘是一个 LVM);

17h3925bj8_data   数据盘镜像,qcow2 格式,是一个 LVM,只包括 /home 分区;

17h3925bj8_boot   /boot 分区镜像,通过 dd 命令生成,这里使用拷贝 boot 分区数据的方式不 work,我猜测是因为 MBR 中的 Boot loader( MBR 512 字节中的前 446 字节)会根据位置查找 boot 分区的 grub 引导文件来继续引导。

这些文件都放在 /mfs/wmi 目录下。

另外,还有 swap uuid (通过 blkid 命令获得),这里假设是 59e1e82b-7220-4093-9a98-19ce4d78c46a,创建新 swap 时用到。

 

复制的目标虚拟机名称是 vm6,所在宿主机存储池名称是 vm_storage_pool,格式是 raw。

1. 先创建系统盘和数据盘,大小和源虚拟机一样(创建之后目录是/dev/vm_storage_pool_vg/)。

# virsh vol-create-as –pool vm_storage_pool –name vm6 –capacity 18G
Vol vm6 created

# virsh vol-create-as –pool vm_storage_pool –name vm6_data –capacity 120G
Vol vm6_data created

 

2. 复制 mbr 到目标盘。

# dd if=/mfs/wmi/17h3925bj8_mbr of=/dev/vm_storage_pool_vg/vm6 bs=512 count=1 conv=notrunc

查看分区表。

# fdisk -ul /dev/vm_storage_pool_vg/vm6

Disk /dev/vm_storage_pool_vg/vm6: 19.3 GB, 19327352832 bytes
255 heads, 63 sectors/track, 2349 cylinders, total 37748736 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00081440

Device Boot Start End Blocks Id System
/dev/vm_storage_pool_vg/vm6p1 * 2048 1050623 524288 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/vm_storage_pool_vg/vm6p2 1050624 9439231 4194304 82 Linux swap / Solaris
Partition 2 does not end on cylinder boundary.
/dev/vm_storage_pool_vg/vm6p3 9439232 37748735 14154752 8e Linux LVM

 

3. 恢复 boot 分区、创建 swap、格式化 LVM 中的分区。

查看系统中已经有的 vg。

# vgdisplay | grep “VG UUID” | awk ‘{print $NF}’
DUobji-ikiZ-lrVE-OLmV-cOSY-VjSb-xNzYEF
pAmmcX-BNqu-tOdE-6cLa-s4Rn-JPaR-cojNBY
xWKyUR-qn3g-8uIo-FAQO-LFKp-VDeV-fR7ihu

映射 /dev/vm_storage_pool_vg/vm6 中的设备。

# kpartx -av /dev/vm_storage_pool_vg/vm6
add map vm_storage_pool_vg-vm6p1 (253:14): 0 1048576 linear /dev/vm_storage_pool_vg/vm6 2048
add map vm_storage_pool_vg-vm6p2 (253:15): 0 8388608 linear /dev/vm_storage_pool_vg/vm6 1050624
add map vm_storage_pool_vg-vm6p3 (253:16): 0 28309504 linear /dev/vm_storage_pool_vg/vm6 9439232

# ls /dev/mapper/vm_storage_pool_vg-vm6p*
/dev/mapper/vm_storage_pool_vg-vm6p1 /dev/mapper/vm_storage_pool_vg-vm6p2 /dev/mapper/vm_storage_pool_vg-vm6p3

# dd if=/mfs/wmi/17h3925bj8_lvmheader of=/dev/mapper/vm_storage_pool_vg-vm6p3  bs=512 count=24 conv=notrunc

boot 和 swap 好搞定,先处理。

# dd if=/mfs/wmi/17h3925bj8_boot of=/dev/mapper/vm_storage_pool_vg-vm6p1 bs=10M

# mkswap -f -U  59e1e82b-7220-4093-9a98-19ce4d78c46a /dev/mapper/vm_storage_pool_vg-vm6p2

然后处理 LVM,此时看下系统中的 vg。

# vgdisplay | grep “VG UUID” | awk ‘{print $NF}’
2tcMyv-KIqc-bfMx-7Ups-e8zT-7sV2-I35BmT
DUobji-ikiZ-lrVE-OLmV-cOSY-VjSb-xNzYEF
pAmmcX-BNqu-tOdE-6cLa-s4Rn-JPaR-cojNBY
xWKyUR-qn3g-8uIo-FAQO-LFKp-VDeV-fR7ihu

可以看出 2tcMyv-KIqc-bfMx-7Ups-e8zT-7sV2-I35BmT 是 /dev/vm_storage_pool_vg/vm6 中的 LVM vg,为了防止重名,我们修改一下 vg name(也可以使用 vgimportclone 命令,会修改 uuid 和 vg name),使用随机字符串。

# vgrename 2tcMyv-KIqc-bfMx-7Ups-e8zT-7sV2-I35BmT 82915cddce9b_vg
Volume group “vm6_vg” successfully renamed to “82915cddce9b_vg”

激活 vg。

# vgchange -ay 82915cddce9b_vg
1 logical volume(s) in volume group “82915cddce9b_vg” now active

查看 vg 中的 lvm。

# ls /dev/mapper/82915cddce9b_vg*
/dev/mapper/82915cddce9b_vg-root

格式化 lvm。

# mkfs.ext4 /dev/mapper/82915cddce9b_vg-root

此时已经搞定了 LVM。

 

4. 拷贝系统盘中除了 boot 之外的数据。

首先挂载系统盘镜像,挂载目录 /mnt,使用随机数子目录。

# mkdir /mnt/4702113420fa/

开始挂载目标虚拟机的系统盘,需要先挂载 / 分区。

# mount /dev/mapper/82915cddce9b_vg-root /mnt/4702113420fa/

此处如果除了 / 和 boot 还有其他的分区,也要挂载。

由于我们已经有了系统盘数据,此时解包就可以了:

# tar xf /mfs/wmi/17h3925bj8_os -C /mnt/4702113420fa/

# umount /mnt/4702113420fa

# vgchange -an 82915cddce9b_vg

 

5. 事实上,我们上面修改过 vg 的 name,我们需要还原 vg name。

覆盖 lvm header 即可。

执行:

# dd if=/mfs/wmi/17h3925bj8_lvmheader of=/dev/mapper/vm_storage_pool_vg-vm6p3 bs=512 count=24 conv=notrunc

 

6. 取消系统盘的映射。

# kpartx -dv /dev/vm_storage_pool_vg/vm6

 

7. 删除临时挂载目录。

# rm -rf /mnt/4702113420fa

 

8. 对数据盘创建 LVM,创建分区和格式化文件系统,拷贝数据。

这里不写了,参考这里

 

9. 新虚拟机的镜像完全准备好了,此时可以创建虚拟机配置文件,修改虚拟机和启动虚拟机,此处略去。

 

 

http://manuel.kiessling.net/2013/03/19/converting-a-running-physical-machine-to-a-kvm-virtual-machine/

http://www.thegeekstuff.com/2011/02/linux-boot-process/

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/3/html/Reference_Guide/s1-boot-init-shutdown-process.html

https://zh.wikipedia.org/wiki/GNU_GRUB

构建机房运维基础架构(四): 机器装机初始配置(DELL)

我们的服务器基本是DELL的,所以下面的配置是针对DELL 最新的R420 R720等服务器的,机器在经过下面的配置之后运到机房,插线之后即可通过SN解析到控制卡IP。

其他机器型号(HP,HUAWEI等)的配置找其他资料哈。

 

1.  把第一块网卡设置成 none,第二块网卡设置成 PXE 启动模式(出厂默认第一块网卡是PXE模式,我们自己用第二块网卡装机,所以给第一块关掉。)

如下:

CTRL + S 进入配置

cc9fb7c0985a670ee56e917d11b8cad4

 

2. 关于远程控制卡,需要设置为 Dedicated 模式,开启 DHCP,并使用DHCP获取到的DNS (因为我们的远程控制卡IP是自动获取的,用来装机,这点很重要)

222

8388bd6b0ea330eaa5349e772bb54080

76c9349f8bd80b57dc6521d6066192bd

 

3. Boot Mode 和 Boot Seq 设置  (720 720xd等 默认是UEFI,把它改成 BIOS;启动顺序 为 Hard drive C:,第二块网卡,第一块网卡。 )

3dacb5207bfe3be34b84b8dda1b02dbc

4fff19561d207d2b03ab04bf8071847f

 

 

 

这里只列出了自动装机需要的配置,其他的配置比如电源设置、风扇设置等没写,可以参考:

https://www.evernote.com/shard/s240/sh/292d15ba-404d-4d54-912e-ff5fa325713d/c67904c014276b864364104b48017612