P2V Linux 物理到虚拟 KVM - 无自动化工具

P2V Linux 物理到虚拟 KVM - 无自动化工具

我有两台想要虚拟化的物理机器。

不能(物理上)将任一机器的硬盘插入将作为其 VM 主机的新机器,因此我认为复制整个系统结构dd是不可能的。

我怎样才能最好地将这些机器从硬件迁移到 KVM 环境?我已经设置了空的、未格式化的 LVM 逻辑卷来托管它们的文件系统,并了解到为虚拟机提供一个真正的分区可以实现比在文件系统上粘贴映像更高的性能。

我是否最好创建新的操作系统安装并同步差异?

值得一提的是,两台要进行 VM 的机器运行的是 CentOS 5,而主机运行的是 Ubuntu Server 10.04,这没有什么特别重要的原因。我认为这并不重要,因为 KVM 和 libvert 仍然很重要。

答案1

您可以通过 SSH 隧道将 dd 的输出传输到目标机器。我知道在 VMWare 虚拟机中可以相对成功地完成此操作。

这里的主要答案中有很好的细节,并提供了如果 SSH 没有运行时该做什么的说明(许多 liveCD 上都有 SSH 服务器,所以应该不是问题): 如何使用 dd、netcat 和 ssh 隧道设置磁盘克隆?

答案2

P2V Linux 物理到虚拟 KVM - 无自动化工具

P将正在运行的 Debian Wheezy 7.11实时迁移到VProxmox VE v5.4 上的 KVM

mdadm 软件 RAID1P磁盘到 KVM virtio 磁盘

P从大磁盘迁移到小V磁盘

前言

这些步骤的目标是获取P运行实时生产的物理 Linux 节点并对其进行虚拟化。无需创建和分配多 TB 磁盘,也不必在V客户机中使用 md raid,因为目标虚拟机管理程序 (Proxmox 5) 使用了 ZoL/ZFS。还希望减少正在运行的P节点上的停机/重启。

这些步骤可能并不完美,但它应该可以让你接近解决方案,并引用我在此过程中发现的有用链接。

在仔细搜索谷歌后,我选择在这个问题上发表一个答案https://unix.stackexchange.comhttps://serverfault.com。这似乎是与我的答案最相关的问题,尽管在撰写本文时它已有 9 年多了。

以下是我发现的一些相关问题,该答案也旨在解决这些问题:
使用 rsync 的 P2V
如何从实时服务器创建虚拟机?
如何将物理系统迁移到仅具有网络访问的 KVM 虚拟服务器?
无需关闭物理机即可将其转换为虚拟机
将物理机迁移到 KVM
vmware 转换 linux 物理机
如何将裸机 Linux 安装迁移到虚拟机

步骤1

virtio 支持

# On the P node
# check the kernel has the virtio support
grep -i virtio /boot/config-$(uname -r)
# when no, that is an issue out of scope of these instructions. contact me.

# if lsinitrd is available, check if the initramfs already has the modules
lsinitrd /boot/initrd.img-$(uname -r) | grep virtio
# when yes, your virtio is already in the initramfs, continue to next step

# when no, add the modules to the initramfs
# backup existing initrd.img
cp -iv /boot/initrd.img-$(uname -r) /boot/BACKUP_initrd.img-$(uname -r)

# non Debian way
mkinitrd --with virtio_console --with virtio_pci --with virtio_blk -f /boot/initrd.img-$(uname -r) $(uname -r)

# The Debian way
# https://wiki.debian.org/DebianKVMGuests
echo -e 'virtio_console\nvirtio_blk\nvirtio_pci' >> /etc/initramfs-tools/modules
# check correctly append new lines etc, correct manually if needed
cat /etc/initramfs-tools/modules
# compile new initramfs
update-initramfs -u

# OPTIONAL if safe
# !!! WARNING DOWNTIME -- reboot P node to test everything is ok with the new initramfs
shutdown -r now

第2步

KVM 准备 - BIOS 分区

# boot a new KVM guest on SystemRescueCD or similar

# create the BIOS/UEFI partition(s)
# https://help.ubuntu.com/community/DiskSpace#BIOS-Boot_or_EFI_partition_.28required_on_GPT_disks.29
# https://help.ubuntu.com/community/Installation/UEFI-and-BIOS/stable-alternative#Create_a_partition_table

# follow the linked guides above to create the relevant BIOS partitions/disks.

步骤 3

KVM 准备 - BOOT 和 DATA 分区

# BOOT partition
# inspect the P boot partition - note the parameters
# CRITICAL the new V boot partition should be identical to the partition on the P.
# make the V boot partition using your preferred partitioning tool


# on P node, make a copy of the boot partition
# umount the boot fs for backup
umount /boot
# backup boot partition
gzip --stdout /dev/md1 > ~user/boot.disk.md1.img.gz
# re-mount boot fs
mount /boot

# on the KVM live CD
cd /tmp # or somewhere with > some space for the boot image
scp [email protected]:boot.disk.md1.img.gz .

gunzip boot.disk.md1.img.gz
# copy the P boot partition to the V boot partition
dd if=boot.disk.md1.img of=/dev/vda1
# verify consistency
fsck.ext3 /dev/vda1

# list the detected file systems, visual check for the expected results
fsarchiver probe simple

# on the KVM live CD make your data partitions, the size you wish
# mirroring the P is not required, obviously needs to be enough space for the data.

# CRITICAL the binaries/tools used to make the data file systems must be for the same kernel generation i.e. from the node being converted, otherwise the system will fail to mount the rootfs during boot.
# https://unix.stackexchange.com/questions/267658/

# CRITICAL target file systems must have enough inodes
mkefs -t ext4 -N 1500000 /dev/vda2
mkefs -t ext4 -N 1500000 /dev/vda3

cd /mnt/
mkdir linux
mount /dev/vda2 linux/
cd linux/
mkdir -p var boot
mount /dev/vda3 var/

步骤4

rsync 数据

# consider mounting the fs ro, or at the very least stopping services for the final rsync
nohup rsync --bwlimit=7m --human-readable --itemize-changes --verbose --archive --compress --rsync-path='sudo rsync' --rsh='ssh -p22345' --exclude=/mnt --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run --exclude=/boot --exclude=/var/spool user@hostname:/ . 1>../rsync.stdout 2>../rsync.stderr

# check the logs are ok, and as expected

# final sync, stop services, and/or ro the fs(s)
rsync --bwlimit=7m --human-readable --itemize-changes --verbose --archive --compress --rsync-path='sudo rsync' --rsh='ssh -p22345' --exclude=/mnt --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run --exclude=/boot --exclude=/var/spool user@hostname:/ .

步骤 5

更新 grub

mount /dev/vda1 boot/
mkdir -p proc dev sys
mount -o bind /proc /mnt/linux/proc
mount -o bind /dev /mnt/linux/dev
mount -o bind /sys /mnt/linux/sys

chroot /mnt/linux /bin/bash

export PATH=$PATH:/bin:/sbin:/usr/sbin/ # check what is required for your P
grub-install /dev/vda
grub-install --recheck /dev/vda
update-grub

# update /etc/fstab with the new id/names/options
vim /etc/fstab

# Only required if you're P node had md RAID
# https://dertompson.com/2007/11/30/disabling-raid-autodetection-in-ubuntu/
aptitude purge mdadm

# required mount points
mkdir -p /mnt /proc /sys /dev /run

# required because I didn't rsync /var/spool
mkdir -p /var/spool/cron/atspool /var/spool/cron/crontabs /var/spool/cron/atjobs /var/spool/postfix /var/spool/rsyslog

第 6 步

测试 kvm 并在 P2V 之后进行必要的更改

# reboot to KVM guest normal boot disk

# fix a screen bug that appeared after P2V
aptitude reinstall screen

# ensure boot logging is enabled
# https://wiki.debian.org/bootlogd
aptitude install bootlogd

# networking
# check that the MAC address assigned to the KVM matches what the KVM kernel reports
ip link

# modify net interfaces, taking note of the interface name with the correct MAC address
vim /etc/network/interfaces

# update DNS if required
vim /etc/resolv.conf

# update apache2 envvars if required
vim /etc/apache2/envvars

# update hosts
vim /etc/hosts

# reboot
shutdown -r now

第 7 步

最终测试和验证

#### post reboot
# check dmesg and/or kvm console for boot it issues
dmesg -x
dmesg -x --level=err --level=warn

# check boot log for issues, useful if physical console cannot be easily viewed
# formatting: https://stackoverflow.com/q/10757823
sed 's/\^\[/\o33/g;s/\[1G\[/\[27G\[/' /var/log/boot |less -r

答案3

答案4

您可以将磁盘映像复制到 LVM 逻辑卷并将其作为 VM 的磁盘映像提供。确保在虚拟服务器上禁用 NTP 和 NTPDATE。

我使用 Mondo 转换了一些旧映像以创建可启动的恢复映像。这样我就可以在重新安装时调整分区大小。

相关内容