Восcтановление RAID после сбоя в Debian
Всегда легко говорить о восстановление RAID массива, если все вы делали сами и с нуля. Тут вам и карта в руки. И количество разделов, и структура все вам знакома. Сложнее когда сервер чужой и уже рабочий, соответственно придется разбираться. Если же учесть что вы в первый раз восстанавливаете RAID задача усложняется, поскольку любая ошибка может привести к сбою сервера.
Да и помочь вам мало кто сможет, службы поддержки от потенциально опасных задач пытаются откреститься.
Понятно что для квалифицированного сотрудника это мало вероятно, но зачем рисковать. Так что в бой пойдем одни с книжкой в руках.
Для начала нам нужно определиться, что у нас RAID массивом. Проверяем его состояние:
cat /proc/mdstat
Так выглядит классический, RAID1 в рабочем состояние при двух винтах.
При ошибке [UU] будет иметь вид [U_] [_U] в зависимости от диска, вышедшего из строя.
Personalities : [raid1] md1 : active raid1 sdb3[0] sda3[2](F) 1860516800 blocks [2/1] [U_] md0 : active raid1 sdb1[0] sda1[2](F) 499904 blocks [2/1] [U_]
К сожалению, в момент написания статьи у меня RAID массив уже восстанавливался, а сделать скрин, я попросту забыл, так что довольствуемся текстом и картинками в перемешку.
Как мы видим, диск sda вышел из строя, соответственно разделы sda1 и sda3 вылетели из массивов, соответственно я предполагаю, что sda2 вышел из строя тоже, но не задействован в рейд.
Проверяем какие диски у нас на данный момент есть в системе.
fdisk –l
Его я приводить не буду, но думаю вам почитать лучше там.
Для простоты я использую
fdisk –l | grep /dev/
Как видим, диск вообще из системы пропал, и мы не сможем пометить разделы как «ошибочные» Но зато мы видим четко 3 раздела на sdb это:
- sdb1 отданный под md0 очевидно это /boot
- sdb2 явно swap соответственно
- sda3 наши данные
Ну и основной диск sdb3 его копия sda3 ныне почившая, остальные соответственно.
Проверяем:
vim /etc/fstab
Все верно, в системе было два диска побитых по 3 раздела + 1 ssd накопитель
Помечаем раздел как сбойный раздел
mdadm --manage /dev/md0 --fail /dev/sda1
Однако видим:
mdadm: cannot find /dev/sda1: No such file or directory
Пробуем удалить раздел:
mdadm --manage /dev/md0 --remove /dev/sda1
mdadm: cannot find /dev/sda1: No such file or directory
Что же происходит, мы сделали все по правилам, пометили как сбойный и попробовали удалить, однако ни один из вариантов не сработал вообще. Дело тут в том что диск вообще из системы пропал, и следовательно система честно отвечает что удалить его не может поскольку диска попросту нет. Тут я в свое время впал в небольшой ступор, поскольку вариантов удалить не так уж и много. Но нашелся вариант удаления и отсутствующих дисков
mdadm /dev/md0 -r detached mdadm /dev/md1 -r detached
В таком случае мы их сможем удалить, поскольку массивов два соответственно чистим каждый из них.
Далее все просто. Просим службу поддержки поменять диски, или делаем это самостоятельно. Единственное на что пришлось обратить внимание так на то что smart отказался давать серийник дисков отсутствующих в системе.
smartctl --all /dev/sda|grep Serial
klondike-server:~# smartctl -all /dev/sda
smartctl 5.40 2010-07-12 r3124 [x86_64-unknown-linux-gnu] (local build)
Copyright © 2002–10 by Bruce Allen,
Так что в службу поддержки пришлось писать о замене диска sda, но в связи с отсутствием возможности посмотреть серийник, были перечислены диски НЕ требующие замены. В привычку у меня вошел и еще один момент, я всегда указываю какой именно диск менять и другие диску категорически прошу не менять. Даже при нахождение на них сбоев, поскольку я попросту мог их не забэкапить (было дело выкинули не реплицируемый SSD накопитель, на котором болтались базы данных 300 сайтов.
Пришлось бегать как пострадавший и в экстренном порядке восстанавливать все БД из бэкапов, а поскольку БД самой админки почила там же, пришлось хорошо побегать.
После замены диска (уж не знаю зачем германцы тормозят сервера для замены диска это остается для меня тайной).
fdisk -l
Disk /dev/sdb: 2000.4 GB, 2000398934016 bytes 255 heads, 63 sectors/track, 243201 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00071549 Device Boot Start End Blocks Id System /dev/sdb1 1 63 500000 fd Linux raid autodetect Partition 1 does not end on cylinder boundary. /dev/sdb2 63 312 1998848 82 Linux swap / Solaris Partition 2 does not end on cylinder boundary. /dev/sdb3 312 231935 1860516864 fd Linux raid autodetect Disk /dev/sdc: 60.0 GB, 60022480896 bytes 255 heads, 63 sectors/track, 7297 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/sdc doesn't contain a valid partition table Disk /dev/md0: 511 MB, 511901696 bytes 2 heads, 4 sectors/track, 124976 cylinders Units = cylinders of 8 * 512 = 4096 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/md0 doesn't contain a valid partition table Disk /dev/md1: 1905.2 GB, 1905169203200 bytes 2 heads, 4 sectors/track, 465129200 cylinders Units = cylinders of 8 * 512 = 4096 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/md1 doesn't contain a valid partition table Disk /dev/sdd: 2000.4 GB, 2000398934016 bytes 255 heads, 63 sectors/track, 243201 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/sdd doesn't contain a valid partition table
Смотим на систему, видим появился чистенький диск /dev/sdd и он не размечен.
Нам осталось разбить его на разделы нужного нам размера и добавить нужный раздел в нужный массив.
На самом деле все куда проще, поскольку RIAD1 и разделы у нас должны быть идентичны мы их попросту скопируем с рабочего диска.
Внимательно делайте это действие. Копируем с sdb на sdd
sfdisk -d /dev/sdb | sfdisk /dev/sdd
Однако, я в начале сделаю backup.
sfdisk -d /dev/sdb > /var/backup/sdb.part
Восстановим с backup на другой диск, поскольку диск реципелент совершенно чистый, добавим -force
sfdisk /dev/sdd < /var/backup/sdb.part –force
Проверяем.
Как видим разметка в наличие.
Остается добавить их в соответствующие массивы.
mdadm --add /dev/md0 /dev/sdd1 mdadm --add /dev/md1 /dev/sda3
Процесс восстановления запущен, а md0 очень маленький уже восстановил свою работоспособность.
Осталось нам заменить sda2 на sdd2 в /etc/fstab
vim /etc/fstab
И ждем восстановление основного массива.
Если процесс восстановления идет слишком медленно или слишком сильно ест ресурсы системы, можно искусственно понизить скорость восстановлениия или увеличить ее.
Проверяем:
cat /proc/sys/dev/raid/speed_limit_min
Изменяем:
echo 50000 > /proc/sys/dev/raid/speed_limit_min
Можно тут:
vim /etc/sysctl.conf
Выставляем нужные нам пределы
dev.raid.speed_limit_min = 50000 dev.raid.speed_limit_max = 200000
Для вступления изменений в силу.
sysctl -p
На этом все.
Дополнительно: sfdisk не работает!
# sfdisk -s /dev/sda
WARNING: GPT (GUID Partition Table) detected on ’/dev/sda’! The util sfdisk doesn’t support GPT. Use GNU Parted.
В данном случае утилита sysctl не сможет работать с дисками с GPT, для переноса разделов нам понадобится другая утилита.
Устанавливаем пакет gdisk
apt-get install gdisk
Копируем таблицу разделов с рабочего диска на замененный:
ВНИМАТЕЛЬНО СИНТАКСИС! sgdisk -R <Новый_диск> <Рабочий_диск>
sgdisk -R /dev/sda /dev/sdb
Успешный результат даст нам: The operation has completed successfully.
Теперь нам изменить у копи GUID, поскольку он тоже скопирован.
sgdisk -G /dev/sda
Смотрим результат:
gdisk -l /dev/sda
Оставить комментарий