배경

배경

질문: Linux 및 mdadm을 사용하여 데이터를 읽고 복사하는 방법은 무엇입니까?파일로Intel Rapid Storage Technology RAID-0 어레이(Windows 7이 설치된 상태에서 NTFS로 포맷됨)에 사용되는 하드 드라이브로 만든 디스크 이미지입니까?

문제: 어레이의 드라이브 중 하나가 손상되었으므로 드라이브를 교체하기 전에 최대한 많은 데이터를 복사하고 싶습니다(따라서 어레이가 파괴됨).

내 문제를 해결할 수 있다면 이 문제에 대한 대체 솔루션에 열려 있습니다.

배경

저는 RAID-0(FakeRAID-0)으로 구성된 2개의 하드 드라이브가 있는 Intel Rapid Storage Technology 컨트롤러(다양한 경우 RST, RSTe 또는 IMSM이라고 함)가 장착된 노트북을 가지고 있습니다. 노트북이 이 구성으로 배송되었기 때문에 RAID-0은 옵션이 아닙니다. 디스크 중 하나에는 불량 섹터가 많이 축적된 것 같지만 다른 디스크는 완전히 정상입니다. 전체적으로 디스크는 여전히 운영 체제(Windows 7 64비트)로 부팅할 수 있을 만큼 건강하지만, 손상된 디스크 영역에 액세스할 때 운영 체제가 가끔 멈추는 경우가 있으며, 손상된 디스크를 계속 사용하려고 하는 것은 좋지 않은 생각인 것 같습니다. . 디스크에서 최대한 많은 데이터를 복사한 다음 손상된 드라이브를 교체하고 싶습니다. 손상된 디스크에서 라이브 작업을 수행하는 것은 나쁜 것으로 간주되므로 나중에 mdadm 또는 유사한 것을 사용하여 이미지를 마운트할 수 있도록 두 디스크를 모두 이미지화하기로 결정했습니다. 많은 시간을 투자하고 많은 독서를 했지만 여전히 디스크 이미지를 (가짜) RAID-0 어레이로 마운트하는 데 성공하지 못했습니다. 여기서 수행한 단계를 기억해 보겠습니다. 오늘은 긴 하루이므로 간식과 음료를 준비하세요.

먼저, 파티션에서 Ubuntu 15.10 64비트를 실행하기 위한 USB 외장 드라이브가 있었습니다. LiveCD 또는 소형 USB 썸 드라이브를 사용하는 것이 부팅하기는 쉽지만 외부 드라이브보다 느립니다(그리고 LiveCD는 영구 설치가 아닙니다). ddrescue를 설치하고 이를 사용하여 각 하드 드라이브를 이미지화했습니다. 이미지 생성에는 명백한 문제가 없습니다.

이미지를 얻은 후 apt를 사용하여 mdadm을 설치했습니다. 그러나 이렇게 하면 2013년의 이전 버전의 mdadm이 설치됩니다. 변경 로그에서는 IMSM에 대한 더 나은 지원을 제안했기 때문에 다음 명령을 사용하여 mdadm 3.4를 컴파일하고 설치했습니다.이 가이드, 커널 4.4.2 이상으로의 업그레이드 포함. 여기서 주목할 만한 유일한 문제는 일부 테스트가 제대로 진행되지 않았다는 것입니다. 그러나 지침에서는 이것이 허용 가능한 것으로 나타납니다.

그 이후에 기사를 읽었는데희귀한 장소이미지를 사용하려면 루프백 장치를 사용해야 합니다. 나는 아무런 문제 없이 디스크 이미지를 /dev/loop0 및 /dev/loop1로 마운트했습니다.

프로세스의 이 시점에서 몇 가지 관련 정보는 다음과 같습니다.

mdadm --상세 플랫폼:

$ 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은 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 디스크 이미지를 마운트하는 데 위의 방법이 완전히 잘못된 것입니까?

답변1

의 파티션 테이블과 보고 /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.1GiB와 298.1GiB로 조정하면 총 596.2GiB가 됩니다. 그런 다음 두 파티션의 크기를 2G + 594.2G로 조정하면 596.2GiB도 얻게 됩니다. (이는 "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

우리는 이미 여러 개의 루프 장치를 사용하고 있으므로 다음 사용 가능한 루프 장치의 이름을 가정하지 않고 대신 4196532 섹터(섹터당 512바이트) losetup가 사용 중인 장치를 알려주도록 명령에 요청합니다. $ld두 번째 파티션 이미지의 오프셋입니다. losetup명령에서 오프셋을 생략하고 mount옵션 에 추가 할 수도 있습니다 .

관련 정보