Замена сбойного диска в программном RAID-массиве

// Январь 23rd, 2013 // linux, md, RAID, recovery

Изначально имеем два диска /dev/sda и /dev/sdb, собранные в RAID1, по типу:
/dev/sda1 + /dev/sdb1 => /dev/md0
/dev/sda5 + /dev/sdb5 => /dev/md1

Диск /dev/sda вышел из стоя:

# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sdb5[0]
      1950708 blocks super 1.2 [2/1] [U_]

md0 : active raid1 sdb1[0]
      584692 blocks super 1.2 [2/1] [U_]

—-

Нужно извлечь сбойный sda из массива, для этого помечаем его сбойным для всех массивов:

mdadm --manage /dev/md0 --fail /dev/sda1
mdadm --manage /dev/md1 --fail /dev/sda5

если диск уже извлечен или недоступен системе, скорее всего получите сообщение:

mdadm: cannot find /dev/sda1: No such file or directory

можно не обращать внимание.
Далее удаляем сбойный диск из массивов:

mdadm --manage /dev/md0 --remove /dev/sda1
mdadm --manage /dev/md1 --remove /dev/sda5

теперь можно физически извлечь диск и заменить новым.

—-

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

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

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

Warning: extended partition does not start at a cylinder boundary.
DOS and Linux will interpret the contents differently.
...
Warning: partition 1 does not end at a cylinder boundary

sfdisk: I don't like these partitions - nothing changed.
(If you really want this, use the --force option.)

вариант собственно заставить его сделать это насильно, добавив ключ —force

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

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

# fdisk -l | grep dev
Disk /dev/sda: 249.9 GB, 249923032064 bytes
/dev/sda1   *           1          73      584704   fd  Linux raid autodetect
/dev/sda2              74        4863    38474753    5  Extended
/dev/sda5              74         317     1951744   fd  Linux raid autodetect
Disk /dev/sdb: 40.1 GB, 40060403712 bytes
/dev/sdb1   *           1          73      584704   fd  Linux raid autodetect
/dev/sdb2              74        4863    38474753    5  Extended
/dev/sdb5              74         317     1951744   fd  Linux raid autodetect

Добавим новый диск в массив:

mdadm --manage /dev/md0 --add /dev/sda1
mdadm --manage /dev/md1 --add /dev/sda5

должна начаться автоматическая синхронизация, посмотреть статус можно:

# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sda5[2] sdb5[0]
      1950708 blocks super 1.2 [2/1] [U_]
        resync=DELAYED

md0 : active raid1 sda1[2] sdb1[0]
      584692 blocks super 1.2 [2/1] [U_]
      [==========>..........]  recovery = 50.3% (294400/584692) finish=0.2min speed=17317K/sec

маленькая подсказка, в линуксе есть замечательная утилита watch, которая запускает каждые 2 секунды указанную программу, т.е. за процессом восстановления можно наблюдать в реальном времени:

watch cat /proc/mdstat

после синхронизации статус должен выглядеть примерно так:

# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sda5[2] sdb5[0]
      1950708 blocks super 1.2 [2/2] [UU]

md0 : active raid1 sda1[2] sdb1[0]
      584692 blocks super 1.2 [2/2] [UU]

unused devices: <none>

еще информацию по массиву можно получить:

mdadm --detail /dev/md0

—-

Если это диск загрузочный — не забываем сделать копию загрузочной области на новый диск!

Удачи в восстановлении!

12 комментариев to “Замена сбойного диска в программном RAID-массиве”

  1. dehnli:

    При замене сбойного диска на диск большего объема размер массива останется прежний? Если да, то как увеличить размер массива до размера большего диска в массиве (т.е в данном случае с 40Гб до 250)?

    • Если у вас зеркало, т.е. RAID1, возможный максимальный объем все равно будет равен объему диска с самым меньшим размеров. Допустим у вас есть два диска 40Гб + 250Гб, максимальный размер будет равен 40Гб. Но при этом не размеченную область на накопителе с размером 250Гб вы можете использовать вне рейда, т.е. как самостоятельные разделы без зеркала. Или если у вас было 40+40, заменить один на 250, синхронизировать информацию, затем заменить второй диск на 250, синхронизировать до получения консистентного зеркала, затем можно «растянуть» таблицы. Допустим вы уже поменяли диски и для зеркала использует одна партиция, «растянуть» её можно коммандами:
      mdadm --grow --size max /dev/md0
      resize2fs /dev/md0

      • mdadm —grow —size max /dev/md0 работает без остановки сервера?

        • Да, без остановки.
          Есть один момент, работает это только в одну сторону, т.е. увеличить объем можно, а уменьшить нет.

          • После установки 2 дисков 2 ТБ в рейд, он по прежнему 1 тб и указанные команды не помогают увеличить размер «на лету . после resize2fs /dev/md2 я получаю «The filesystem is already 244190192 blocks long. Nothing to do!

          • Оба диска заменены на 2ТБ? Иначе не получится, максимальный размер будет всегда равен меньшему диску!
            Для того что бы растянуть партицию, нужно два действия:
            resize2fs /dev/md0 — расширить партицию
            mdadm —grow —size max /dev/md0 — растянуть рейд по партиции

  2. Большое спасибо за ценные сведения. Полетел диск в рейде, пытался добавить, после многочасовой синхронизации снова вылетел. Сейчас будем меняять на новый, только новый диск большего размера, но я думаю что ключик
    sfdisk -d /dev/sdb | sfdisk —force /dev/sda

    поможет. Был диск 1 ТБ, теперь 2 ТБ.

  3. Roman:

    Спасибо за инфу.
    Полетел один хард, по данной инструкции заменил сначала сгоревший на новый большего размера, потом второй заменил.
    Т.е. в итоге стоят 2 харда по 2тб, вот только рейд так и остался на 1тб, растянуть не получается.
    Видимо надо сначала по очереди растянуть партиции вне рейда, а потом уже собирать их в рейд..
    Если есть мысли как это сделать, поделитесь пожалуйста.
    fdisk не осилил. думаю попробовать gparted+live usb, но немного переживаю за сохранность данных.

    • resize2fs /dev/md0 — расширить партицию на максимально доступный объем без fdisk-а, затем нужно растянуть сам рейд:
      mdadm --grow --size max /dev/md0

      • Roman:

        root@mail:~# resize2fs /dev/md0
        resize2fs 1.42.5 (29-Jul-2012)
        The filesystem is already 242711296 blocks long. Nothing to do!

        root@mail:~# mdadm —grow —size max /dev/md0
        mdadm: component size of /dev/md0 unchanged at 970845184K
        root@mail:~# fdisk -l

        Disk /dev/sdb: 2000.4 GB, 2000398934016 bytes
        255 heads, 63 sectors/track, 243201 cylinders, total 3907029168 sectors
        Units = sectors of 1 * 512 = 512 bytes
        Sector size (logical/physical): 512 bytes / 512 bytes
        I/O size (minimum/optimal): 512 bytes / 512 bytes
        Disk identifier: 0x900931d4

        Device Boot Start End Blocks Id System
        /dev/sdb1 * 2048 1941694463 970846208 fd Linux raid autodetect
        /dev/sdb2 1941696510 1953523711 5913601 5 Extended
        /dev/sdb5 1941696512 1953523711 5913600 82 Linux swap / Solaris

        Disk /dev/sda: 2000.4 GB, 2000398934016 bytes
        255 heads, 63 sectors/track, 243201 cylinders, total 3907029168 sectors
        Units = sectors of 1 * 512 = 512 bytes
        Sector size (logical/physical): 512 bytes / 512 bytes
        I/O size (minimum/optimal): 512 bytes / 512 bytes
        Disk identifier: 0x00000000

        Device Boot Start End Blocks Id System
        /dev/sda1 * 2048 1941694463 970846208 fd Linux raid autodetect
        /dev/sda2 1941696510 1953523711 5913601 5 Extended
        /dev/sda5 1941696512 1953523711 5913600 82 Linux swap / Solaris

        Disk /dev/md0: 994.1 GB, 994145468416 bytes
        2 heads, 4 sectors/track, 242711296 cylinders, total 1941690368 sectors
        Units = sectors of 1 * 512 = 512 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
        root@mail:~#

        • Вполне логичное поведение, партиция может располагаться только на едином последовательном пространстве, а у вас получается, партиция sda1 в рейде, а после неё следом идет следующий раздел, а только после этого свободное место, т.е. первой партиции не куда растягиваться. Удалите SWAP и раздел Extented, растяните партицию с указанием максимального размера, оставив место для свопа и все получится.

Leave a Reply