分区和磁盘映像的用户空间操作

dre*_*lax 5 linux hard-drive filesystems partitioning disk-image

在 Linux 系统上,是否可以仅使用用户空间工具来创建和操作分区映像(其中可能只有 ext2 文件系统),然后使用这些分区映像来创建磁盘映像?

我可以用来genext2fs在用户空间中生成 ext2 文件系统的映像,但是我找不到任何无需 root 访问即可操作磁盘映像的工具(例如,创建分区表或从现有分区映像创建磁盘映像等) . 目前,我正在使用kpartx将分区挂载到磁盘映像中,但是因为这需要 root,所以它并不真正适合编写脚本,并且如果构建脚本中存在未捕获的错误,映射器设备继续使用。

基本上,我有三个目录,我希望每个目录都成为磁盘映像上的一个分区,但是我想编写脚本,而且我真的不想使用任何需要 root 访问权限的工具(这似乎没有任何内容)绝对需要具有 root 访问权限的进程)。

Cel*_*ibi 4

分区创建

要制作分区表,您可以直接在文件而不是设备上使用常用工具。大多数标准工具应该支持这种用法,例如fdiskpartedparted集成到脚本中非常好,因为它可以将命令作为参数。

parted -s testing.img mklabel gpt
parted -s -a none testing.img mkpart ESP fat32 0 4M
parted -s -a none testing.img mkpart linux ext4 4M 10M
Run Code Online (Sandbox Code Playgroud)

文件系统创建

我没有一个干净的解决方案来在虚拟分区中安装或创建文件系统。正确的做法可能是fuse为分区表提供一个(用户空间中的文件系统)驱动程序。但我暂时还没有找到。

但是,mke2fs可以选择在文件内的任意偏移处-E offset=1234构建ext2,ext3或文件系统。ext4您可以为其指定分区的偏移量。但是,请务必为其指定文件系统的大小,因为默认行为似乎有问题,并且默认情况下会使用虚拟磁盘的大小写入文件系统,并在需要时扩展文件。

mke2fs -E offset=4000256 testing.img 6316k
Run Code Online (Sandbox Code Playgroud)

不幸的是,并非所有人都有mkfs这样的选择。mkfs.vfat没有。因此,另一种解决方案可以是创建一个与分区大小相同的单独文件,使用mkfs它,然后dd将内容复制到完整的虚拟磁盘中。

dd if=testing.img of=testing.fat32.img bs=512 skip=34 count=7779
mkfs -t vfat testing.fat32.img
dd if=testing.fat32.img of=testing.img bs=512 seek=34 count=7779 conv=notrunc
Run Code Online (Sandbox Code Playgroud)

这不是最干净或最快的解决方案,但它有效,它非常通用,并且不需要 root 权限。转换选项sparse还可以通过不写入长的零序列来加快速度。

挂载文件系统

您可以在分区中安装文件系统,前提是fuse它支持您的文件系统。有一个ext针对 名称下的文件系统的标准支持fuse-ext2,以及一个针对FAT名称下的文件系统的标准支持fusefatoffset不幸的是,他们目前没有选择。所以我猜你一定会使用或与之前mount相同的技巧。dd

partx带或 的标准方法kpartx(或-o offset的选项mount)需要 root 权限。该dd解决方案速度慢、复杂且容易出错。