通过 Live CD/USB 做 Windows 10 的 P2V 到 KVM 上

上次说到把一块之前的 SATA 物理盘,通过 USB 物理挂接到 KVM Host 上实现 P2V,但是如果是一台远程的服务器,或者笔记本电脑,反正硬盘不能拆卸的情形下,我们怎样把硬盘里的操作系统克隆成虚拟机呢?

环境:一台 笔记本电脑上的 Windows 10 专业版,一台同一个局域网内的 Linux 机器(可以运行 nc 命令监听,有足够的磁盘空间)
工具:一个 8GB或者 16GB 的 U盘,刻录了任何 Linux 操作系统能启动安装就可以。

步骤:
笔记本电脑,从 U盘启动,进入 Linux 安装界面,不是真实的安装, 只要到检测到网卡,网络能工作就可以,然后按 Ctr-Alt-F3 或者 F4~F6,看自己喜欢。反正就是进入命令行界面。
确认能 ping 通 KVM 主机
# ping 192.168.7.100
没有 fdisk 命令,用 blkid 看下系统内的磁盘,然后 dmesg|grep sdX X 是看到的磁盘的字母 a 或者 b 或者 c 等,确定要克隆的设备名称,假定为 /dev/sda

在命令行下 运行
# nc if=/dev/sda |nc 192.168.7.100 6500
也就是把数据写往 192.168.7.100 的 6500 端口
这里的 nc 命令其实是 busybox 命令的昵称

然后在 KVM Host 上启动 nc 的 Listen:
# nc -l -p 6500 > win10_sda.raw
经过漫长的网络读写后,笔记本电脑上的 nc 会自动结束,标记 recrods in/out 的数据。
在 KVM Host 上,我们用 qemu-img info 查看写好的文件:

这个时候无需做任何的其他操作,我们只要把这个 raw Image 挂接为 ide 方式,就能直接启动了!

新问题来了,原始磁盘实际上我事先做了空间整理, 250GB 的 SSD,实际大概只使用了 90多GB,而且有一个分区都被我删除了。 但是导出来的 raw 文件还是 250GB,怎么办呢?

我们用 losetup -vf win10.raw 把 raw 文件做回环挂接, fdisk -l /dev/loop1 就可以看到原始的磁盘的分区信息了。 我们只要第一个分区的数据,所以用 dd 重新把 raw 文件写到一个新的 raw 文件:
dd if=win10.raw of=win10_shrinked.raw bs=512 count=xxxx
就可以得到一个实际原来分区的新的映像文件。

这样我们只要 virsh edit 用新的文件名替换原先的 raw 文件名,就能成功的启动 Win 10 了。
当然, 我们同时可以挂接 virtio-win 的 iso 映像,然后进入 Win 10 虚拟机更新 PCI/网卡/视频驱动。
但是 Win10 的视频驱动有问题, 不能识别, 需要 qxldod 驱动。
另外,原先的 License 都丢失了, 需要重新激活 Win 10. 🙁

我们可以通过 Windows 上安装的 virt-viewer 连接到 Spice 上,
输入 spice 连接为: 远程 KVM 主机 + 端口号(一般为 5900)
取决于你 虚拟机的 spice 设置,需要修改 listen 的地址 127.0.0.1 修改为 0.0.0.0,然后端口如果是默认的话,会自动启动新的端口,也就是说如果有10个虚拟机在跑,第一个是 5900,那么新开启的虚拟机 spice 端口就是 5901 了。
当然如果虚拟机 IP 地址已经拿到, 通过 RDP 到虚拟机的 IP 当然更方便。



作者: 甬洁网络

--移动互联网&物联网技术提供商