mount -o loop 的反义词:我可以将块设备作为常规文件读取吗?

mount -o loop 的反义词:我可以将块设备作为常规文件读取吗?

我正在尝试使用 Duplicity 备份 LVM 卷(注意:不仅仅是卷的文件内容,还有实际卷本身,逐字节备份)。

到目前为止,我发现最好的方法是将ddLVM 卷上的所有数据保存到一个临时文件中,将该文件包含在备份集中,并在备份完成后将其删除。但这似乎非常低效:我毫无必要地破坏了磁盘并复制了所有数据。

似乎需要的是一种本质上与 完全相反的方法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 相同;以只读方式挂载文件系统
         (即使超级用户也可能不会写它)。

相关内容