我想在 Linux 中加入(串联)两个文件,而不使用文件系统中的空间。我可以这样做吗?
A + B = AB
该文件使用文件系统的AB
扇区或片段A
。B
是否有可能做到这一点?
我可以gparted
在不复制两个文件的情况下识别AB
为新文件吗(这是一个缓慢的过程)?
答案1
我假设您有一个非常大的磁盘映像,分为大文件f1
,f2
并且f3
想要修改该磁盘映像中的分区。然后假设所有文件的大小都是 512 的倍数,你可以这样做(作为 root)
offset=0
for f in f1 f2 f3; do
loop=$(losetup -f --show -- "$f")
size=$(blockdev --getsz "$loop")
printf '%s\n' "$offset $size linear $loop 0"
offset=$(( offset + size ))
done | dmsetup create myimg
然后您可以执行gparted /dev/mapper/myimg
,甚至格式化并安装它之后创建的分区。
要拆除该设备:
- 确保所有文件系统和其他资源都已卸载/释放
dmsetup remove myimg
losetup -d
在每个循环设备上运行。
答案2
工艺替代可用于连接两个或多个文件,使它们看起来像是一个进程的一个文件,例如some_program <(cat A B)
.
gparted
然而,与任何其他旨在修改输入文件的程序一起使用是没有任何意义的——它不是一个真正的文件,它是一个 fifo、一个匿名管道,而且它是短暂的。创建的“文件”<()
也是只读且不可查找的(即只能顺序读取)。
进程替换还包括>()
将 stdout 重定向到进程,但这对于 来说仍然没有任何用处gparted
,它期望使用真正的块设备或磁盘映像文件。