SJ's Here
SJ's Here

缩小使用 GPT 分区表的原始磁盘镜像

前言

由于我的备份全都是直接 dd 或者 ddrescue 的原始磁盘镜像,迁移的时候从小硬盘换到大硬盘自然没什么问题,但是要从大硬盘换到小硬盘就很头疼了:哪怕从 512G 的硬盘换到 500G 的硬盘,镜像也不可能完整的写下。

在网上搜索了许久,也没有找到一个完美的解决方案。在摸索了一晚上之后,笔者终于成功缩小了磁盘镜像并完整重写了 GPT 的备用分区表。在此写下这篇文章记录整个过程。

步骤

首先你得有 Linux ,Windows 的话我不会

将原始磁盘镜像挂载为 loop 设备。

使用 GParted (或者其他你熟悉的工具也可以)调整文件系统分区大小,将磁盘末尾空出来。

https://blog.seraphjack.top/wp-content/uploads/2021/09/image.png
调整完后磁盘末尾有部分空闲

查看最后一个分区末尾所在的扇区。

https://blog.seraphjack.top/wp-content/uploads/2021/09/image-1.png
此处例子为 631812095

计算出能完整保留最后一个分区所需要的文件大小(公式为 (末尾扇区号 + 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 检查一下。

https://blog.seraphjack.top/wp-content/uploads/2021/09/image-3.png
resize 完的磁盘镜像

发表评论

textsms
account_circle
email

SJ's Here

缩小使用 GPT 分区表的原始磁盘镜像
前言 由于我的备份全都是直接 dd 或者 ddrescue 的原始磁盘镜像,迁移的时候从小硬盘换到大硬盘自然没什么问题,但是要从大硬盘换到小硬盘就很头疼了:哪怕从 512G 的硬盘换到 500G 的…
扫描二维码继续阅读
2021-09-28