我已经构建了一个分区大小为 3.1 GB 的 Armbian 自定义映像,现在我已经完成了它的工作。它当前被写入使用 GUID 分区表 (GPT) 的可引导 64 GB SD 卡。
我的问题是,当我想使用 Ubuntu 制作卡的图像时,我得到一个 63 GB 大小的图像文件,但我不想要一个有 60 GB 空白空间的图像文件。
我寻找通过使用truncate
命令缩短图像文件的其他方法,并使用创建图像dd count=
但它不起作用。当我使用dd
它时,它会创建一个图像文件,该文件在安装时是所有“可用空间”和 PMBR,并truncate
会破坏一个工作图像文件。
所以(除非我做错了),我怎样才能创建一个包含启动信息的 SD 卡的 3 GB 映像?
truncate
是一个很好的工具。您需要缩小映像,因此它包含分区表中定义的每个分区。换句话说,如果最接近末端的分区的末端扇区是N
(注意它不一定是编号最高的分区),N+1
则需要图像的扇区(+1
因为编号从 开始0
)。使用
gdisk -l image
来了解N
.该卡很可能使用 512 字节扇区,并且分区表在根据 512 字节扇区解释时是有效的(为了比较:看看当这个假设不成立时会发生什么)。所以你需要
(N+1)*512
字节(或更多,拥有更多并不是致命的)。truncate
因此。首先直接从卡中读取这个字节数会给你同样的结果。一种简单的方法(尽管非 POSIX,请参阅此)是
head -c number-of-bytes-here /dev/sdx > image
.然后,您需要 33 个额外的逻辑扇区用于辅助(备份)GPT。再次使用
truncate
并将33*512
字节添加到文件 (truncate -s +16896 image
)。truncate
我们可以使用第一个(或使用 阅读更多)将图像缩小到所需的最终大小head
,但是分两步执行此操作会导致这额外的 33 个扇区包含零,而不是可能会立即干扰的垃圾。第一次截断(或创建部分图像)丢弃了原始的辅助 GPT。使用
gdisk image
并让它解决问题。它会告诉你disk size is smaller than the main header indicates
和invalid backup GPT header, but valid main header; regenerating backup header from main header
。多亏了第二个truncate
,才有了备用 GPT 的空间。您只需要“将w
表写入磁盘并退出”;该工具将重写 GPT,包括备份的。