如何从块设备挂载特定的块范围(或从文件中挂载字节范围),或者至少将其公开为循环设备而不加载完整的 MBR/GPT?
我有几个相关的用例:
假设硬盘的 MBR/GPT 损坏了,我想挂载一个起始/结束扇区已知的分区(当然还有块大小),但
dd
由于分区大小等原因,无法先挂载它我有一个文件中完整磁盘(带分区表)的备份映像,我想从中挂载特定分区,而不将所有分区公开为设备
我想通过将 FS 隐藏在具有开始/结束偏移的块设备或文件中来进行一些不明智的隐写术,以使其不那么明显(我知道由于熵和访问映射,这不是一个好选择,但这不是这里的重点)
最后一个用例更像是受第一个和第二个用例启发的黑客行为,它们是我遇到的实际问题。
我发现了一些相关的问题,例如:
- 如何将设备文件或常规文件的一部分(基于字节或块)映射到循环设备?
- https://stackoverflow.com/questions/3520459/linux-hard-disk-direct-access-without-any-fs-from-c-program
但是这些问题的(有效)答案通常是dd
分区或重新创建 MBR,但在这里这不是一个选择。
答案1
下面有一条评论这个已经链接的问题:
losetup
我找到了一个使用-o
和选项的答案--sizelimit
。
现代也mount
可以做到这一点。关于循环设备man mount
:
这种类型的安装知道大约四个选项,即
loop
,offset
和,它们实际上sizelimit
是encryption
的选项losetup
。
因此语法如下:
mount -o offset=OFFSET,other,options,here /image/file /mnt/foo
其中OFFSET
以字节为单位。通常知道 512 字节扇区的偏移量。如果起始扇区为,2048
则这很有用:
mount -o offset=$((512*2048)),other,options,here /image/file /mnt/foo
实际上您几乎不需要sizelimit
,mount
因为您挂载的文件系统知道它自己的大小。