Гаразд - щось непокоїло мене щодо вашої проблеми, тому я запустив машину управління, щоб зануритися в поведінку, на яку слід очікувати. Я дістанусь до того, що мене клопоче за хвилину; спочатку дозвольте сказати це:
Створіть резервні копії цих дисків, перш ніж щось робити!
Можливо, ви вже зробили шкоду, що перевищує ресинхронізацію; чи можете ви уточнити, що ви мали на увазі, сказавши:
За пропозиціями я очистив суперблоки та заново створив масив з опцією --assume-clean, але зовсім не пощастило.
Якщо ви побігли mdadm --misc --zero-superblock
, тоді вам слід добре.
У будь-якому випадку, відшукуйте нові диски і захоплюйте точні поточні зображення з них, перш ніж робити щось, що може більше писати на ці диски.
dd if=/dev/sdd of=/path/to/store/sdd.img
Це, мабуть, схоже, що дані, що зберігаються в цих речах, є вражаючими для стійких ресинків. Читайте далі, є надія, і це може бути день, коли я досягне межі довжини відповіді.
Найкращий сценарій випадку
Я зібрав VM, щоб відтворити ваш сценарій. Диски всього 100 Мб, тому я б не чекав вічно кожного пересинхронізації, але в іншому випадку це повинно бути досить точним.
Вбудований масив максимально загальнодоступний і за замовчуванням - 512k шматки, ліво-симетричний макет, диски в літерному порядку .. нічого особливого.
root@test:~# mdadm --create /dev/md0 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid5 sdd1[3] sdc1[1] sdb1[0]
203776 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>
Все йде нормально; давайте зробимо файлову систему та додамо до неї деякі дані.
root@test:~# mkfs.ext4 /dev/md0
mke2fs 1.41.14 (22-Dec-2010)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=512 blocks, Stripe width=1024 blocks
51000 inodes, 203776 blocks
10188 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
25 block groups
8192 blocks per group, 8192 fragments per group
2040 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
root@test:~# mkdir /mnt/raid5
root@test:~# mount /dev/md0 /mnt/raid5
root@test:~# echo "data" > /mnt/raid5/datafile
root@test:~# dd if=/dev/urandom of=/mnt/raid5/randomdata count=10000
10000+0 records in
10000+0 records out
5120000 bytes (5.1 MB) copied, 0.706526 s, 7.2 MB/s
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064 /mnt/raid5/randomdata
Добре. У нас є файлова система і деякі дані ("дані" в datafile
, і 5MB варто випадкових даних з цим SHA1 хеш в randomdata
) на ній; давайте подивимося, що станеться, коли ми робимо відтворення.
root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
unused devices: <none>
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 21:07:06 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 21:07:06 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 21:07:06 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdd1[2] sdc1[1] sdb1[0]
203776 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>
Resync дуже швидко закінчився цими крихітними дисками, але це сталося. Тож ось що мене клопоче від раніше; ваш fdisk -l
вихід. Відсутність таблиці md
пристроїв на пристрої взагалі не є проблемою, як очікується. Ваша файлова система знаходиться безпосередньо на пристрої підробленого блоку, без таблиці розділів.
root@test:~# fdisk -l
...
Disk /dev/md1: 208 MB, 208666624 bytes
2 heads, 4 sectors/track, 50944 cylinders, total 407552 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 524288 bytes / 1048576 bytes
Disk identifier: 0x00000000
Disk /dev/md1 doesn't contain a valid partition table
Так, ніякого перегородкового столу. Але ...
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks
Ідеально дійсна файлова система після пересинхронізації. Так що це добре; давайте перевіримо наші файли даних:
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064 /mnt/raid5/randomdata
Солідно - взагалі немає корупції даних! Але це з цілком однаковими налаштуваннями, тому нічого не було відображено по-різному між двома групами RAID. Давайте опустимо цю річ, перш ніж ми спробуємо її зламати.
root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1
Зроби крок назад
Перш ніж ми спробуємо це зламати, поговоримо про те, чому важко зламати. RAID 5 працює за допомогою блоку парності, який захищає область такого ж розміру, як і блок на кожному іншому диску в масиві. Паритет не тільки на одному конкретному диску, він обертається навколо дисків рівномірно, щоб краще розповсюджувати завантаження читання по дисках у звичайній роботі.
Операція XOR для обчислення парності виглядає приблизно так:
DISK1 DISK2 DISK3 DISK4 PARITY
1 0 1 1 = 1
0 0 1 1 = 0
1 1 1 1 = 0
Отже, паритет розкинувся між дисками.
DISK1 DISK2 DISK3 DISK4 DISK5
DATA DATA DATA DATA PARITY
PARITY DATA DATA DATA DATA
DATA PARITY DATA DATA DATA
Ресинхронізація, як правило, робиться під час заміни мертвого чи відсутнього диска; це також робиться mdadm create
для того, щоб переконатися, що дані на дисках співпадають з тим, як має виглядати геометрія RAID. У такому випадку останній диск у специфікації масиву - той, який "синхронізований" - усі існуючі дані на інших дисках використовуються для синхронізації.
Отже, всі дані на «новому» диску стираються та відновлюються; або будувати свіжі блоки даних з парності блоків для того, що там повинно було бути, або будувати нові блоки парності.
Приємно, що процедура обох цих речей абсолютно однакова: операція XOR над даними з решти дисків. Процес пересинхронізації в цьому випадку може мати в своєму макеті те, що певний блок повинен бути блоком паритету, і думаю, що він створює новий блок паритету, коли він фактично створює старий блок даних. Тож навіть якщо він думає, що це будує:
DISK1 DISK2 DISK3 DISK4 DISK5
PARITY DATA DATA DATA DATA
DATA PARITY DATA DATA DATA
DATA DATA PARITY DATA DATA
... це може бути просто перебудова DISK5
з макетом вище.
Таким чином, дані можуть залишатися послідовними, навіть якщо масив побудований неправильно.
Кидання мавпи у творах
(не гайковий ключ; ціла мавпа)
Тест 1:
Давайте зробимо масив у неправильному порядку! sdc
, то sdd
, тоді sdb
..
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdc1 /dev/sdd1 /dev/sdb1
mdadm: /dev/sdc1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:06:34 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:06:34 2012
mdadm: /dev/sdb1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:06:34 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdb1[3] sdd1[1] sdc1[0]
203776 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>
Гаразд, це все добре і добре. Чи є у нас файлова система?
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
fsck.ext4: Superblock invalid, trying backup blocks...
fsck.ext4: Bad magic number in super-block while trying to open /dev/md1
The superblock could not be read or does not describe a correct ext2
filesystem. If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193 <device>
Ні! Чому так? Тому що, хоча всі дані є, це в неправильному порядку; те, що колись 512 Кб А, то 512 Кб B, A, B і так далі, тепер перемістили в B, A, B, A. Диск тепер схожий на перемикання до перевірки файлової системи, він не запуститься. Результат роботи mdadm --misc -D /dev/md1
дає нам більше деталей; Це виглядає приблизно так:
Number Major Minor RaidDevice State
0 8 33 0 active sync /dev/sdc1
1 8 49 1 active sync /dev/sdd1
3 8 17 2 active sync /dev/sdb1
Коли це має виглядати так:
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
3 8 49 2 active sync /dev/sdd1
Отже, це все добре і добре. Цього разу ми замінили цілу купу блоків даних з новими блоками паритету. Відновіть, за допомогою правильного замовлення зараз:
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:11:08 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:11:08 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:11:08 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks
Акуратно, там ще є файлова система! Ще отримали дані?
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064 /mnt/raid5/randomdata
Успіху!
Тест 2
Гаразд, давайте змінимо розмір шматка і подивимось, чи отримає це нас деяка ламкість.
root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=64 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:21:19 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:21:19 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:21:19 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
fsck.ext4: Superblock invalid, trying backup blocks...
fsck.ext4: Bad magic number in super-block while trying to open /dev/md1
The superblock could not be read or does not describe a correct ext2
filesystem. If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193 <device>
Так, так, це шланг при такому налаштуванні. Але ми можемо одужати?
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:21:51 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:21:51 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:21:51 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064 /mnt/raid5/randomdata
Успіх, знову ж таки!
Тест 3
Це той, на який я думав, що точно вбиває дані - давайте зробимо інший алгоритм компонування!
root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --layout=right-asymmetric --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:32:34 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:32:34 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:32:34 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdd1[3] sdc1[1] sdb1[0]
203776 blocks super 1.2 level 5, 512k chunk, algorithm 1 [3/3] [UUU]
unused devices: <none>
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
fsck.ext4: Superblock invalid, trying backup blocks...
Superblock has an invalid journal (inode 8).
Страшно і погане - він думає, що знайшов щось, і хоче зробити щось виправлення! Ctrl+ C!
Clear<y>? cancelled!
fsck.ext4: Illegal inode number while checking ext3 journal for /dev/md1
Гаразд, криза запобігла. Давайте подивимось, чи зберігаються дані незмінними після повторної синхронізації з неправильним компонуванням:
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:33:02 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:33:02 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
level=raid5 devices=3 ctime=Sat Jan 7 23:33:02 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064 /mnt/raid5/randomdata
Успіху!
Тест 4
Давайте також просто докажемо, що обнулення суперблоку не є шкідливим реально швидко:
root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --misc --zero-superblock /dev/sdb1 /dev/sdc1 /dev/sdd1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064 /mnt/raid5/randomdata
Так, нічого страшного.
Тест 5
Давайте просто кинемо все, що у нас є. Усі 4 попередні тести, разом.
- Неправильне замовлення пристрою
- Неправильний розмір шматка
- Неправильний алгоритм компонування
- Нульові суперблоки (ми зробимо це між обома творіннями)
Вперед!
root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --misc --zero-superblock /dev/sdb1 /dev/sdc1 /dev/sdd1
root@test:~# mdadm --create /dev/md1 --chunk=64 --level=5 --raid-devices=3 --layout=right-symmetric /dev/sdc1 /dev/sdd1 /dev/sdb1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdb1[3] sdd1[1] sdc1[0]
204672 blocks super 1.2 level 5, 64k chunk, algorithm 3 [3/3] [UUU]
unused devices: <none>
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
fsck.ext4: Superblock invalid, trying backup blocks...
fsck.ext4: Bad magic number in super-block while trying to open /dev/md1
The superblock could not be read or does not describe a correct ext2
filesystem. If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193 <device>
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
Вирок?
root@test:~# mdadm --misc --zero-superblock /dev/sdb1 /dev/sdc1 /dev/sdd1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdd1[3] sdc1[1] sdb1[0]
203776 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 13/51000 files, 17085/203776 blocks
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064 /mnt/raid5/randomdata
Ого.
Отже, схоже, що жодна з цих дій жодним чином не зіпсувала дані. Я був дуже здивований цим результатом, відверто кажучи; Я очікував помірних шансів втрати даних щодо зміни розміру шматка, а також певної втрати на зміні макета. Я щось сьогодні дізнався.
Отже .. Як я можу отримати свої дані ??
Стільки інформації, яку ви маєте про стару систему, були б вам надзвичайно корисні. Якщо ви знаєте тип файлової системи, якщо у вас є якісь старі копії /proc/mdstat
з інформацією про порядок приводу, алгоритм, розмір фрагмента та версію метаданих. Чи налаштовано сповіщення електронною поштою mdadm? Якщо так, знайдіть старий; якщо ні, перевірте /var/spool/mail/root
. Перевірте, ~/.bash_history
чи існує ваша оригінальна збірка.
Отже, перелік речей, які слід зробити:
- Створіть резервні копії дисків,
dd
перш ніж робити щось !!
- Спробуйте до
fsck
поточного, активного md - ви, можливо, щойно траплялися будувати в тому ж порядку, що і раніше. Якщо ви знаєте тип файлової системи, це корисно; використовувати цей конкретний fsck
інструмент. Якщо будь-який із інструментів пропонує щось виправити, не дозволяйте їм, якщо ви не впевнені, що дійсно знайшли дійсну файлову систему! Якщо fsck
вам пропонують щось виправити, не соромтесь залишити коментар, щоб запитати, чи це насправді допомагає чи просто збирається зайняти дані.
- Спробуйте створити масив з різними параметрами. Якщо у вас є стара
/proc/mdstat
, то ви можете просто імітувати те, що на ній показано; якщо ні, то ви ніби в темряві - спроба всіх різних замовлень приводу є розумною, але перевірка всіх можливих розмірів шматка при кожному можливому замовленні є марною. Для кожного, fsck
щоб побачити, чи отримаєте ви щось перспективне.
Отже, ось це. Вибачте за роман, не соромтесь залишити коментар, якщо у вас є якісь питання, і удачі!
виноска: менше 22 тис. символів; 8k + сором'язлива обмеження довжини