Замена дисков в массиве mdadm. Увеличение размера массива

Первая часть трилогии о модернизации бекап-сервера. Итак, имеется сервер с системным диском sda и raid5 массивом md0 из 4 дисков sd[b-e] по 2ТБ каждый. ОС Gentoo. Ввиду того, что smartctl стал показывать не совсем удовлетворительное состояние дисков в сервере было принято решение заменить текущие харды на новые, по 4ТБ каждый. При этом задействовать все доступное пространство c сохранением всех данных в процессе перехода

Пост написан по «горячим следам». Информации будет много. Над каждой операцией рекомендуется думать, а не тупо копипастить

Замена дисков

Прежде, чем работать с массивом размонтируем его

df -h | grep md0

/dev/md0p1     5.5T    4.5T    720G    87%    /backup

umount /backup

Проверим состояние массива

cat /proc/mdstat

md0 : active raid5 sde1[5] sdd1[4] sdc1[1] sdb1[2]
5860147200 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [UUUU]

Массив синхронизирован, все харды в работе

И какой диск менять?

Замена дисков в массиве mdadm

Выделяется блок из 4 дисков sd[b-e]. Кто из них кто, непонятно. Справа на черном шлейфе системный sda

Чтобы с этим разобраться попросим smartctl показать серийные номера всех хардов. В качестве примера работаем с диском sde. С остальными все аналогично

smartctl --all /dev/sde | grep -i 'Serial'

Serial Number: Z293SBCG

Этот номер записали. Позже будем искать его на наклейке харда

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

mdadm --manage /dev/md0 --fail /dev/sde1 --remove /dev/sde1

mdadm: set /dev/sde1 faulty in /dev/md0
mdadm: hot removed /dev/sde1 from /dev/md0

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

mdadm: hot remove failed for /dev/sde: Device or resource busy

Смотрим, что осталось

cat /proc/mdstat

Замена дисков в массиве mdadm

Отлично, sde в массиве нет! Выключаем сервер и ищем диск с серийным номером Z293SBCG и меняем его на новый

После запуска сервера копируем разметку со старого «живого» диска на свежеустановленный

sfdisk -d /dev/sdb | sfdisk /dev/sde


The size of this disk is 3.6 TiB (4000787030016 bytes). DOS partition table format cannot be used on drives for volumes larger than 2199023255040 bytes for 512-byte sectors. Use GUID partition table format (GPT)

Created a new DOS disklabel with disk identifier 0xf90f6227.

/dev/sde1: Created a new partition 1 of type ‘Linux raid autodetect’ and of size 1.8 TiB.
/dev/sde2: Done.

New situation:
Disklabel type: dos
Disk identifier: 0xf90f6227

Device Boot Start End Sectors Size Id Type
/dev/sde1 2048 3907029167 3907027120 1.8T fd Linux raid autodetect

The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Немного ругается на размер, но сейчас это неважно. Добавляем диск в массив

mdadm --manage /dev/md0 --add /dev/sde1

mdadm: added /dev/sde1

Это все. Наблюдаем за синхронизацией онлайн

watch 'cat /proc/mdstat'

Время синхронизации 4+ часов после каждой замены

После окончания синхронизации можно приступать к замене следующего диска

В результате инфа перенесена один-в-один с теми же размерами разделов, что и на старых хардах. Дополнительное пространство еще не доступно

Увеличение размера массива

После замены всех дисков и синхронизации (смотрим, что показывает cat /proc/mdstat) можно приступать к процедуре увеличения размера массива, что возможно если текущий RAID имеет тип 1, 4, 5, 6. Для этого необходимо будет выполнить несколько шагов, а именно:

  1. Удалить диск из массива, увеличить его размер и снова вернуть в массив. Дождаться окончания синхронизации. Эту операцию нужно проделать с каждым диском
  2. Увеличить размер md0, который кстати не в курсе, что у него диски с большим размером, ему об этом нужно сообщить
  3. Изменить размер раздела массива и файловой системы расширив их до максимума

Шаг #1. Удаление диска. Переход с MBR на GPT. Изменение размера диска

В ходе работ было видно, что со старых дисков, объем которых был 2ТБ перекочевала и старая схема разделов MBR. У такой схемы есть ограничения — 2ТБ на раздел. Новые диски по 4ТБ, следовательно нужна GPT

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

mdadm --manage /dev/md0 --fail /dev/sde1 --remove /dev/sde1

Размер меняем при помощи parted. Для начала посмотрим, что он видит

parted /dev/sde print
Замена дисков в массиве mdadm

Ключевое слово msdos

Сразу создаем новую схему разделов GPT

parted /dev/sde mklabel gpt

На вопрос

Warning: The existing disk label on /dev/sde will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No?

отвечаем ‘Y’. И пусть рука не дрогнет 🙂

Создаем раздел с меткой ‘backup’. Размер раздела — все доступное пространство

parted -s /dev/sde mkpart backup 1 100%

Смотрим на схему разделов

parted /dev/sde print
Замена дисков в массиве mdadm

Ключевое слово gpt. Изменился размер раздела

и добавляем диск в массив

mdadm --manage /dev/md0 --add /dev/sde1

mdadm: re-added /dev/sde1

Может начаться синхронизация. Тогда нужно ждать. У меня кажется такого не было. На всякий случай смотрим, что покажет cat /proc/mdstat

С остальными дисками проделываем те же операции. Кому страшно, может сделать бекап. Бекап бекап-сервера звучит прикольно. Хотя я допускаю, что для кого-то это реалии

Шаг #2. Изменение размера md0

Еще раз убеждаемся, что все диски синхронизированы (опять cat /proc/mdstat. Да, эта команда популярна). Если так, то смотрим, что знает md0 о своем размере и размере диска к нему подлюченного

mdadm -D /dev/md0 | grep -e "Array Size" -e "Dev Size"

Array Size : 5860147200 (5588.67 GiB 6000.79 GB)
Used Dev Size : 1953382400 (1862.89 GiB 2000.26 GB)

Из этого ответа ясно, что для md0 до сего момента ничего не изменилось

Увеличим размер массива до максимума

mdadm --grow /dev/md0 -z max

mdadm: component size of /dev/md0 has been set to 3906885632K

И еще раз смотрим на размер массива и устройства

mdadm -D /dev/md0 | grep -e "Array Size" -e "Dev Size"

Array Size : 11720656896 (11177.69 GiB 12001.95 GB)
Used Dev Size : 3906885632 (3725.90 GiB 4000.65 GB)

Такс, уже другие цифры. Размер md0 увеличен. Проверяем

parted /dev/md0 print

Warning: Not all of the space available to /dev/md0 appears to be used, you can fix the GPT to use all of the space (an extra 11721019392 blocks) or continue with the current setting?
Fix/Ignore? Fix
Model: Linux Software RAID Array (md)
Disk /dev/md0: 12.0TB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1    1000kB    6001GB    6001GB    ext4    backup

Команда попросила разрешения пофиксить, соглашаемся. Размер md0 изменился, размер раздела 1 остался прежний

Шаг #3. Увеличение размера раздела и файловой системы

Увеличиваем размер раздела (Number 1) до максимального

parted -s /dev/md0 resizepart 1 -1

Проверяем, что вышло

parted /dev/md0 print

Model: Linux Software RAID Array (md)
Disk /dev/md0: 12.0TB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1    1000kB    12.0TB    12.0TB    ext4    backup

Размер раздела 1 стал больше, как и ожидалось

Проверяем состояние ФС на разделе. Это обязательно

e2fsck -f /dev/md0p1

e2fsck 1.46.5 (30-Dec-2021)
Pass 1: Checking inodes, blocks, and sizes
Inode 55181323 extent tree (at level 2) could be narrower. Optimize<y>? yes
Inode 55181337 extent tree (at level 2) could be narrower. Optimize<y>? yes
Inode 55181364 extent tree (at level 2) could be narrower. Optimize<y>? yes
Inode 55181383 extent tree (at level 2) could be narrower. Optimize<y>? yes
Inode 55181398 extent tree (at level 2) could be narrower. Optimize<y>? yes
Pass 1E: Optimizing extent trees
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information

И последний шаг, увеличение размера ФС

resize2fs /dev/md0p1

Resizing the filesystem on /dev/md0p1 to 2930163735 (4k) blocks.
The filesystem on /dev/md0p1 is now 2930163735 (4k) blocks long.

Проверяем, что видят md0 и ОС

cat /proc/mdstat

md0 : active raid5 sdd1[5] sde1[4] sdb1[7] sdc1[6]
11720656896 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]

mount /dev/md0p1 /backup/
df -h /backup

/dev/md0p1    11T    4.5T    5.9T    44%    /backup

Отлично! Что и требовалось сделать

На следующем этапе работ предстоит заставить ОС увидеть raid-контроллер 3ware, после чего выполнить миграцию системы без LiveCD

P.S.

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

Все операции с parted выполнялись в командной строке. Само-собой, что их можно выполнить непосредственно в интерфейсе parted выбрав нужный диск

Вся эта работа выполнялась из чисто спортивного интереса. Можно было пойти тремя путями:

  1. вытащить старые харды, вставить новые, пересоздать массив и получить максимум пространства. После пересоздать структуру папок, куда складываются бекапы с других серверов и раздать им нужные права. Самый быстрый вариант по времени
  2. поменять харды последовательно, по-одному, как написано в первой части поста с последующим пересозданием массива, папок и прав. Тут нужно больше времени ибо синхронизация, которая длилась 4+ часов после каждой замены. Не очень отличается от п.1
  3. вставить дополнительно новый хард, переписать инфу на него (пришлось бы пожертвовать частью бекапов, все не поместилось бы), удалить старые харды, создать raid5 из 3 оставшихся новых, переписать инфу на вновь созданный md0 (у которого уже новый UUID) после чего добавить 4-й хард в массив и пережить синхронизацию

Первых два варианта предполагали потерю бекапов и надежды на то, что «сегодня» ничего не навернется и пользователи не попросят что-то восстановить. Третий вариант показался тривиальным. Кроме того хотелось сделать «все красиво». В результате бекапы не пострадали, админ приобрел опыт и написал полезный, как он думает пост

0 0 голоса
Оцените статью
Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии