![稍微缩小 DD 映像以便克隆](https://linux22.com/image/1590689/%E7%A8%8D%E5%BE%AE%E7%BC%A9%E5%B0%8F%20DD%20%E6%98%A0%E5%83%8F%E4%BB%A5%E4%BE%BF%E5%85%8B%E9%9A%86.png)
我读过几种提出的解决方案,它们似乎都说使用 缩小用 dd 创建的图像很简单resizefs
,但它们根本不起作用。
我只需要将图像缩小约 200MB,因为它稍微太大了,无法容纳在某些容量略有差异的 CF 卡上,即使它们都是 8GB 卡。
我有一个 8GB 的图像,其中有一个使用创建的 7.8GB 分区dd
,并且使用fdisk
它看起来图像没有问题:
fdisk DISK.img
Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p
Disk DISK.img: 7.8 GiB, 8375185920 bytes, 16357785 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xb8342d9e
Device Boot Start End Sectors Size Id Type
DISK.img1 * 2048 14649343 14647296 7G 83 Linux
我需要将其缩小约 250MB 并尝试使用resizefs
,但失败了:
# resize2fs DISK.img 7.8G
resize2fs 1.44.5 (15-Dec-2018)
resize2fs: Bad magic number in super-block while trying to open DISK.img
Couldn't find valid filesystem superblock.
我究竟做错了什么?
答案1
总结
将图像写入任何容量为 8 GB 的卡并忽略no space left on device
。警告:这不是一个一般的回答所有类似的问题。
明确问题的答案
我究竟做错了什么?
您尝试对整个映像进行操作,而文件系统从偏移量开始(它位于映像内的分区内)。您的DISK.img
类似于/dev/sdx
,而您应该调用类似于;但目前目录树中resize2fs /dev/sdx1 …
没有类似的。/dev/sdx1
一般来说,您可以使用kpartx
或 之类的工具映射分区来缩小文件系统losetup
。但 在你的具体情况下您无需做任何事情。
解释
保存文件系统的分区以扇区号 结束14649343
。编号从 开始0
,逻辑扇区大小为512
字节。分区表位于 MBR 中,即扇区0
,并且(与 GPT 相反)映像末尾没有元数据。引导加载程序的初始阶段(如果有)位于 MBR 中,位于第一个分区之前。这意味着只有第一个14649344
扇区(14649344 * 512 = 7500464128
字节)很重要;超出的任何内容都可能丢失、覆盖、截断等(除非末尾未分区的空间确实包含一些有用的数据;这将是非常虽然这很不寻常,但如果你不知道这种情况,那么可能就不是这种情况)。
因此,可以将映像写入至少为7500464128
字节大小的任何设备,并且所有有用的数据都可以容纳。这大约是 7.5 GB 或 7 GiB。您使用的数字(7.8G
)指定 7.8 GiB(请参阅man 8 resize2fs
),因此它甚至比您已有的文件系统还要大(这意味着您不会萎缩首先)。
只要检查(例如使用fdisk
)您的目标设备是否至少有14649344
(逻辑)字节扇区512
即可。(注意:对于具有 4096 字节逻辑扇区的设备,您需要转换分区表;但这可能是一些大型 HDD 的问题,而不是 CF 卡的问题)。
检查目标设备是否足够大以容纳有用的数据后,将图像复制到其中(使用dd
、cp
、cat
、 等)。如果设备小于DISK.img
,您将得到no space left on device
,但这仅表示图像末尾的未使用空间不完全适合。
或者您可以先截断图像,这样最后就没有未使用的空间:
truncate -s 7500464128 DISK.img
然后fdisk -l DISK.img
会告诉您确切的14649344
扇区数。最后一个扇区(编号为14649343
)仍将是分区的最后一个扇区,但分区后将没有空间。现在,如果您将映像写入足够大的设备,您甚至不会得到no space left on device
。
理论上,文件系统可能比分区还要小,但事实可能并非如此。如果是这样,那么将分区调整为文件系统并进一步截断是可能的。我不会在这里讨论这种情况。您已有的映像应该适合任何容量为 8 GB 的卡。