Я создал пять разделов жесткого диска емкостью 1 ТБ (/dev/sda1
, /dev/sdb1
, /dev/sdc1
, /dev/sde1
и /dev/sdf1
) в массиве RAID 6 с именем /dev/md0
используя mdadm
в Ubuntu 14.04 LTS Верный Тар.
Команда sudo mdadm --detail /dev/md0
используется для отображения всех дисков в активной синхронизации.
Затем для тестирования я смоделировал длительную блокировку ввода-вывода в /dev/sdb
, выполнив эти команды, пока /dev/sdb1
все еще был активен в массиве:
hdparm --user-master u --security-set-pass deltik /dev/sdb
hdparm --user-master u --security-erase-enhanced deltik /dev/sdb
ПРЕДУПРЕЖДЕНИЕ
НЕ ПОПРОБУЙТЕ ЭТО НА ДАННЫХ, КОТОРЫЕ ВЫ ЗАБЫВАЕТЕ!
В результате этой операции ATA я испортил 455681 inode. Я признаю свою небрежность.
Ожидается, что команда ATA для безопасного стирания будет выполняться в течение 188 минут, блокируя все остальные команды, по крайней мере, в течение этого времени.
Я ожидал, что md
сбросит диск, который не отвечает, как настоящий RAID-контроллер, но, к моему удивлению, /dev/md0
заблокировался.
mdadm --detail /dev/md0
запрашивает заблокированное устройство, поэтому оно зависает и не выводит.
Вот макет из /proc/mdstat
пока я не могу использовать mdadm --detail /dev/md0
:
root@node51 [~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10]
md0 : active raid6 sdf1[5] sda1[0] sdb1[4] sdc1[2] sde1[1]
2929887744 blocks super 1.2 level 6, 512k chunk, algorithm 2 [5/5] [UUUUU]
unused devices: <none>
Я попытался mdadm /dev/md0 -f /dev/sdb1
принудительно завершить с ошибкой /dev/sdb1
, но это также было заблокировано:
root@node51 [~]# ps aux | awk '{if($8~"D"||$8=="STAT"){print $0}}'
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3334 1.2 0.0 42564 1800 ? D 03:21 3:37 parted -l
root 4957 0.0 0.0 13272 900 ? D 06:19 0:00 mdadm /dev/md0 -f /dev/sdb1
root 5706 0.0 0.0 13388 1028 ? D 06:19 0:00 mdadm --detail /dev/md0
root 7541 0.5 0.0 0 0 ? D Jul19 6:12 [kworker/u16:2]
root 22420 0.0 0.0 11480 808 ? D 07:48 0:00 lsblk
root 22796 0.0 0.0 4424 360 pts/13 D+ 05:51 0:00 hdparm --user-master u --security-erase-enhanced deltik /dev/sdb
root 23312 0.0 0.0 4292 360 ? D 05:51 0:00 hdparm -I /dev/sdb
root 23594 0.1 0.0 0 0 ? D 06:11 0:07 [kworker/u16:1]
root 25205 0.0 0.0 17980 556 ? D 05:52 0:00 ls --color=auto
root 26008 0.0 0.0 13388 1032 pts/23 D+ 06:32 0:00 mdadm --detail /dev/md0
dtkms 29271 0.0 0.2 58336 10412 ? DN 05:55 0:00 python /usr/share/backintime/common/backintime.py --backup-job
root 32303 0.0 0.0 0 0 ? D 06:16 0:00 [kworker/u16:0]
ОБНОВЛЕНИЕ (21 июля 2015 г.): После того, как я ждал полных 188 минут, пока блок ввода-вывода будет очищен, удивление переросло в ужас, когда я увидел, что md
рассматривает полностью отключенный /dev/sdb
как если бы он был полностью в такте.
Я думал, что md
, по крайней мере, увидит, что четность не соответствует, а затем упал бы /dev/sdb1
.
В панике я снова запустил mdadm /dev/md0 -f /dev/sdb1
, и, поскольку блок ввода-вывода был снят, команда быстро завершилась.
Повреждение файловой системы уже происходило из-за ошибок ввода / вывода. Все еще паникуя, я сделал ленивый размонтирование раздела данных в массиве RAID и reboot -nf
так как полагал, что хуже быть не может.
После того, как e2fsck
поразил гвоздя на раздел, 455681 inode превратили его в lost+found
.
С тех пор я пересобрал массив, и сам массив теперь выглядит нормально:
root@node51 [~]# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Mon Feb 16 14:34:26 2015
Raid Level : raid6
Array Size : 2929887744 (2794.16 GiB 3000.21 GB)
Used Dev Size : 976629248 (931.39 GiB 1000.07 GB)
Raid Devices : 5
Total Devices : 5
Persistence : Superblock is persistent
Update Time : Tue Jul 21 00:00:30 2015
State : active
Active Devices : 5
Working Devices : 5
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Name : box51:0
UUID : 6b8a654d:59deede9:c66bd472:0ceffc61
Events : 643541
Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 97 1 active sync /dev/sdg1
2 8 33 2 active sync /dev/sdc1
6 8 17 3 active sync /dev/sdb1
5 8 113 4 active sync /dev/sdh1
Меня по-прежнему шокирует, что у md
нет двух линий защиты, которые я ожидал:
- Сбой устройства, когда оно блокируется
- Сбой устройства, когда данные, которые оно возвращает, являются мусором
Вопросы
- Почему
md
не дает сбой не отвечающему диску / разделу? - Можно ли удалить диск / раздел из массива, пока диск заблокирован?
- Можно ли настроить тайм-аут, чтобы
md
автоматически отказывал приводу, который не отвечает на команды ATA? - Почему
md
продолжает использовать устройство с недействительными данными?