테스트 및 학습 목적으로만 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로 포맷하세요. 이러한 파일 시스템은 "양호한 데이터 또는 데이터 없음"을 가정하지 않으며 체크섬을 사용하여 디스크에서 읽은 잘못된 데이터를 찾아냅니다.