如何使用Qemu选择性克隆Windows磁盘至qcow2镜像(仅保留引导分区与C盘)
当然可以实现!这种只克隆关键分区、跳过无关数据的需求太常见了——毕竟谁也不想把几十上百GB的游戏数据白白占用镜像空间对吧?下面我就一步步带你用Qemu工具链完成这个操作:
1. 确认原磁盘的分区信息
首先得搞清楚你要克隆的两个分区对应的设备路径。在Linux环境下,你可以用lsblk或者fdisk -l命令查看,比如原磁盘是/dev/sda的话,你会看到:
/dev/sda1:100MB的引导分区(通常是FAT32格式)/dev/sda2:300GB的C盘(NTFS格式)/dev/sda3:1.7TB的游戏分区(我们要跳过它)
记好这两个要保留的分区路径,后面会用到。
2. 创建空的qcow2镜像文件
先创建一个大小刚好容纳引导分区+ C盘的空镜像,总大小设为300.1GB就够了:
qemu-img create -f qcow2 windows_clone.qcow2 300.1G
参数说明:-f qcow2指定镜像格式,后面的是镜像文件名和总大小。
3. 给空镜像创建匹配的分区表
接下来要给这个空镜像建立和原磁盘一致的分区表(比如GPT,现在Windows基本用GPT;如果原盘是MBR就改成msdos),并且创建对应大小的分区:
用parted工具操作:
# 1. 初始化分区表为GPT parted windows_clone.qcow2 mklabel gpt # 2. 创建引导分区(和原盘100MB对应,起始1MiB到101MiB) parted windows_clone.qcow2 mkpart primary fat32 1MiB 101MiB # 3. 创建C盘分区(从101MiB到300.1GiB,对应原300GB空间) parted windows_clone.qcow2 mkpart primary ntfs 101MiB 300.1GiB # 4. 标记第一个分区为可引导(和原盘一致) parted windows_clone.qcow2 set 1 boot on
注意:分区的起始、结束位置一定要和原盘对应,不然后续引导可能出问题。
4. 挂载qcow2镜像为块设备
我们需要把刚创建的qcow2镜像挂载成系统能识别的块设备,这样才能往里面克隆数据。这里用qemu-nbd工具:
# 先加载nbd内核模块(支持多分区) modprobe nbd max_part=8 # 把镜像挂载到/dev/nbd0 qemu-nbd -c /dev/nbd0 windows_clone.qcow2
挂载后,你会看到/dev/nbd0p1(新的引导分区)和/dev/nbd0p2(新的C盘分区)这两个设备节点,就像物理磁盘的分区一样。
5. 克隆分区数据到镜像里
现在可以把原分区的数据克隆到新镜像的对应分区了:
- 克隆引导分区:因为是FAT32格式,用
dd直接复制就行:
dd if=/dev/sda1 of=/dev/nbd0p1 bs=4M status=progress
bs=4M是设置块大小提升复制速度,status=progress可以实时看克隆进度。
- 克隆C盘分区:C盘是NTFS格式,用
ntfsclone比dd更高效——它只会复制分区里的有效数据,而不是整个空分区:
ntfsclone --save-image /dev/sda2 | ntfsclone --restore-image - /dev/nbd0p2
如果你的系统没有ntfsclone,可以先装ntfs-3g包(比如apt install ntfs-3g或者yum install ntfs-3g)。
6. 卸载镜像并修复引导
克隆完成后,先把nbd设备卸载:
qemu-nbd -d /dev/nbd0
这时候镜像里的分区数据已经克隆好了,但大概率引导还不能直接用——因为Windows的引导信息和磁盘UUID、分区位置绑定了。你需要用Qemu启动这个镜像,加载Windows安装介质(比如ISO文件),进入「修复计算机」模式,运行以下命令修复引导:
# 修复MBR(如果是MBR分区表) bootrec /fixmbr # 修复引导扇区 bootrec /fixboot # 重建BCD引导配置 bootrec /rebuildbcd
如果是GPT的EFI引导,可能还需要进入EFI分区,重新复制EFI引导文件到对应位置,或者用bcdboot命令重建EFI引导:
bcdboot C:\Windows /s E: /f UEFI
这里的E:是你在PE里看到的EFI引导分区盘符。
一些注意事项
- 克隆前最好在Windows PE环境下操作,或者把原磁盘的C盘和引导分区卸载,避免原分区被系统占用导致克隆失败。
- 确保原磁盘没有坏道,否则克隆过程中会出现数据错误。
- 如果原盘是MBR分区表,那创建镜像分区表时要把
mklabel gpt改成mklabel msdos,对应调整分区的起始结束参数。
备注:内容来源于stack exchange,提问作者ojek




