如何生成大ext4分区的小镜像?

如何生成大ext4分区的小镜像?

我正在研究用于嵌入式目的的 Linux 文件系统的低级内存写入。我使用以下过程创建了分区映像:

  1. 创建一个 4GiB 的空图像文件 ex。 dd if=/dev/null of=example.img bs=1M seek=4096
  2. 添加一个文件系统(ext4) mkfs.ext4 -F example.img
  3. 将其安装到本地机器上 mkdir /mnt/example.img mount -t ext4 -o loop exmaple.img /mnt/exampleimg
  4. 将文件系统复制到已安装的分区映像 cp -r rootfs/* /mnt/exampleimg/
  5. 卸载镜像 umount /mnt/exampleimg

将创建的映像写入我需要替换的分区的第一个扇区后,一切正常,并且我可以访问数据,问题是,我需要复制整个 16GB 分区,而其上的数据只有 2GB,并且花费了很多时间。

我使用相同的数据创建了较小的映像,它可以工作,但我不能超过分区映像的固定大小。系统看到分区大小仍然很大(fdisk -l /dev/mmcblok0,扇区计数在/sys/class/block/mmcblkop2/size中),可能是因为分区表尚未更改,但在复制文件更大的情况下比图像上的可用空间(不是分区的实际大小)我得到 cp: write error: No space left on device。

之后我无法在目标Linux上使用后修改分区大小,因为这是Linux正在运行的根文件系统的分区。有没有什么方法可以创建假尺寸/没有不必要限制的图像?我想获取带有数据的 16GB 分区的映像,而映像大小小于 16GB。

答案1

像你一样做所有事情(即创建一个小图像,按原样复制它),但最后一步是

resize2fs -p /dev/mmcblok0

答案2

之后我无法在目标Linux上使用后修改分区大小,因为这是Linux正在运行的根文件系统的分区。

扩展文件系统时情况并非如此。这resize2fs 手册说:

如果文件系统已安装,则可以使用它来扩展已安装文件系统的大小,假设内核支持在线调整大小。 (截至撰写本文时,Linux 2.6 内核支持使用 ext3 和 ext4 挂载的文件系统在线调整大小。)。

因此,您可以创建一个更小的图像,将其复制到设备上,然后使用 resize2fs 来扩展文件系统:

resize2fs /dev/mmcblok0

有一种替代方法取决于您所使用的硬件。它很复杂,因此我可以给出该技术的概述,但我会避免写出使用该技术的确切步骤。

该技术是使用重新配置的引导加载程序创建映像。
它被设计为直接从 SD 卡运行。引导加载程序启动 Linux,告诉它直接运行脚本(而不是常规的/sbin/init)。然后脚本:

  • 格式化内部闪存
  • 将内部闪存安装到 /mnt
  • 将 SD 卡上的所有文件复制到 /mnt
  • 重新配置 /mnt/boot 中的引导加载程序以运行 /sbin/init 而不是脚本。
  • 关闭 Linux

相关内容