前言
由于我的备份全都是直接 dd 或者 ddrescue 的原始磁盘镜像,迁移的时候从小硬盘换到大硬盘自然没什么问题,但是要从大硬盘换到小硬盘就很头疼了:哪怕从 512G 的硬盘换到 500G 的硬盘,镜像也不可能完整的写下。
在网上搜索了许久,也没有找到一个完美的解决方案。在摸索了一晚上之后,笔者终于成功缩小了磁盘镜像并完整重写了 GPT 的备用分区表。在此写下这篇文章记录整个过程。
步骤
首先你得有 Linux ,Windows 的话我不会
将原始磁盘镜像挂载为 loop 设备。
使用 GParted (或者其他你熟悉的工具也可以)调整文件系统分区大小,将磁盘末尾空出来。
查看最后一个分区末尾所在的扇区。
计算出能完整保留最后一个分区所需要的文件大小(公式为 (末尾扇区号 + 34)*扇区大小)( +34 是为了给 GPT 的备用分区表和表头预留位置,如果是 DOS 分区表我就不知道了,反正加了影响也不大就是了)。然后先卸载 loop 设备,再使用 truncate 命令截断磁盘镜像文件。
# losetup -d /dev/loop0 # truncate --size=$[(631812095+34)*512] ./test.img
使用 gdisk 修正 GPT 分区表并重写备用分区表以及表头。
# gdisk /dev/loop0 GPT fdisk (gdisk) version 1.0.8 Warning! Disk size is smaller than the main header indicates! Loading secondary header from the last sector of the disk! You should use 'v' to verify disk integrity, and perhaps options on the experts' menu to repair the disk. Caution: invalid backup GPT header, but valid main header; regenerating backup header from main header. Warning! One or more CRCs don't match. You should repair the disk! Main header: OK Backup header: ERROR Main partition table: OK Backup partition table: ERROR Partition table scan: MBR: protective BSD: not present APM: not present GPT: damaged **************************************************************************** Caution: Found protective or hybrid MBR and corrupt GPT. Using GPT, but disk verification and recovery are STRONGLY recommended. **************************************************************************** Command (? for help): x Expert command (? for help): e Relocating backup data structures to the end of the disk Expert command (? for help): w Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!! Do you want to proceed? (Y/N): y OK; writing new GUID partition table (GPT) to /dev/loop0. The operation has completed successfully.
之后 resize 就完成了。如果不放心的话可以重新挂载上 loop 设备用 GParted 检查一下。
发表回复