Linux

如何使用 mdadm 從磁碟映像而不是磁碟驅動器(重新)建構/創建/組裝 ISM RAID-0 陣列?

  • July 18, 2018

問題:使用 Linux 和 mdadm,我如何從英特爾快速儲存技術 RAID-0 陣列(格式化為 NTFS,安裝了 Windows 7)中使用的硬碟製作的磁碟映像中讀取/複製數據作為文件?

問題:陣列中的一個驅動器壞了,所以我想在更換驅動器之前複製盡可能多的數據(從而破壞陣列)。

如果他們解決了我的問題,我願意接受這個問題的替代解決方案。

背景

我有一台帶有英特爾快速儲存技術控制器(在各種上下文中稱為 RST、RSTe 或 IMSM)的筆記型電腦,該控制器具有兩 (2) 個配置為 RAID-0 (FakeRAID-0) 的硬碟。RAID-0 不是我的選擇,因為筆記型電腦是以這種配置傳遞給我的。其中一個磁碟似乎積累了很多壞扇區,而另一個磁碟則完全正常。總之,這些磁碟仍然足夠健康,可以啟動到作業系統(Windows 7 64 位),但作業系統有時會在訪問損壞的磁碟區域時掛起,繼續嘗試使用損壞的磁碟似乎是個壞主意。我想從磁碟上複製盡可能多的數據,然後更換損壞的驅動器。由於在損壞的磁碟上實時操作被認為是不好的,所以我決定對兩個磁碟都進行映像,以便以後可以使用 mdadm 或類似的工具安裝映像。我花了很多時間並做了很多閱讀,但我仍然沒有成功地將磁碟映像掛載為(假)RAID-0 陣列。我會試著回憶一下我在這裡執行的步驟。拿一些零食和飲料,因為這很長。

首先,我有一個 USB 外部驅動器來執行 Ubuntu 15.10 64 位分區。使用 LiveCD 或小型 USB 拇指驅動器更容易啟動,但比外部設備慢(而且 LiveCD 不是持久安裝)。我安裝了 ddrescue 並用它來生成每個硬碟的映像。創建圖像沒有明顯的問題。

獲得圖像後,我使用 apt 安裝了 mdadm。但是,這安裝了 2013 年以來的較舊版本的 mdadm。較新版本的更改日誌表明對 IMSM 的支持更好,因此我使用本指南編譯並安裝了 mdadm 3.4 ,包括升級到 4.4.2 或更高版本的核心。這裡唯一值得注意的問題是一些測試沒有成功,但指南似乎表明這是可以接受的。

在那之後,我在幾個 地方讀到了我需要使用環回設備才能使用圖像的地方。我將磁碟映像安裝為 /dev/loop0 和 /dev/loop1 沒有問題。

以下是此過程中的一些相關資訊…

mdadm –detail 平台:

$ sudo mdadm --detail-platform
      Platform : Intel(R) Rapid Storage Technology
       Version : 10.1.0.1008
   RAID Levels : raid0 raid1 raid5
   Chunk Sizes : 4k 8k 16k 32k 64k 128k
   2TB volumes : supported
     2TB disks : not supported
     Max Disks : 7
   Max Volumes : 2 per array, 4 per controller
I/O Controller : /sys/devices/pci0000:00/0000:00:1f.2 (SATA)
         Port0 : /dev/sda (W0Q6DV7Z)
         Port3 : - non-disk device (HL-DT-ST DVD+-RW GS30N) -
         Port1 : /dev/sdb (W0Q6CJM1)
         Port2 : - no device attached -
         Port4 : - no device attached -
         Port5 : - no device attached -

fdisk -l:

$ sudo fdisk -l
Disk /dev/loop0: 298.1 GiB, 320072933376 bytes, 625142448 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: 0x2bd2c32a

Device       Boot   Start        End    Sectors   Size Id Type
/dev/loop0p1 *       2048    4196351    4194304     2G  7 HPFS/NTFS/exFAT
/dev/loop0p2      4196352 1250273279 1246076928 594.2G  7 HPFS/NTFS/exFAT


Disk /dev/loop1: 298.1 GiB, 320072933376 bytes, 625142448 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/sda: 298.1 GiB, 320072933376 bytes, 625142448 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x2bd2c32a

Device     Boot   Start        End    Sectors   Size Id Type
/dev/sda1  *       2048    4196351    4194304     2G  7 HPFS/NTFS/exFAT
/dev/sda2       4196352 1250273279 1246076928 594.2G  7 HPFS/NTFS/exFAT


Disk /dev/sdb: 298.1 GiB, 320072933376 bytes, 625142448 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

mdadm –examine –verbose / dev / sda:

$ sudo mdadm --examine --verbose /dev/sda
/dev/sda:
         Magic : Intel Raid ISM Cfg Sig.
       Version : 1.0.00
   Orig Family : 81bdf089
        Family : 81bdf089
    Generation : 00001796
    Attributes : All supported
          UUID : acf55f6b:49f936c5:787fa66e:620d7df0
      Checksum : 6cf37d06 correct
   MPB Sectors : 1
         Disks : 2
  RAID Devices : 1

[ARRAY]:
          UUID : e4d3f954:2f449bfd:43495615:e040960c
    RAID Level : 0
       Members : 2
         Slots : [_U]
   Failed disk : 0
     This Slot : ?
    Array Size : 1250275328 (596.18 GiB 640.14 GB)
  Per Dev Size : 625137928 (298.09 GiB 320.07 GB)
 Sector Offset : 0
   Num Stripes : 2441944
    Chunk Size : 128 KiB
      Reserved : 0
 Migrate State : idle
     Map State : normal
   Dirty State : clean

 Disk00 Serial : W0Q6DV7Z
         State : active failed
            Id : 00000000
   Usable Size : 625136142 (298.09 GiB 320.07 GB)

 Disk01 Serial : W0Q6CJM1
         State : active
            Id : 00010000
   Usable Size : 625136142 (298.09 GiB 320.07 GB)

mdadm –examine –verbose /dev/sdb:

$ sudo mdadm --examine --verbose /dev/sdb
/dev/sdb:
         Magic : Intel Raid ISM Cfg Sig.
       Version : 1.0.00
   Orig Family : 81bdf089
        Family : 81bdf089
    Generation : 00001796
    Attributes : All supported
          UUID : acf55f6b:49f936c5:787fa66e:620d7df0
      Checksum : 6cf37d06 correct
   MPB Sectors : 1
         Disks : 2
  RAID Devices : 1

 Disk01 Serial : W0Q6CJM1
         State : active
            Id : 00010000
   Usable Size : 625137928 (298.09 GiB 320.07 GB)

[ARRAY]:
          UUID : e4d3f954:2f449bfd:43495615:e040960c
    RAID Level : 0
       Members : 2
         Slots : [_U]
   Failed disk : 0
     This Slot : 1
    Array Size : 1250275328 (596.18 GiB 640.14 GB)
  Per Dev Size : 625137928 (298.09 GiB 320.07 GB)
 Sector Offset : 0
   Num Stripes : 2441944
    Chunk Size : 128 KiB
      Reserved : 0
 Migrate State : idle
     Map State : normal
   Dirty State : clean

 Disk00 Serial : W0Q6DV7Z
         State : active failed
            Id : 00000000
   Usable Size : 625137928 (298.09 GiB 320.07 GB)

這是我遇到困難的地方。我試圖組裝陣列。

$ sudo mdadm --assemble --verbose /dev/md0 /dev/loop0 /dev/loop1
mdadm: looking for devices for /dev/md0
mdadm: Cannot assemble mbr metadata on /dev/loop0
mdadm: /dev/loop0 has no superblock - assembly aborted

通過使用 –force 或交換 /dev/loop0 和 /dev/loop1,我得到了相同的結果。

由於 IMSM 是 CONTAINER 類型的 FakeRAID,我看到一些跡象表明您必須創建容器而不是組裝它。我試過…

$ sudo mdadm -CR /dev/md/imsm -e imsm -n 2 /dev/loop[01]
mdadm: /dev/loop0 is not attached to Intel(R) RAID controller.
mdadm: /dev/loop0 is not suitable for this array.
mdadm: /dev/loop1 is not attached to Intel(R) RAID controller.
mdadm: /dev/loop1 is not suitable for this array.
mdadm: create aborted

在閱讀了更多內容之後,似乎這裡的罪魁禍首是 IMSM_NO_PLATFORM 和 IMSM_DEVNAME_AS_SERIAL 在嘗試讓環境變數與 sudo 保持一致之後,我嘗試了…

$ sudo IMSM_NO_PLATFORM=1 IMSM_DEVNAME_AS_SERIAL=1 mdadm -CR /dev/md/imsm -e imsm -n 2 /dev/loop[01]
mdadm: /dev/loop0 appears to be part of a raid array:
      level=container devices=0 ctime=Wed Dec 31 19:00:00 1969
mdadm: metadata will over-write last partition on /dev/loop0.
mdadm: /dev/loop1 appears to be part of a raid array:
      level=container devices=0 ctime=Wed Dec 31 19:00:00 1969
mdadm: container /dev/md/imsm prepared.

那是東西。仔細看看…

$ ls -l /dev/md
total 0
lrwxrwxrwx 1 root root 8 Apr  2 05:32 imsm -> ../md126
lrwxrwxrwx 1 root root 8 Apr  2 05:20 imsm0 -> ../md127

/dev/md/imsm0 和 /dev/md127 與物理磁碟驅動器(/dev/sda 和 /dev/sdb)相關聯。/dev/md/imsm(指向/dev/md126)是新創建的基於環回設備的容器。仔細看看那個…

$ sudo IMSM_NO_PLATFORM=1 IMSM_DEVNAME_AS_SERIAL=1 mdadm -Ev /dev/md/imsm
/dev/md/imsm:
         Magic : Intel Raid ISM Cfg Sig.
       Version : 1.0.00
   Orig Family : 00000000
        Family : ff3cb556
    Generation : 00000001
    Attributes : All supported
          UUID : 00000000:00000000:00000000:00000000
      Checksum : 7edb0f81 correct
   MPB Sectors : 1
         Disks : 1
  RAID Devices : 0

 Disk00 Serial : /dev/loop0
         State : spare
            Id : 00000000
   Usable Size : 625140238 (298.09 GiB 320.07 GB)

   Disk Serial : /dev/loop1
         State : spare
            Id : 00000000
   Usable Size : 625140238 (298.09 GiB 320.07 GB)

   Disk Serial : /dev/loop0
         State : spare
            Id : 00000000
   Usable Size : 625140238 (298.09 GiB 320.07 GB)

看起來沒問題。讓我們嘗試啟動陣列。我發現資訊(這里這裡)說使用增量裝配模式來啟動一個容器。

$ sudo IMSM_NO_PLATFORM=1 IMSM_DEVNAME_AS_SERIAL=1 mdadm -I /dev/md/imsm

那沒有給我任何東西。讓我們使用詳細標誌。

$ sudo IMSM_NO_PLATFORM=1 IMSM_DEVNAME_AS_SERIAL=1 mdadm -Iv /dev/md/imsm
mdadm: not enough devices to start the container

哦,打擾了。讓我們檢查一下 /proc/mdstat。

$ sudo cat /proc/mdstat 
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md126 : inactive loop1[1](S) loop0[0](S)
     2210 blocks super external:imsm

md127 : inactive sdb[1](S) sda[0](S)
     5413 blocks super external:imsm

unused devices: <none>

好吧,這看起來不對 - 塊的數量不匹配。仔細查看我嘗試組裝時的消息,似乎 mdadm 說“元數據將覆蓋 /dev/loop0 上的最後一個分區”,所以我猜測與 /dev/loop0 關聯的圖像文件已被沖洗掉。謝天謝地,我有這些圖像的備份副本,所以我可以抓取它們並重新開始,但即使通過 USB3 重新複製 300-600GB 也需要一段時間。

無論如何,在這一點上,我被難住了。我希望有人有一個想法,因為在這一點上,我不知道下一步該嘗試什麼。

這是解決此問題的正確途徑嗎,我只需要正確設置一些設置嗎?或者上述方法對於安裝 IMSM RAID-0 磁碟映像是否完全錯誤?

查看 和 的分區表和/dev/loop0報告的磁碟映像大小,我傾向於建議將兩個磁碟簡單地栓在一起,然後為生成的虛擬磁碟建構分區表:/dev/loop0``/dev/loop1

Disk /dev/loop0: 298.1 GiB, 320072933376 bytes, 625142448 sectors

Device       Boot   Start        End    Sectors   Size Id Type
/dev/loop0p1 *       2048    4196351    4194304     2G  7 HPFS/NTFS/exFAT
/dev/loop0p2      4196352 1250273279 1246076928 594.2G  7 HPFS/NTFS/exFAT

Disk /dev/loop1: 298.1 GiB, 320072933376 bytes, 625142448 sectors

如果我們使用 298.1 GiB 和 298.1 GiB 的兩個磁碟,我們總共得到 596.2 GiB。如果我們將兩個分區的大小分別設為 2G + 594.2G,我們也會得到 596.2 GiB。(假設“G”表示 GiB。)

您已經警告您無法mdadm辨識超級塊資訊,因此純粹基於磁碟分區標籤,我將嘗試像這樣建構陣列:

mdadm --build /dev/md0 --raid-devices=2 --level=0 --chunk=128 /dev/loop0 /dev/loop1
cat /proc/mdstat

我有一個 128KiB 的塊大小來匹配磁碟上仍然存在的元數據所描述的塊大小。

如果可行,您可以繼續訪問生成的 RAID0 中的分區。

ld=$(losetup --show --find --offset=$((4196352*512)) /dev/md0)
echo loop device is $ld
mkdir -p /mnt/dsk
mount -t ntfs -o ro $ld /mnt/dsk

我們已經有幾個循環設備在使用中,所以我避免假設下一個空閒循環設備的名稱,而是讓losetup命令告訴我它正在使用的那個;這是放入$ld. 4196532 個扇區(每個 512 字節)的偏移量對應於第二個分區映像的偏移量。我們同樣可以省略losetup命令中的偏移量並將其添加到mount選項中。

引用自:https://unix.stackexchange.com/questions/273819