如何从磁盘映像中提取文件而不安装它?

如何从磁盘映像中提取文件而不安装它?

假设我有一个有权读取的磁盘映像(可能已分区)。但是,我无权通过环回*安装它。理论上,数据就在那里;但实际上,数据已经存在了。我可以编写类似于 Linux 内核、分区编辑器和mount自己的代码的代码来解析映像、查找分区、解释文件系统并提取文件。但是 GNU/Linux 系统上已经存在这样的工具了吗?

*真的,我正在编写工具来处理它,并且我不想(a)假设这些工具的用户可以sudo并且(b)要求它们到达sudo可能不需要的地方。

(如果答案根据文件系统而变化,ext2-4对我来说更重要。但是涵盖多个流行文件系统的答案将是首选。)

答案1

7z(来自 p7zip)可以从许多但不是全部常见的 VM 磁盘映像、分区方案和文件格式中解压磁盘和文件系统映像。 https://www.7-zip.org/有列表(并且可以在 Windows 中使用 - p7zip 是 Linux/Posix 端口)

请注意,这通常是一个两步过程:

$ 7z l [raw HD image file]

Path = [raw HD image file]
Type = MBR
Physical Size = 42949672960

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
                    .....    104857600    104857600  0.ntfs
                    .....  42842718208  42842718208  1.ntfs
                    .....      1048576      1048576  2
------------------- ----- ------------ ------------  ------------------------
                           42948624384  42948624384  3 files

下一步:

$ 7z x [raw image file] 0.ntfs
Extracting archive: [raw Image file]

最后

$ 7z l 0.ntfs
   
Scanning the drive for archives:
1 file, 104857600 bytes (100 MiB)

Listing archive: 0.ntfs

--
Path = 0.ntfs
Type = NTFS
Physical Size = 104857600
Label = System Reserved
File System = NTFS 3.1
Cluster Size = 4096
Sector Size = 512
Record Size = 1024
Created = 2013-09-10 16:20:30
ID = 591300999067013540

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2013-09-10 16:20:30 ..HS.       262144       262144  [SYSTEM]/$MFT
[Lots of files]
2013-09-10 16:23:30 .RHSA         8192         8192  BOOTSECT.BAK
------------------- ----- ------------ ------------  ------------------------
2014-10-14 16:35:50           23880514     23957604  56 files, 31 folders
2013-09-10 16:20:30            1314956      1318920  3 alternate streams
2014-10-14 16:35:50           25195470     25276524  59 streams

答案2

分机[234]

如果 /dev/whatever 的根目录中有一个文件foo

debugfs -f <(echo cat /foo) /dev/whatever | tail -n +2 > /restore/file

一般的做法

一种通用方法是创建一个具有两个磁盘驱动器(原始模式下的文件)的虚拟机,一个是映像(以只读方式提供给虚拟机),另一个用于恢复文件(如果无法使用网络来传输文件) 。

您应该能够从映像启动(如果不能:创建一个具有三个磁盘驱动器的虚拟机,一个用于启动),从而能够轻松访问文件系统。

由于无法挂载,因此必须以某种无需文件系统即可识别的形式写入数据,例如

tar -cf /dev/vdc /etc/passwd

在主机上您可以简单地读取图像文件:

tar -xf imagefile.img

tar识别存档的末尾并忽略文件的其余部分。

相关内容