我需要生成几个ext2图像。显而易见的方法是创建一个图像,安装它并复制内容。但它需要两次root权限(以便chown文件并挂载图像)。我还发现了两个用于生成图像的工具:e2fsimage和genext2fs。
genext2fs在生成时将图像放在RAM中,但我的一个图像的大小为~30GiB。
e2fsimage崩溃了一些图像大小的值。
那么如何生成我的图像呢?如果该工具将自己计算图像大小,那将是很好的。
我需要生成几个ext2图像。显而易见的方法是创建一个图像,安装它并复制内容。但它需要两次root权限(以便chown文件并挂载图像)。我还发现了两个用于生成图像的工具:e2fsimage和genext2fs。
genext2fs在生成时将图像放在RAM中,但我的一个图像的大小为~30GiB。
e2fsimage崩溃了一些图像大小的值。
那么如何生成我的图像呢?如果该工具将自己计算图像大小,那将是很好的。
Answers:
找出e2fsimage
崩溃的原因。当图像大小大于4GiB时,它是由int32溢出引起的。因此,解决办法是计算需要的块和索引节点,创建循环文件(truncate
&mke2fs
),然后使用e2fsimage
与-n
参数(这样就不会创建loopfile但使用已经创建了一个)
mke2fs -d
最小的runnable示例没有 sudo
mke2fs
是e2fsprogs包的一部分。它是由著名的Linux内核文件系统开发曹子德谁是谷歌为2018年写的,并且源上游正在kernel.org在:https://git.kernel.org/pub/scm/fs/ext2 / e2fsprogs因此,该存储库可以被视为ext文件系统操作的引用userland实现:
#!/usr/bin/env bash
set -eu
root_dir=root
img_file=img.ext2
# Create a test directory to convert to ext2.
mkdir -p "$root_dir"
echo asdf > "${root_dir}/qwer"
# Create a 32M ext2 without sudo.
# If 32M is not enough for the contents of the directory,
# it will fail.
rm -f "$img_file"
mke2fs \
-L '' \
-N 0 \
-O ^64bit \
-d "$root_dir" \
-m 5 \
-r 1 \
-t ext2 \
"$img_file" \
32M \
;
# Test the ext2 by mounting it with sudo.
# sudo is only used for testing.
mountpoint=mnt
mkdir -p "$mountpoint"
sudo mount "$img_file" "$mountpoint"
sudo ls -l "$mountpoint"
sudo cmp "${mountpoint}/qwer" "${root_dir}/qwer"
sudo umount "$mountpoint"
关键选项是-d
,它选择用于图像的目录,并且它是提交0d4deba22e2aa95ad958b44972dc933fd0ebbc59中v1.43的一个相对较新的补充。
因此它适用于开箱即用的Ubuntu 18.04,它有e2fsprogs 1.44.1-1,而不是Ubuntu 16.04,它是1.42.13。
但是,我们可以像Buildroot一样在Ubuntu 16.04上轻松地从源代码编译它:
git clone git://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git
cd e2fsprogs
git checkout v1.44.4
./configure
make -j`nproc`
./misc/mke2fs -h
如果mke2fs
失败:
__populate_fs: Operation not supported while setting xattrs for "qwer"
mke2fs: Operation not supported while populating file system
添加选项时:
-E no_copy_xattrs
这是必需的,例如当根目录在NFS或tmpfs
而不是extX时,因为这些文件系统似乎没有扩展属性。
mke2fs
通常符号链接mkfs.extX
,并man mke2fs
说,如果您使用调用,如果使用这样的符号链接,则-t
暗示。
我如何找到这个以及如何解决任何未来的问题:Buildroot生成没有sudo的ext2图像,如图所示,所以我只是运行构建V=1
并从最后出现的图像生成部分中提取命令。好的旧复制粘贴从未让我失望。
TODO:描述如何解决以下问题:
du
对于文件大小和find . | wc
目录结构的初始估计,min为32Mb(较小的failes),然后加倍直到命令工作,可能是一个非常好的方法。Buildroot曾经这样做,但由于某种原因停止了,但很容易实现自己。一个图像文件中的多个分区
请参阅:https://stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-image-without-root-privileges/52850819#52850819