我已经构建了一个分区大小为 3.1 GB 的 Armbian 自定义映像,现在我已经完成了它的使用。当前它被写入使用 GUID 分区表 (GPT) 的可启动 64 GB SD 卡。
我的问题是,当我想使用 Ubuntu 制作卡的图像时,我得到一个大小为 63 GB 的图像文件,但我不想要一个具有 60 GB 空白空间的图像文件。
我寻找其他方法通过使用truncate
命令来缩短图像文件,并使用创建图像dd count=
,但它不起作用。当我使用它时dd
,它会创建一个映像文件,该映像文件在安装时全部是“可用空间”和 PMBR,并truncate
会破坏工作映像文件。
那么(除非我做错了),如何创建包含启动信息的 SD 卡 3 GB 映像?
答案1
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,包括备份 GPT。