我办公室里有两块 500GB 的硬盘,它们来自一台旧的 Windows 笔记本电脑。老板让我尽可能将硬盘内容复制到文件服务器,但前提是绝对不能丢失任何数据。
通常情况下,备份就足够了,但这是行动初期的情况,当时备份之类的东西没有得到更严格的保存,而且这个家伙的组织能力是出了名的差,所以我不确定备份是否具有最新的(甚至是合理的最新)内容。
我做的第一件事是使用 生成映像ddrescue
。分区表已正确复制的驱动器,另一个驱动器因错误丢失了约 150 KiB。映像以只读方式安装到/dev/loop1
并/dev/loop2
使用losetup
。fdisk -l
显示以下内容:
Disk /dev/loop1: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop2: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x87afa6ad
Device Boot Start End Sectors Size Id Type
/dev/loop2p1 2048 31459327 31457280 15G 27 Hidden NTFS WinRE
/dev/loop2p2 * 31459328 31664127 204800 100M 27 Hidden NTFS WinRE
/dev/loop2p3 31664128 1191071167 1159407040 552.9G 7 HPFS/NTFS/exFAT
/dev/loop2p4 1191071168 1953533951 762462784 363.6G 7 HPFS/NTFS/exFAT
分区大小似乎表明这是一个 RAID 阵列或 Windows 逻辑驱动器,使用快速检查blkid
显示驱动器类型为isw_raid_member
。尝试使用组装阵列mdadm -v --assemble /dev/md0 /dev/loop2 /dev/loop1
产生以下输出:
mdadm: looking for devices for /dev/md0
mdadm: Cannot assemble mbr metadata on /dev/loop2
mdadm: /dev/loop2 has no superblock - assembly aborted
我尝试安装驱动器或获取更多信息的其他方法是:
mount /dev/loop2 <mount point>
:失败unknown filesystem type 'isw_raid_member'
mount -t
使用 NTFS 和 exFAT:无法找到文件系统mount /dev/loop2p[1234]
:Special device <dev> does not exist
mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/loop[21]
:显示/dev/loop2
为 raid 0 阵列的一部分,无设备,创建日期为 1970 年 1 月 1 日 00:00:00mdadm -E /dev/loop[12]
:表示未检测到 md 超级块,/dev/loop1
并打印出分区和 MBR 幻数aa55
/dev/loop2
file -s /dev/loop1
: 印刷/dev/loop1: data
file -s /dev/loop2
:吐出一段文本,基本上说它是一个 DOS/MBR 启动扇区,并给出分区偏移量/大小的原始数字。mount -t ntfs -o ro,offset=$((512*2048)) /dev/loop2 /mnt/partition1
:NTFS signature is missing Failed to mount '/dev/loop3': Invalid argument The device '/dev/loop3' doesn't seem to have a valid NTFS
不,我没有打错
3
。不知道它是从哪里来的。
我也看了恢复失败的软件 RAID,但这似乎是为了在 Linux 上恢复已经在运行的 Linux 阵列(更不用说很多内容我都不明白)。
我能做些什么来安全地安装这些图像?
答案1
注意:我是在原帖者通过评论、试验和错误获得帮助后写下此答案的。考虑到其他用户,我把答案写得更广泛,更通用一些。
如果这两个磁盘一起工作,它们可能会
- 镜像,RAID1 风格;
- 或者连接,JBOD风格;
- 或条带化,RAID0 风格。
这些情况按从最容易处理的顺序排列。我将指导您如何区分它们,以及最终如何处理它们以安装分区。
应先进行挂载-o ro
,直到您确定操作正确为止。在某些情况下mount
可能会成功,并让您访问损坏的目录结构和/或混乱的文件。疯狂的数据和/或元数据表明您操作不正确。以只读方式挂载可确保您不会损害映像。
1. 镜像,RAID1 样式
在这种情况下,如果两个磁盘健康,则它们应该包含相同的数据;它们应该包含相同的有效分区表。只有您拥有的映像会/dev/loop2
报告分区表。这可能是因为
- 它们一开始就不是镜像的,
- 或者您在其他磁盘上提到的这些错误发生在分区表所在的位置(对于 DOS 分区表,它是 MBR,即最开始的扇区号
0
)。
但是,有一个重要线索表明,RAID1 不太可能出现在您的案例中:表示单个磁盘上fdisk
正好有扇区,但第四个分区的最后一个扇区是。这几乎是两倍,这表明分区布局产生在两个非镜像磁盘上。976773168
1953533951
但是假设您的磁盘是原来的两倍大,上述线索就不适用了。如果您认为可以处理镜像磁盘,那么请使用没有错误的映像,不要管另一个映像。尝试像这样挂载分区:
mount -o ro,offset=$((512*2048)) /dev/loop2 /mnt/partition1
mount -o ro,offset=$((512*31459328)) /dev/loop2 /mnt/partition2
mount -o ro,offset=$((512*31664128)) /dev/loop2 /mnt/partition3
等等。您甚至可能不使用losetup
获取/dev/loop2
而是直接提供文件路径,mount
应该自行创建一个循环设备并很好地处理这个问题:
mount -o ro,offset=$((512*2048)) /path/to/the/image2.raw /mnt/partition1
2. 串联,JBOD 样式
如果构建 JBOD 的磁盘使用 MBR 来存储分区表,fdisk
则只会在第一个磁盘上找到它。其他磁盘可能不报告任何内容或报告一些疯狂的分区表;从非第一个磁盘获得看似正常的分区表的可能性非常低,但即使如此,这个分区表也没有任何意义。
如果构建 JBOD 的磁盘使用 GPT 来存储分区表,则类似的工具gdisk
会在第一个磁盘上找到主表,在最后一个磁盘上找到辅助(备份)表。
您有两个映像,其中一个报告 DOS 分区表(即 MBR 中的分区表),另一个报告无分区表。如果它们创建 JBOD,您知道对应的那个/dev/loop2
先出现。
就您而言,分区 1 和 2 足够小,完全可以装入 JBOD 的第一个磁盘。您可以尝试以适当的偏移量安装它们/dev/loop2
。如果这让您可以访问合理的文件系统,那么您就会知道 JBOD 可能是正确的设置。要访问所有分区,您需要连接图像。
我的这个答案提供了一种无需将结果写入磁盘即可连接图像的方法。对于你的情况,该过程可能是:
dmsetup create mydisk
- 类型
0 976773168 linear /path/to/the/image2.raw 0
Enter - 类型
976773168 976773168 linear /path/to/the/image1.raw 0
Enter - 点击Ctrl+D
生成的设备应该是/dev/mapper/mydisk
。尝试使用适当的方法从中挂载任何分区offset=…
。
要销毁该设备,请调用dmsetup remove mydisk
。
3. 条带化,RAID0 风格
与 JBOD 类似,如果构建 RAID0 的磁盘使用 MBR 来存储分区表,fdisk
则只能在第一个磁盘上找到它。其他磁盘可能不报告任何内容或报告一些不正常的分区表;从非第一个磁盘获得看起来正常的分区表的可能性非常低,但即使如此,这个分区表也没有任何意义。
如果构建 RAID0 的磁盘使用 GPT 来存储分区表,情况就会变得复杂。根据条带大小,您可能会或可能不会从第一个磁盘获取主分区表,您可能会或可能不会从最后一个磁盘获取辅助(备份)分区表。您应该从第一个磁盘获取旧版 MBR(除非发生读取错误)。
您有两个映像,其中一个报告 DOS 分区表(即 MBR 中的分区表),另一个报告无分区表。如果它们创建 RAID0,您知道对应的那个/dev/loop2
先开始。您不知道的是条带大小。一般来说,没有确切的方法可以知道它,您应该尝试常用值并分析结果。
交错图像和创建虚拟设备的过程如下:
dmsetup create mydisk
- 类型
0 1953546336 striped 2 256 /dev/loop2 0 /dev/loop1 0
Enter - 点击Ctrl+D
生成的设备应为/dev/mapper/mydisk
。数字 256 表示条带大小为 128 KiB,必须猜对。通常,无论之前 GPT 可能遇到什么问题,如果您猜对了条带大小dmsetup
,现在gdisk -l /dev/mapper/mydisk
应该会返回一个有效的分区表。如果您猜错了,分区表可能有效也可能无效。如果它看起来有效,请尝试使用适当的值从中挂载所有分区offset=…
。
就您而言,分区表肯定就是您从中获得的分区表/dev/loop2
。
请注意,即使猜测错误,您也可能能够挂载,但文件将被打乱。在这种情况下umount
,请调用dmsetup remove mydisk
并重复dmsetup create…
使用另一个值而不是 256。要尝试的数字:8、16、32、64、128、256,也许是 2 的其他幂。如果可能,请阅读具有可验证内容(如 MP3 等媒体,它们播放时是否没有抖动?)或正式结构(如 PDF,它们打开时是否没有错误?)的文件,以判断您的猜测是否正确。小于正确的条带大小可能不会显示您的猜测是错误的,因此您应该使用 700 MB 的 avi,而不仅仅是几 KB 的文本文件。
要销毁该设备,请调用dmsetup remove mydisk
。