我正在研究用于嵌入式目的的 Linux 文件系统的低级内存写入。我使用以下过程创建了分区映像:
- 创建一个 4GiB 的空图像文件 ex。
dd if=/dev/null of=example.img bs=1M seek=4096
- 添加一个文件系统(ext4)
mkfs.ext4 -F example.img
- 将其安装到本地机器上
mkdir /mnt/example.img
mount -t ext4 -o loop exmaple.img /mnt/exampleimg
- 将文件系统复制到已安装的分区映像
cp -r rootfs/* /mnt/exampleimg/
- 卸载镜像
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