我想重新创建 Mac OS X 的一个功能,称为稀疏束(磁盘映像由较小的文件组成,使它们在进行小更改后易于备份)。为此,我正在寻找一种方法来“虚拟”创建一个由较小文件串联而成的单个文件(big.file 不应该使用所有这些空间,只是关联到.文件):
4096 0.file
4096 1.file
4096 2.file
4096 3.file
4096 4.file
20480 big.file
这样我就能够使用循环设备挂载 big.file,格式为 btrfs,并且在写入该磁盘时,数据应该只写入某些 .files,以便我可以轻松备份。
有什么建议我可以如何实现这一点吗?也许与 FUSE 有关?
答案1
我也在寻找这种功能并出于类似的原因(远程备份到云存储)。我还希望磁盘映像一开始很小,然后随着数据的添加而变大,就像 MacOS 稀疏捆绑磁盘映像一样。
由于我在 Linux 上找不到类似的东西,所以我最终编写了一个 FUSE 驱动程序来完成此任务:马赛克FS。
要创建由 4 MB 切片文件(76800 个文件)组成的 300 GB MosaicFS 磁盘映像,您需要执行以下操作:
# Create MosaicFS disk image
# (the individual tile files will be stored in the directory 'disk.img')
mosaicfs create --number 76800 --size 4M disk.img
# Mount disk image
# (the virtual image is mounted as 'myimage' with a size of 300 GB)
mosaicfs mount disk.img myimage
# Create file system
mkfs.ext4 myimage
# Mount it
mkdir -p /media/mydrive
mount -o loop myimage /media/mydrive
# Unmount everything
umount /media/mydrive
fusermount -u myimage
您可以使用 Linux 支持的任何文件系统。或者,您还可以使用 dm-crypt(在文件系统下方)或 EncFS(在文件系统上方)添加一层加密。
有关更多详细信息和源代码,请查看GitHub 上的 MosaicFS
答案2
实现此目的的一种方法是将每个文件创建为一个 LVM 物理卷,并将这些物理卷加入到一个卷组中,并使用该空间创建一个 LVM 逻辑卷。但这很麻烦:您需要将文件与循环设备关联起来。
dd if=/dev/zero of=0.file bs=1024k count=4
losetup /dev/loop0 0.file
pvcreate /dev/loop0
# … repeat for all parts …
vgcreate -s 1m foo /dev/loop0 /dev/loop1 …
lvcreate -l 19 -n big foo
mkfs.btrfs /dev/mapper/foo-big
您的引导脚本不太可能直接支持重新组装部件,因此您必须手动编写很多内容。
我不明白这一点:分割文件如何促进备份?许多更改可能会分布在整个卷上(例如,几个部分将包含超级块的副本)。仅备份已更改的部分不会获得太多好处:无论如何,您都需要进一步查看这些部分的内部。
如果要进行增量备份,请在文件系统级别进行备份。
如果您想对整个映像进行完整备份但忽略空白空间,请确保创建一个稀疏文件,使用有效操作稀疏文件的备份工具,并定期用零和零填充文件系统中的空白空间稀疏化它。