Как заменить диск в RAID

Монтирование файловой системы

После загрузки в режим Rescue требуется вручную примонтировать файловую систему, если данное действие не произошло автоматически. Для этого введите:

infiltrate-root

Если infiltrate-root не сработал, то одной из причин может быть то, что не собрался RAID.

Проверьте путь, введя команду:

fdisk -l

Если там нет md устройств, но в sda, sdb и так далее есть разделы с типом “Linux RAID”, то нужно собрать RAID.

Для получения доступа к файловой системе:

  1. Перезагрузитесь в режим Rescue.
  2. Введите команды:

    mdadm --assemble /dev/md0 /dev/sda2 /dev/sdb2
    mdadm --assemble /dev/md1 /dev/sda3 /dev/sdb3

    Примечание: адаптируйте названия соответственно существующим дискам. Подробнее о mdadm.

  3. При монтировании укажите напрямую путь к разделу vg-root в качестве аргумента, введя команду:

    infiltrate-root /dev/mapper/vg0-root

Пример замены диска

В сервере 2 диска: /dev/sda и /dev/sdb. Эти диски собраны в софтверный RAID1 с помощью mdadm.

Один из дисков вышел из строя, допустим, это /dev/sdb.

Удаление диска из массива

Примечание: перед заменой диска желательно убрать диск из массива.

Проверьте, как размечен диск в массиве:

cat /proc/mdstat 

Personalities : [raid1] 
md1 : active raid1 sda3[0] sdb3[1]
      975628288 blocks super 1.2 [2/2] [UU]
      bitmap: 3/8 pages [12KB], 65536KB chunk

md0 : active raid1 sda2[2] sdb2[1]
      999872 blocks super 1.2 [2/2] [UU]
      
unused devices: <none>

В данном случае массив собран так, что md0 состоит из sda2 и sdb2, md1 — из sda3 и sdb3.

На этом сервере md0 — это /boot, md1 — своп и корень.

lsblk
NAME             MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
loop0              7:0    0   985M  1 loop  
sda                8:0    0 931.5G  0 disk  
├─sda1             8:1    0     1M  0 part  
├─sda2             8:2    0   977M  0 part  
│ └─md0            9:0    0 976.4M  0 raid1 
└─sda3             8:3    0 930.6G  0 part  
  └─md1            9:1    0 930.4G  0 raid1 
    ├─vg0-swap_1 253:0    0   4.8G  0 lvm   
    └─vg0-root   253:1    0 925.7G  0 lvm   /
sdb                8:16   0 931.5G  0 disk  
├─sdb1             8:17   0     1M  0 part  
├─sdb2             8:18   0   977M  0 part  
│ └─md0            9:0    0 976.4M  0 raid1 
└─sdb3             8:19   0 930.6G  0 part  
  └─md1            9:1    0 930.4G  0 raid1 
    ├─vg0-swap_1 253:0    0   4.8G  0 lvm   
    └─vg0-root   253:1    0 925.7G  0 lvm   /

Уберите sdb из всех устройств:

mdadm /dev/md0 --remove /dev/sdb2
mdadm /dev/md1 --remove /dev/sdb3

Если разделы из массива не удаляются, как в нашем случае, mdadm не считает диск неисправным и использует его, и при удалении будет выведена ошибка, что устройство используется.

В этом случае перед удалением пометьте диск как сбойный:

mdadm /dev/md0 -f /dev/sdb2
mdadm /dev/md1 -f /dev/sdb3

Снова выполните команды по удалению разделов из массива.

После удаления сбойного диска из массива запросите замену диска, создав тикет с указанием s/n сбойного диска. Наличие downtime зависит от конфигурации сервера.

Определение таблицы разделов (GPT или MBR) и ее перенос на новый диск

После замены поврежденного диска нужно добавить новый диск в массив. Для этого надо определить, какая у нас таблица разделов: GPT или MBR. Для этого будем использовать gdisk.

Установите gdisk:

apt-get install gdisk -y

Выполните:

gdisk -l /dev/sda

, где /dev/sda — исправный диск, находящийся в raid.

В выводе будет примерно это для MBR:

Partition table scan:
MBR: MBR only
BSD: not present
APM: not present
GPT: not present

И примерно это для GPT:

Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present

Перед добавлением диска в массив, на нем нужно создать разделы в точности такие же, как и на sda. В зависимости от разметки диска, это делается по-разному.

Обратите внимание! Первым пишется диск, на который копируется разметка, а вторым — с которого копируют. Если перепутать их местами, то разметка на изначально исправном диске будет уничтожена.

Копирование разметки для GPT:

sgdisk -R /dev/sdb /dev/sda

Присвойте диску новый случайный UIDD:

sgdisk -G /dev/sdb

Обратите внимание! Здесь наоборот первым пишется диск, с которого переносим разметку, а вторым — на который переносим.

Копирование разметки для MBR:

sfdisk -d /dev/sda | sfdisk /dev/sdb

Если разделы не видны в системе, то можно перечитать таблицу разделов командой:

sfdisk -R /dev/sdb

Добавление диска в массив

Когда созданы разделы на /dev/sdb, то можно добавлять диск в массив:

mdadm /dev/md0 -a /dev/sdb2
mdadm /dev/md1 -a /dev/sdb3

После добавления диска в массив должна начаться синхронизация. Скорость зависит от размера и типа диска (ssd/hdd).

cat /proc/mdstat 
Personalities : [raid1] 
md1 : active raid1 sda3[1] sdb3[0]
      975628288 blocks super 1.2 [2/1] [U_]
      [============>........]  recovery = 64.7% (632091968/975628288) finish=41.1min speed=139092K/sec
      bitmap: 3/8 pages [12KB], 65536KB chunk

md0 : active raid1 sda2[2] sdb2[1]
      999872 blocks super 1.2 [2/2] [UU]
      
unused devices: <none>

Установка загрузчика

После добавления диска в массив нужно установить на него загрузчик.

Если сервер загружен в нормальном режиме или в infiltrate-root, в который мы зашли ранее, то это делается одной командой:

grub-install /dev/sdb

Если сервер загружен в recovery или rescue, т.е. с live cd, то установка загрузчика выглядит следующим образом:

  1. Смонтируйте корневую файловую систему в /mnt:

    mount /dev/md2 /mnt
  2. Смонтируйте boot:

    mount /dev/md0 /mnt/boot
  3. Смонтируйте /dev, /proc и /sys:

    mount --bind /dev /mnt/dev
    mount --bind /proc /mnt/proc
    mount --bind /sys  /mnt/sys
  4. Сделайте chroot в примонтированную систему:

    chroot /mnt
  5. Установите grub на sdb:

    grub-install /dev/sdb

Теперь можно попробовать загрузиться в нормальный режим.

Как заменить диск, если он сбойный

Диск в массиве можно условно сделать сбойным, ключ --fail (-f):

mdadm /dev/md0 --fail /dev/sda1
mdadm /dev/md0 -f     /dev/sda1

Сбойный диск можно удалить с помощью ключа --remove (-r):

mdadm /dev/md0 --remove /dev/sda1
mdadm /dev/md0 -r       /dev/sda1

Добавить новый диск в массив можно с помощью ключей --add (-a) и --re-add:

mdadm /dev/md0 --add /dev/sda1
mdadm /dev/md0 -a    /dev/sda1

Ошибка при восстановлении загрузчика после замены диска в RAID1

Если при установке grub возникает ошибка следующего содержания:

root #grub-install --root-directory=/boot /dev/sda
Could not find device for /boot/boot: not found or not a block device

Выполните:

root #grep -v rootfs /proc/mounts > /etc/mtab