Жан-Кристоф Бертон. Преобразование RAID 1 в RAID 10 без перерыва в работе
Это перевод статьи: Jean-Christophe Berton. Converting RAID1 to RAID10 online
Содержание
- Жан-Кристоф Бертон. Преобразование RAID 1 в RAID 10 без перерыва в работе
- Содержание
- Введение
- Увеличение размера массива RAID 0 (для подкачки)
- Преобразование массива RAID 1 в RAID 10 без перерыва (без копирования данных)
- Преобразование из RAID 1 в RAID 0 без перерыва в работе
- Преобразование RAID 0 в RAID 10 без перерыва в работе
- Увеличение файловой системы без перерыва в работе для полного использования RAID 10
- При изменении массива /boot не забудьте о GRUB
Введение
У меня есть (ныне устаревший) микросервер 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