Жан-Кристоф Бертон. Преобразование RAID 1 в RAID 10 без перерыва в работе

Это перевод статьи: Jean-Christophe Berton. Converting RAID1 to RAID10 online

Содержание

Введение

У меня есть (ныне устаревший) микросервер HP с 4 жёсткими дисками. Я установил на него Ubuntu 14.04 (тогда ещё бета-версию) в тихое воскресенье февраля 2014 года. Сейчас он работает под управлением Ubuntu 16.04 и по-прежнему прекрасно работает. Однако, я не помню, о чём думал в то воскресенье больше 3 лет назад. Я поделил 4 жёстких диска одинаковым образом, создав раздел для /boot, раздел подкачки и последний - для тома BTRFS (с подтомами для отделения / от пространств /var и /home). Я хотел иметь 4 раздела для /boot в RAID 10 и 4 - для раздела подкачки в RAID 0. Сегодня я понял, что использовал только 2 раздела для /boot и настроил их в RAID 1, и использовал всего 3 раздела для подкачки, настроив их в RAID 0.

Из-за этого у меня возникли проблемы: поскольку каждый раздел для /boot имел размер 256 мегабайт, то вместо объёма 512 (RAID 10 из 4 устройств) получился объём 256 мегабайт (RAID 1), а это не много, если устанавливать ядра Ubuntu HWE (Hardware Enablement), потому что установка обновлений безопасности завершалась неудачно из-за нехватки места на /boot. На это тратились повышенные усилия, а с учётом 4 детей, требующих внимания, мне нужно было скорее исправить это.

Но в Linux есть волшебный способ, я без перерывов в работе преобразовал RAID 1 в RAID 10 (через RAID 0) и без перерывов в работе изменил размер /boot (ext4). Всего за 15 минут я превратил проблемные 256 мегабайт раздела /boot в 512 мегабайт, не требующих внимания, без перезагрузки!

Я сделал это следующим образом, доступным только в mdadm версии 3.3+ (может работать в версии 3.2.1+, но я не проверял) и свежим ядром (у меня это было ядро версии 4.10, но также должно работать с ядром версии 4.4, поставляемом в Ubuntu 16.04 и, возможно, более старыми ядрами). Отмечу, что стоит сделать резервную копию, протестировать резервную копию и знать, как её восстановить в /boot (или в другой раздел, который вы хотите преобразовать).

Увеличение размера массива RAID 0 (для подкачки)

Сначала о том, как я исправил RAID 0 для подкачки (резервная копия не требуется, но нужно иметь достаточно свободной оперативной памяти, чтобы освободить раздел подкачки). Текущий RAID 0 называется md0 и состоит из sda3, sdb3 и sdc3. Раздел sdd3 отсутствует.

$ sudo mdadm --grow /dev/md0 --raid-devices=4 --add /dev/sdd3
mdadm: level of /dev/md0 changed to raid4
mdadm: added /dev/sdd3
mdadm: Need to backup 6144K of critical section..
$ cat /proc/mdstat
md0 : active raid4 sdd3[4] sdc3[2] sda3[0] sdb3[1]
      17576448 blocks super 1.2 level 4, 512k chunk, algorithm 5 [5/4] [UUU__]
      [>....................]  reshape =  1.8% (105660/5858816) finish=4.6min speed=20722K/sec
$ sudo swapoff /dev/md0
$ grep swap /etc/fstab
UUID=2863a135-946b-4876-8458-454cec3f620e none            swap    sw              0       0
$ sudo mkswap -L swap -U 2863a135-946b-4876-8458-454cec3f620e /dev/md0
$ sudo swapon -a

Всё, что я сделал - это сообщил MD, что мне нужно увеличить массив с 3 до 4 устройств и добавить новое устройство. После перестроения объём увеличился (перестроение было быстрым, потому что размер раздела небольшой - всего 256 мегабайт). После первой операции массив увеличился, но размер подкачки остался прежним. Поэтому я "размонтировал" или, другими словами, выключил подкачку, заново создал раздел подкачки размером со всё устройство и заново "смонтировал" его. Я проверил, что для монтирования раздела в файле /etc/fstab указан UUID. При форматировании использовался тот же самый UUID, поэтому изменений в файле /etc/fstab не потребовалось.

Преобразование массива RAID 1 в RAID 10 без перерыва (без копирования данных)

Теперь немного сложнее. Я хочу преобразовать массив из RAID 1 в RAID 10 без перерыва. Напрямую это сделать нельзя, но это можно сделать через RAID 0. Вы должны учесть, что RAID 0 очень опасен, поэтому на этот раз действительно стоит сделать резервную копию, как это и рекомендовалось ранее.

Преобразование из RAID 1 в RAID 0 без перерыва в работе

Текущий массив RAID 1 называется md1 и состоит из sdb2 и sdc2. Я преобразую его в RAID 0. После преобразования массив будет состоять только из одного диска.

$ sudo mdadm --grow /dev/md1 --level=0 --backup-file=/home/backup-md0
$ cat /proc/mdstat
md1 : active raid0 sdc2[1]
      249728 blocks super 1.2 64k chunks
$ sudo mdadm --misc --detail /dev/md1
/dev/md1:
        Version : 1.2
  Creation Time : Sun Feb  9 15:13:33 2014
     Raid Level : raid0
     Array Size : 249664 (243.85 MiB 255.66 MB)
   Raid Devices : 1
  Total Devices : 1
    Persistence : Superblock is persistent

    Update Time : Tue Jul 25 19:27:56 2017
          State : clean 
 Active Devices : 1
Working Devices : 1
 Failed Devices : 0
  Spare Devices : 0

     Chunk Size : 64K

           Name : jupiter:1  (local to host jupiter)
           UUID : b95b33c4:26ad8f39:950e870c:03a3e87c
         Events : 68

    Number   Major   Minor   RaidDevice State
       1       8       34        0      active sync   /dev/sdc2

Я привёл дополнительную информацию о массиве, чтобы показать, что это по-прежнему тот же самый массив, но RAID 0 и только с 1 диском.

Преобразование RAID 0 в RAID 10 без перерыва в работе

$ sudo mdadm --grow /dev/md1 --level=10 --backup-file=/home/backup-md0 --raid-devices=4 --add /dev/sda2 /dev/sdb2 /dev/sdd2
mdadm: level of /dev/md1 changed to raid10
mdadm: added /dev/sda2
mdadm: added /dev/sdb2
mdadm: added /dev/sdd2
raid_disks for /dev/md1 set to 5
$ cat /proc/mdstat
md1 : active raid10 sdd2[4] sdb2[3](S) sda2[2](S) sdc2[1]
      249728 blocks super 1.2 2 near-copies [2/2] [UU]
$ sudo mdadm --misc --detail /dev/md1
/dev/md1:
        Version : 1.2
  Creation Time : Sun Feb  9 15:13:33 2014
     Raid Level : raid10
     Array Size : 249664 (243.85 MiB 255.66 MB)
  Used Dev Size : 249728 (243.92 MiB 255.72 MB)
   Raid Devices : 2
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Tue Jul 25 19:29:10 2017
          State : clean 
 Active Devices : 2
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 2

         Layout : near=2
     Chunk Size : 64K

           Name : jupiter:1  (local to host jupiter)
           UUID : b95b33c4:26ad8f39:950e870c:03a3e87c
         Events : 91

    Number   Major   Minor   RaidDevice State
       1       8       34        0      active sync set-A   /dev/sdc2
       4       8       50        1      active sync set-B   /dev/sdd2

       2       8        2        -      spare   /dev/sda2
       3       8       18        -      spare   /dev/sdb2

В результате преобразования получился RAID 10 с 2 дисками и 2 запасными дисками. Нам нужно сообщить MD использовать 2 запасных диска, в то получится RAID 1 просто поменявший название.

$ sudo mdadm --grow /dev/md1 --raid-devices=4
$ cat /proc/mdstat
md1 : active raid10 sdd2[4] sdb2[3] sda2[2] sdc2[1]
      249728 blocks super 1.2 64K chunks 2 near-copies [4/4] [UUUU]
      [=============>.......]  reshape = 68.0% (170048/249728) finish=0.0min speed=28341K/sec
$ sudo mdadm --misc --detail /dev/md1
/dev/md1:
        Version : 1.2
  Creation Time : Sun Feb  9 15:13:33 2014
     Raid Level : raid10
     Array Size : 499456 (487.83 MiB 511.44 MB)
  Used Dev Size : 249728 (243.92 MiB 255.72 MB)
   Raid Devices : 4
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Tue Jul 25 19:29:59 2017
          State : clean, resyncing 
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 0

         Layout : near=2
     Chunk Size : 64K

  Resync Status : 99% complete

           Name : jupiter:1  (local to host jupiter)
           UUID : b95b33c4:26ad8f39:950e870c:03a3e87c
         Events : 111

    Number   Major   Minor   RaidDevice State
       1       8       34        0      active sync set-A   /dev/sdc2
       4       8       50        1      active sync set-B   /dev/sdd2
       3       8       18        2      active sync set-A   /dev/sdb2
       2       8        2        3      active sync set-B   /dev/sda2

И ещё раз, преобразование очень быстрое, но из-за малого размера массива. Можно увидеть, что размер массива теперь 512 мегабайт, но используется лишь 256 мегабайт. Следующий шаг - увеличить размер файловой системы.

Увеличение файловой системы без перерыва в работе для полного использования RAID 10

Это нельзя сделать без перерыва в работе для любой файловой системы. Но я протестировал XFS и ext4 и это прекрасно работает. Я думаю, что другие файловые системы тоже поддерживают это, но я никогда не пробовал сделать это без перерыва в работе. В любом случае, сделайте резервную копию, как это было рекомендовано, прежде чем продолжить.

$ sudo resize2fs /dev/md1
resize2fs 1.42.13 (17-May-2015)
Filesystem at /dev/md1 is mounted on /boot; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/md1 is now 499456 (1k) blocks long.

$ df -Th /boot/
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/md1       ext4  469M  155M  303M  34% /boot

При изменении массива /boot не забудьте о GRUB

У меня уже был массив RAID до этого. Поэтому конфигурация Grub верна и не требует изменений. Но если массив преобразован из какого-то отличного от RAID 1 уровня (например, из RAID 5), тогда стоит обновить GRUB, поскольку существует вероятность, что может понадобиться другой модуль для начальных этапов загрузки. В Ubuntu запустите sudo update-grub, за правильным способом на других платформах обратитесь к man grub-mkconfig (например, sudo grub-mkconfig -o /boot/grub/grub.cfg).

Недостаточно правильной конфигурации GRUB. Нужно убедиться, что загрузчик GRUB установлен на все диски.

$ sudo grub-install /dev/sdX  # Например: sudo grub-install /dev/sda