RAID 어레이가 읽기 전용이 됩니다.

RAID 어레이가 읽기 전용이 됩니다.

테스트 및 학습 목적으로만 KVM에서 실행되는 가상 머신을 만들었습니다. 설치 중에 RAID 1 어레이는 루트 디스크 3개와 부팅 디스크 3개로 구성되었습니다. 몇 가지 재생 및 테스트 후에 드라이브 중 하나에 0을 쓰고 무슨 일이 일어나는지 확인하기로 결정했습니다.

dd if=/dev/zero of=/dev/vdc2 

그런 다음 시스템은 읽기 전용 상태로 전환되지만 mdamd에는 오류가 없습니다.

정보:

[ 2177.091939] RAID1 conf printout:
[ 2177.091947]  --- wd:2 rd:3
[ 2177.091954]  disk 0, wo:0, o:1, dev:vda2
[ 2177.091956]  disk 1, wo:0, o:1, dev:vdb2
[ 2177.091958]  disk 2, wo:1, o:1, dev:vdc2
[ 2177.095315] md: recovery of RAID array md1
[ 2177.095321] md: minimum _guaranteed_  speed: 1000 KB/sec/disk.
[ 2177.095323] md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for recovery.
[ 2177.095330] md: using 128k window, over a total of 9792512k.
[ 2217.132610] RAID1 conf printout:
[ 2217.132616]  --- wd:2 rd:3
[ 2217.132622]  disk 0, wo:0, o:1, dev:vda1
[ 2217.132625]  disk 1, wo:0, o:1, dev:vdb1
[ 2217.132626]  disk 2, wo:1, o:1, dev:vdc1
[ 2217.135129] md: delaying recovery of md0 until md1 has finished (they share one or more physical units)
[ 2225.567664] md: md1: recovery done.
[ 2225.572072] md: recovery of RAID array md0
[ 2225.572081] md: minimum _guaranteed_  speed: 1000 KB/sec/disk.
[ 2225.572083] md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for recovery.
[ 2225.572087] md: using 128k window, over a total of 682432k.
[ 2225.574833] RAID1 conf printout:
[ 2225.574836]  --- wd:3 rd:3
[ 2225.574904]  disk 0, wo:0, o:1, dev:vda2
[ 2225.574906]  disk 1, wo:0, o:1, dev:vdb2
[ 2225.574908]  disk 2, wo:0, o:1, dev:vdc2
[ 2229.036805] md: md0: recovery done.
[ 2229.042732] RAID1 conf printout:
[ 2229.042736]  --- wd:3 rd:3
[ 2229.042740]  disk 0, wo:0, o:1, dev:vda1
[ 2229.042742]  disk 1, wo:0, o:1, dev:vdb1
[ 2229.042744]  disk 2, wo:0, o:1, dev:vdc1
[ 5241.129626] md/raid1:md1: Disk failure on vdc2, disabling device.
               md/raid1:md1: Operation continuing on 2 devices.
[ 5241.131639] RAID1 conf printout:
[ 5241.131642]  --- wd:2 rd:3
[ 5241.131645]  disk 0, wo:0, o:1, dev:vda2
[ 5241.131647]  disk 1, wo:0, o:1, dev:vdb2
[ 5241.131648]  disk 2, wo:1, o:0, dev:vdc2
[ 5241.131655] RAID1 conf printout:
[ 5241.131656]  --- wd:2 rd:3
[ 5241.131658]  disk 0, wo:0, o:1, dev:vda2
[ 5241.131684]  disk 1, wo:0, o:1, dev:vdb2
[ 5326.850032] md: unbind<vdc2>
[ 5326.850050] md: export_rdev(vdc2)
[ 5395.301755] md: export_rdev(vdc2)
[ 5395.312985] md: bind<vdc2>
[ 5395.315022] RAID1 conf printout:
[ 5395.315024]  --- wd:2 rd:3
[ 5395.315027]  disk 0, wo:0, o:1, dev:vda2
[ 5395.315029]  disk 1, wo:0, o:1, dev:vdb2
[ 5395.315031]  disk 2, wo:1, o:1, dev:vdc2
[ 5395.318161] md: recovery of RAID array md1
[ 5395.318168] md: minimum _guaranteed_  speed: 1000 KB/sec/disk.
[ 5395.318170] md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for recovery.
[ 5395.318174] md: using 128k window, over a total of 9792512k.
[ 5443.707445] md: md1: recovery done.
[ 5443.712678] RAID1 conf printout:
[ 5443.712682]  --- wd:3 rd:3
[ 5443.712686]  disk 0, wo:0, o:1, dev:vda2
[ 5443.712688]  disk 1, wo:0, o:1, dev:vdb2
[ 5443.712689]  disk 2, wo:0, o:1, dev:vdc2
[ 8017.777012] EXT4-fs error (device md1): ext4_lookup:1584: inode #36: comm systemd-sysv-ge: deleted inode referenced: 135
[ 8017.782244] Aborting journal on device md1-8.
[ 8017.785487] EXT4-fs (md1): Remounting filesystem read-only
[ 8017.876415] EXT4-fs error (device md1): ext4_lookup:1584: inode #36: comm systemd: deleted inode referenced: 137

고양이/proc/mdstat:

Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
md1 : active raid1 vdb2[1] vda2[0]
      9792512 blocks super 1.2 [3/2] [UU_]

md0 : active raid1 vdc1[2] vdb1[1] vda1[0]
      682432 blocks super 1.2 [3/3] [UUU]

unused devices: <none>

성공하지 못한 채 읽기-쓰기 모드로 루트를 다시 마운트하려고 했습니다.

마운트 -o 다시 마운트 /

Segmentation fault (core dumped)

그 다음에:

fsck-Af

fsck from util-linux 2.27.1
Segmentation fault (core dumped)

vdc2 드라이브를 삭제하지 않고 성공적으로 재조정할 수 있기를 바랐지만, 제 생각은 틀렸습니다. 손상된 드라이브가 제거되었습니다:

mdadm --manage /dev/md1 --fail /dev/vdc2
mdadm --manage /dev/md1 --remove /dev/vdc2

fdisk 또는 cfdisk를 사용하여 드라이브를 삭제하고 다시 생성하려고 시도했지만 동일한 오류가 발생했습니다.분할 오류(코어 덤프)

mdadm을 사용하여 md1과 드라이브 상태를 붙여넣었습니다.

mdadm -D /dev/md1

/dev/md1:
        Version : 1.2
  Creation Time : Mon Nov  7 21:22:29 2016
     Raid Level : raid1
     Array Size : 9792512 (9.34 GiB 10.03 GB)
  Used Dev Size : 9792512 (9.34 GiB 10.03 GB)
   Raid Devices : 3
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Tue Nov  8 02:38:26 2016
          State : clean, degraded 
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           Name : ubuntu-raid:1  (local to host ubuntu-raid)
           UUID : c846618f:d77238fe:95edac3d:dd19e295
         Events : 108

    Number   Major   Minor   RaidDevice State
       0     253        2        0      active sync   /dev/vda2
       1     253       18        1      active sync   /dev/vdb2
       4       0        0        4      removed

mdadm -E /dev/vdc2

/dev/vdc2:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : c846618f:d77238fe:95edac3d:dd19e295
           Name : ubuntu-raid:1  (local to host ubuntu-raid)
  Creation Time : Mon Nov  7 21:22:29 2016
     Raid Level : raid1
   Raid Devices : 3

 Avail Dev Size : 19585024 (9.34 GiB 10.03 GB)
     Array Size : 9792512 (9.34 GiB 10.03 GB)
    Data Offset : 16384 sectors
   Super Offset : 8 sectors
   Unused Space : before=16296 sectors, after=0 sectors
          State : clean
    Device UUID : 25a823f7:a301598a:91f9c66b:cc27d311

    Update Time : Tue Nov  8 02:20:34 2016
  Bad Block Log : 512 entries available at offset 72 sectors
       Checksum : d6d7fc77 - correct
         Events : 101


   Device Role : Active device 2
   Array State : AAA ('A' == active, '.' == missing, 'R' == replacing)

운영 체제: Ubuntu 16.04.1 커널: 4.4.0-31-일반 mdadm 버전: v3.3

그래서 두 가지 질문이 있습니다. 왜 이런 일이 발생하는지, 어레이를 읽기/쓰기로 마운트할 수 없는 주된 이유는 무엇인지, 두 번째 질문은 앞으로 이런 일이 발생하지 않도록 하는 방법입니다. 물론 테스트 환경이지만 재부팅이나 그런거 없이 고칠 수 있는 방법을 찾고 있어요

답변1

Linux md시스템은 좋은 데이터를 제공할지 여부를 RAID 어레이의 구성 요소 드라이브에 의존합니다. 실제 오류 시나리오에서는 이는 합리적인 가정입니다. 즉, 디스크에 오류 수정 정보가 있고 불량 섹터가 감지할 수 없는 방식으로 스스로 손상될 가능성은 거의 없습니다.

디스크에 0을 쓰면 이 보호를 우회할 수 있습니다. 시스템은 md데이터가 여전히 양호하다고 생각하고 손상된 데이터를 파일 시스템 계층으로 전달하는데, 이는 제대로 반응하지 않습니다. RAID 1을 사용하고 있으므로 md성능을 향상하기 위해 모든 드라이브에서 읽기가 균형을 이루고 있습니다. 발생한 충돌은 손상된 드라이브 mount및 조각화의 읽기로 인해 발생합니다.fsck

복구하려면 시스템에서 오류가 발생한 디스크를 완전히 제거합니다. 가상 머신을 사용하고 있으므로 가상 머신의 관리 도구를 사용하여 이 작업을 수행합니다. 물리적 시스템인 경우 드라이브를 분리해야 합니다. 이렇게 하면 md시스템이 드라이브에 오류가 있음을 인식하고 읽기를 중지하게 되며 필요한 파일 시스템 수준 복구를 수행할 수 있습니다.

디스크를 사용하여 이 게임을 플레이하려면 ZFS 또는 BTRFS로 포맷하세요. 이러한 파일 시스템은 "양호한 데이터 또는 데이터 없음"을 가정하지 않으며 체크섬을 사용하여 디스크에서 읽은 잘못된 데이터를 찾아냅니다.

관련 정보