我正在尝试使用 Duplicity 备份 LVM 卷(注意:不仅仅是卷的文件内容,还有实际卷本身,逐字节备份)。
到目前为止,我发现最好的方法是将dd
LVM 卷上的所有数据保存到一个临时文件中,将该文件包含在备份集中,并在备份完成后将其删除。但这似乎非常低效:我毫无必要地破坏了磁盘并复制了所有数据。
似乎需要的是一种本质上与 完全相反的方法mount -o loop
。换句话说,我不想将文件挂载为块设备:相反,我想将块设备“挂载”为常规(只读)二进制文件 — Duplicity 随后会从中读取并备份该文件。
有什么方法可以实现这个吗?
答案1
有一个软件项目叫磁盘文件,一个将块设备公开为常规只读文件的 FUSE 文件系统。例如,对于文件夹mountpoint
,您可以调用diskfile /dev/dm-0 mountpoint
,然后mountpoint/dm-0
将是一个与 内容相同的常规文件/dev/dm-0
。
答案2
这并不是说 duplicity 对块设备有特殊处理,而是将其视为“块特殊文件”。例如,
$ stat /dev/dm-0
File: ‘/dev/dm-0’
Size: 0 Blocks: 0 IO Block: 4096 block special file
Device: 5h/5d Inode: 10311 Links: 1 Device type: fc,0
Access: (0660/brw-rw----) Uid: ( 0/ root) Gid: ( 6/ disk)
Access: 2015-01-15 14:19:24.674418470 -0600
Modify: 2015-01-15 14:19:20.917418645 -0600
Change: 2015-01-15 14:19:20.917418645 -0600
Birth: -
相比:
$ stat /etc/passwd
File: ‘/etc/passwd’
Size: 2740 Blocks: 8 IO Block: 4096 regular file
Device: fc00h/64512d Inode: 3802485 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2015-01-15 17:15:01.166461694 -0600
Modify: 2015-01-12 17:02:41.134820776 -0600
Change: 2015-01-12 17:02:41.201820651 -0600
Birth: -
Duplicity 将以与 tar 或 rsync 相同的方式备份块特殊文件。
唯一能想到的解决方案是编写一个融合文件系统,将所有块设备显示为常规文件。但这可能超出了这个问题的范围。
答案3
这就是块设备默认的工作方式。任何程序都可以读取它们——毕竟,dd
只需使用标准 open() 和 read() 函数即可创建映像。
答案4
这是事情已经正常运作的方式。
只需添加-r
或-o ro
到安装选项即可使其成为只读。
人坐骑
ro 与 -r 相同;以只读方式挂载文件系统 (即使超级用户也可能不会写它)。