
Короче говоря: как мне исправить плохой блок на 1 диске в массиве RAID1?
Но, пожалуйста, прочтите это целиком, чтобы узнать, что я уже пробовал и какие ошибки в моих методах возможны. Я старался быть максимально подробным и очень надеюсь на обратную связь
Вот моя ситуация: у меня два диска по 2 ТБ (одной модели), настроенных в массив RAID1 под управлением mdadm
. Около 6 месяцев назад я заметил первый плохой блок, когда SMART сообщил об этом. Сегодня я заметил больше, и теперь пытаюсь это исправить.
Эта страница HOWTOКажется, это единственная статья, на которую все ссылаются, чтобы исправить плохие блоки, о которых сообщает SMART. Это отличная страница, полная информации, однако она довольно устарела и не касается моей конкретной настройки. Вот чем отличается моя конфигурация:
- Вместо одного диска я использую два диска в массиве RAID1. Один диск сообщает об ошибках, а другой в порядке. HOWTO написано только для одного диска, что вызывает различные вопросы, такие как «использовать ли эту команду на дисковом устройстве или на устройстве RAID»?
- Я использую GPT, который fdisk не поддерживает. Я использовал gdisk вместо этого, и я надеюсь, что он дает мне ту же информацию, которая мне нужна
Итак, приступим к делу. Вот что я сделал, однако, похоже, это не работает. Пожалуйста, не стесняйтесь дважды проверить мои расчеты и метод на наличие ошибок. Диск, сообщающий об ошибках, это /dev/sda:
# smartctl -l selftest /dev/sda
smartctl 5.42 2011-10-20 r3458 [x86_64-linux-3.4.4-2-ARCH] (local build)
Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net
=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
# 1 Short offline Completed: read failure 90% 12169 3212761936
Таким образом, мы приходим к выводу, что ошибка находится на LBA 3212761936. Следуя HOWTO, я использую gdisk для поиска начального сектора, который будет использоваться позже при определении номера блока (поскольку я не могу использовать fdisk, так как он не поддерживает GPT):
# gdisk -l /dev/sda
GPT fdisk (gdisk) version 0.8.5
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Disk /dev/sda: 3907029168 sectors, 1.8 TiB
Logical sector size: 512 bytes
Disk identifier (GUID): CFB87C67-1993-4517-8301-76E16BBEA901
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 3907029134
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)
Number Start (sector) End (sector) Size Code Name
1 2048 3907029134 1.8 TiB FD00 Linux RAID
Используя tunefs
я нахожу, что размер блока равен 4096
. Используя эту информацию и расчет из HOWTO, я прихожу к выводу, что рассматриваемый блок равен ((3212761936 - 2048) * 512) / 4096 = 401594986
.
Затем HOWTO предлагает мне debugfs
проверить, используется ли блок (я использую устройство RAID, так как ему нужна файловая система EXT, это была одна из команд, которая сбила меня с толку, поскольку я сначала не знал, следует ли использовать /dev/sda или /dev/md0):
# debugfs
debugfs 1.42.4 (12-June-2012)
debugfs: open /dev/md0
debugfs: testb 401594986
Block 401594986 not in use
Итак, блок 401594986 — пустое место, я должен иметь возможность записывать поверх него без проблем. Однако перед тем, как писать в него, я стараюсь убедиться, что его действительно нельзя прочитать:
# dd if=/dev/sda1 of=/dev/null bs=4096 count=1 seek=401594986
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.000198887 s, 20.6 MB/s
Если бы блок не мог быть прочитан, я бы не ожидал, что это сработает. Однако это работает. Я повторяю использование /dev/sda
, /dev/sda1
, /dev/sdb
, /dev/sdb1
, /dev/md0
и +-5 к номеру блока для поиска вокруг плохого блока. Все работает. Я пожимаю плечами и продолжаю, фиксирую запись и синхронизацию (я использую /dev/md0, потому что я подумал, что изменение одного диска, а не другого, может вызвать проблемы, таким образом оба диска перезапишут плохой блок):
# dd if=/dev/zero of=/dev/md0 bs=4096 count=1 seek=401594986
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.000142366 s, 28.8 MB/s
# sync
Я ожидал, что запись в плохой блок заставит диски переназначить блок хорошему, однако запуск еще одного теста SMART показывает иное:
# 1 Short offline Completed: read failure 90% 12170 3212761936
Возвращаемся к исходной точке 1. Итак, в общем, как мне исправить плохой блок на 1 диске в массиве RAID1? Я уверен, что я что-то сделал не так...
Спасибо за ваше время и терпение.