如何在 Linux 上安装多磁盘 Windows NTFS RAID/逻辑驱动器?

如何在 Linux 上安装多磁盘 Windows NTFS RAID/逻辑驱动器?

我办公室里有两块 500GB 的硬盘,它们来自一台旧的 Windows 笔记本电脑。老板让我尽可能将硬盘内容复制到文件服务器,但前提是绝对不能丢失任何数据。

通常情况下,备份就足够了,但这是行动初期的情况,当时备份之类的东西没有得到更严格的保存,而且这个家伙的组织能力是出了名的差,所以我不确定备份是否具有最新的(甚至是合理的最新)内容。


我做的第一件事是使用 生成映像ddrescue。分区表已正确复制的驱动器,另一个驱动器因错误丢失了约 150 KiB。映像以只读方式安装到/dev/loop1/dev/loop2使用losetupfdisk -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:00
  • mdadm -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

注意:我是在原帖者通过评论、试验和错误获得帮助后写下此答案的。考虑到其他用户,我把答案写得更广泛,更通用一些。


如果这两个磁盘一起工作,它们可能会

  1. 镜像,RAID1 风格;
  2. 或者连接,JBOD风格;
  3. 或条带化,RAID0 风格。

这些情况按从最容易处理的顺序排列。我将指导您如何区分它们,以及最终如何处理它们以安装分区。

应先进行挂载-o ro,直到您确定操作正确为止。在某些情况下mount可能会成功,并让您访问损坏的目录结构和/或混乱的文件。疯狂的数据和/或元数据表明您操作不正确。以只读方式挂载可确保您不会损害映像。


1. 镜像,RAID1 样式

在这种情况下,如果两个磁盘健康,则它们应该包含相同的数据;它们应该包含相同的有效分区表。只有您拥有的映像会/dev/loop2报告分区表。这可能是因为

  • 它们一开始就不是镜像的,
  • 或者您在其他磁盘上提到的这些错误发生在分区表所在的位置(对于 DOS 分区表,它是 MBR,即最开始的扇区号0)。

但是,有一个重要线索表明,RAID1 不太可能出现在您的案例中:表示单个磁盘上fdisk正好有扇区,但第四个分区的最后一个扇区是。这几乎是两倍,这表明分区布局产生在两个非镜像磁盘上。9767731681953533951

但是假设您的磁盘是原来的两倍大,上述线索就不适用了。如果您认为可以处理镜像磁盘,那么请使用没有错误的映像,不要管另一个映像。尝试像这样挂载分区:

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 可能是正确的设置。要访问所有分区,您需要连接图像。

我的这个答案提供了一种无需将结果写入磁盘即可连接图像的方法。对于你的情况,该过程可能是:

  1. dmsetup create mydisk
  2. 类型0 976773168 linear /path/to/the/image2.raw 0 Enter
  3. 类型976773168 976773168 linear /path/to/the/image1.raw 0 Enter
  4. 点击Ctrl+D

生成的设备应该是/dev/mapper/mydisk。尝试使用适当的方法从中挂载任何分区offset=…

要销毁该设备,请调用dmsetup remove mydisk


3. 条带化,RAID0 风格

与 JBOD 类似,如果构建 RAID0 的磁盘使用 MBR 来存储分区表,fdisk则只能在第一个磁盘上找到它。其他磁盘可能不报告任何内容或报告一些不正常的分区表;从非第一个磁盘获得看起来正常的分区表的可能性非常低,但即使如此,这个分区表也没有任何意义。

如果构建 RAID0 的磁盘使用 GPT 来存储分区表,情况就会变得复杂。根据条带大小,您可能会或可能不会从第一个磁盘获取主分区表,您可能会或可能不会从最后一个磁盘获取辅助(备份)分区表。您应该从第一个磁盘获取旧版 MBR(除非发生读取错误)。

您有两个映像,其中一个报告 DOS 分区表(即 MBR 中的分区表),另一个报告无分区表。如果它们创建 RAID0,您知道对应的那个/dev/loop2先开始。您不知道的是条带大小。一般来说,没有确切的方法可以知道它,您应该尝试常用值并分析结果。

交错图像和创建虚拟设备的过程如下:

  1. dmsetup create mydisk
  2. 类型0 1953546336 striped 2 256 /dev/loop2 0 /dev/loop1 0 Enter
  3. 点击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

相关内容