Увеличиваем размер массива raid1 созданного mdadm с апгрейдом дисковой системы.

Фев 14th, 2020 | Posted by | Filed under Debian, Hardware, Life, Linux, Lubuntu, PC, Software, Ubuntu

Перестало хватать места на накопителе. Появилась необходимость и возможность поменять диски на более ёмкие? Вперёд!

Будем считать, что у нас сервер с 2 (и более) дисками, на которых есть системный раздел и раздел с данными (и своп). Везде raid1. Если массивы другого индекса, действия несколько иные 🙂

1. Выключаем сервер, отключаем все диски кроме одного, который должен быть загрузочным. Подключаем новые диски бОльшего объёма. Включаем, выбираем загрузку со старого диска, ждём, пока загрузится. Грузиться может долго, потому что не найдётся какой-нибудь своп или ещё что-нибудь.

2. Командой lsblk (от пользователя с любыми правами) смотрим, каким именем подключился старый диск. Например, sda:

$lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 465,8G 0 disk
├─sda1 8:1 0 29,8G 0 part
│ └─md0 9:0 0 29,8G 0 raid1 /
├─sda2 8:2 0 1,9G 0 part [SWAP]
└─sda3 8:3 0 434,1G 0 part
└─md1 9:1 0 434G 0 raid1 /shares
sdb 8:16 0 931,5G 0 disk
sr0 11:0 1 1024M 0 rom

Внимание! Здесь и далее набираемые команды предваряются знаками «$» или «#». В первом случае («$») команду можно запускать от любого пользователя, во втором («#») — только от суперпользователя. Сам знак «$» или «#» набирать не следует, просто следите, чтобы команда запускалась правильно, иначе её действие выполнено не будет.

3. Диск sdb пустой, нужно сделать на нём таблицы разделов. Проще всего для этого клонировать таблицу со старого, а потом заново создать раздел данных нужного размера. Что мы имеем? Посмотрим:

#sfdisk -d /dev/sda
label: dos
label-id: 0x17d1b937
device: /dev/sda
unit: sectors

/dev/sda1 : start= 2048, size= 62498816, type=fd, bootable
/dev/sda2 : start= 62500864, size= 3905536, type=82
/dev/sda3 : start= 66406400, size= 910364672, type=fd

4. Выглядит всё хорошо, клонируем:

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

Внимание! Если старый диск с системой и данными имеет имя, отличное от sda, пишем в #sfdisk -d /dev/… его. Если пустой диск имеет имя, отличное от sdb, пишем в #sfdisk /dev/… его. Включаем голову. Если возникает путаница, прописываем предварительно все команды на листке, 7 раз проверяем и 1 раз набираем. Помним, что при неверных действиях мы теряем систему и/или данные, и, в таком случае, придётся выключать сервер и вставлять один из извлечённых ранее из сервера дисков и повторять всё правильно. Это замечание имеем в виду во всех дальнейших действиях!

Готово! Теперь удалим /dev/sdb3 (!) и создадим новый на всё пространство.

Внимание! Здесь надо сделать замечание, что используются одинаковые диски, имеющие одинаковый объём. Если объём дисков будет чуть различаться, желательно оставить в конце диска небольшое свободное пространство, чтобы на другом (других) дисках раздел такого же размера гарантированно поместился. Другой вариант — просмотреть размеры дисков, создать раздел на самом меньшем диске и клонировать структуру разделов с него на остальные.

5. Удаляем, создаём.

#fdisk /dev/sdb

Команда d удаляет, команда n создаёт. Если вводить параметры по умолчанию, то под новый раздел используется всё свободное пространство. Команда t меняет тип раздела. Для mdadm raid надо ввести тип fd. Команда w записывает изменения.

6. Не забываем, что, если заменено более 1 диска, эти операции надо проделать со всеми заменёнными дисками. Список дисков, разделов, массивов mdadm raid и точек их монтирования можно посмотреть командой $lsblk

7. Создали разделы, можно их подключать:

#mdadm —manage /dev/md0 —add /dev/sdb1

#mdadm —manage /dev/md1 —add /dev/sdb3

Внимание! Если заменено (добавлено) было более 1 диска, можно добавлять сразу все добавленные, главное — чтобы на них предварительно были сделаны разделы. В этом случае окончание команды примет вид: … —add /dev/sdb1 /dev/sdc1 /dev/sdd1 и т.д. сколько бы их там ни было.

Сразу как подключили, система начнёт копировать информацию со старого диска на новые, сразу на все. Может быть, это будет чуть медленнее, чем на один, но не нужно будет повторять операцию добавления несколько раз. Есть два массива — запустили по одному разу для каждого — и готово, синхронизация идёт. Не надо ждать синхронизации одного массива прежде чем запускать вторую, вторая синхронизация просто добавится в очередь и запустится после окончания первой автоматически.

8. Создаём структуру своп на разделах своп новых дисков, если они там должны быть. В нашем случае, /dev/sda2 уже есть, нужно сделать своп на разделе /dev/sdb2 (и всех других, если надо). Запускаем:

#mkswap /dev/sdb2

Смотрим вывод команды. Там есть служебная информация и символьное имя раздела, например, «UUID=1ad0b9ad-7008-4642-93cf-525fa8b79674». Служебная информация нам интересна только в плане, удачно ли завершилась операция или нет. Обычно — удачно, так что я даже не особо смотрю на служебную информацию. А вот имя UUID-а нам нужно для прописывания свопа в fstab. Так что запускаем команду ещё раз и перенаправляем её вывод в конец файла /etc/fstab вот так:

#mkswap /dev/sdb2>>/etc/fstab

Внимание! Обратите внимание, что знаков «>» должно быть два, непременно два! Иначе вывод команды сотрёт весь файл /etc/fstab и кроме вывода команды в нём больше ничего не останется. Запускаем такую команду для всех разделов свопа, которые создавали, например,

#mkswap /dev/sdc2>>/etc/fstab

#mkswap /dev/sdd2>>/etc/fstab

И т.д.

9. После этого надо отредактировать /etc/fstab до требуемого системе вида, иначе система грузиться не будет:

#nano /etc/fstab

И приводим строчки к виду:

UUID=dae484cd-b8a6-41db-92c8-17cba65abda1 none swap sw 0 0
UUID=1ad0b9ad-7008-4642-93cf-525fa8b79674 none swap sw 0 0

То есть стираем всю служебную информацию, оставляем UUID=… и подписываем окончания строк.

Внимание! В файле /etc/fstab были записи для разделов своп старых дисков, их надо убрать. Как узнать, какие убрать? Запустить команду:

$ls /dev/disk/by-uuid/ -la

Она покажет UUID для имевшихся при загрузке разделов. Находим там своп раздел старого диска /dev/sda2, смотрим его UUID и только его оставляем из имевшихся в /etc/fstab записях разделов своп старых дисков, остальные все должны быть записи своп разделов новых дисков.

10. В процессе загрузки ядро системы может захотеть увидеть какой-нибудь из действующих свопов. Если впереди маячит замена и старого диска тоже, лучше всего сразу прописать своп на одном из новых дисков. Этим заведует файл настроек /etc/initramfs-tools/conf.d/resume, редактируем его командой $nano /etc/initramfs-tools/conf.d/resume:

RESUME=UUID=1ad0b9ad-7008-4642-93cf-525fa8b79674

UUID своп раздела должен быть существующий на новом диске.

11. Проверяем, просинхронизировались ли данные на всех массивах mdadm raid1 командой:

$watch cat /proc/mdstat

Она непрерывно в реальном времени показывает ход процесса.

12. Когда синхронизация закончилась, переконфигурируем mdadm:

#mdadm —detail —scan>/etc/mdadm/mdadm.conf

#dpkg-reconfigure mdadm

Внимание! Вторая команда приведена для дистрибутива Debian. Если вы используете другой дистрибутив, смотрите документацию по вашему дистрибутиву. Или не запускайте её совсем 🙂 Она задаёт несколько вопросов и дописывает дополнительные параметры в файл конфигурации, без которых, в принципе, должно работать.

13. Устанавливаем загрузчик grub на новые диски:

#grub-install /dev/sdb

#grub-install /dev/sdc

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

File descriptor 3 (pipe:[1458536]) leaked on lvs invocation. Parent PID 6253: /bin/sh

Это предупреждение от lvm, которая у меня в системе не используется.

14. Если возникли ошибки, например:

W: initramfs-tools configuration sets RESUME=UUID=0fc28a36-2e56-4f27-b392-7b1e2762fa2f
W: but no matching swap device is available.

надо проверить правильность указания реально существующего раздела свопа в /etc/initramfs-tools/conf.d/resume. Запускаем

$lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 465,8G 0 disk
├─sda1 8:1 0 29,8G 0 part
│ └─md0 9:0 0 29,8G 0 raid1 /
├─sda2 8:2 0 1,9G 0 part [SWAP]
└─sda3 8:3 0 434,1G 0 part
└─md1 9:1 0 434G 0 raid1 /shares
sdb 8:16 0 931,5G 0 disk
├─sdb1 8:17 0 29,8G 0 part
│ └─md0 9:0 0 29,8G 0 raid1 /
├─sdb2 8:18 0 1,9G 0 part [SWAP]
└─sdb3 8:19 0 899,9G 0 part
└─md1 9:1 0 434G 0 raid1 /shares
sr0 11:0 1 1024M 0 rom

В моём случае есть только два диска — старый /dev/sda и новый /dev/sdb. Видим своп на новом диске, например, у меня это «sdb2 8:18 0 1,9G 0 part [SWAP]«. Смотрим UUID раздела /dev/sdb2:

$ls /dev/disk/by-uuid/ -la
итого 0
drwxr-xr-x 2 root root 120 фев 17 10:04 .
drwxr-xr-x 7 root root 140 фев 17 10:04 ..
lrwxrwxrwx 1 root root 10 фев 17 21:11 1ad0b9ad-7008-4642-93cf-525fa8b79674 -> ../../sdb2
lrwxrwxrwx 1 root root 9 фев 17 10:05 28edc763-6ed7-43e5-90b5-6227bbf87ff1 -> ../../md1
lrwxrwxrwx 1 root root 9 фев 17 10:05 c11a36f6-9590-4f6a-9b49-997d37a02d12 -> ../../md0
lrwxrwxrwx 1 root root 10 фев 17 10:05 dae484cd-b8a6-41db-92c8-17cba65abda1 -> ../../sda2

Редактируем командой:

#nano /etc/initramfs-tools/conf.d/resume:

RESUME=UUID=1ad0b9ad-7008-4642-93cf-525fa8b79674

Здесь 1ad0b9ad-7008-4642-93cf-525fa8b79674 — это UUID своп раздела sdb2. Повторяем с п.12.

Чтобы не писать на листок, если работа ведётся прямо в консоли сервера, можно набрать:

#ls /dev/disk/by-uuid/ -la|grep sdb2>>/etc/initramfs-tools/conf.d/resume и тогда в файле /etc/initramfs-tools/conf.d/resume мы увидим:

RESUME=UUID=СТАРОЕ_ЗНАЧЕНИЕ
lrwxrwxrwx 1 root root 10 фев 17 21:11 1ad0b9ad-7008-4642-93cf-525fa8b79674 -> ../../sdb2

Такое содержимое файла легче и с меньшей вероятностью ошибки можно привести к требуемому. Только надо обратить внимание, что после «grep sdb2» непременно должны быть именно два значка «>», иначе старого содержимого файла не останется.

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

#update-initramfs -u

15. Перезагружаем сервер, выбираем загрузку с одного из новых дисков. Грузиться должно быстро и без ошибок. Если всё хорошо, выключаем сервер и заменяем последний старый диск на новый. Проходимся по всем пунктам ещё раз 🙂 В результате получаем сервер с заменёнными дисками большего размера и с массивом маленького старого размера не на всё пространство.

16. Просматриваем массив и изменяем размер (здесь два диска):

$mdadm —detail /dev/md1

/dev/md1:
Version : 1.2
Creation Time : Wed Feb 6 23:02:41 2019
Raid Level : raid1
Array Size : 455051264 (433.97 GiB 465.97 GB)
Used Dev Size : 455051264 (433.97 GiB 465.97 GB)
Raid Devices : 2
Total Devices : 2


Persistence : Superblock is persistent

Intent Bitmap : Internal Update Time : Tue Feb 18 13:15:41 2020 State : clean Active Devices : 2

Working Devices : 2
Failed Devices : 0
Spare Devices : 0

Consistency Policy : bitmap

Name : userb:1 (local to host userb)
UUID : 8d3f781a:7b4cf635:a202d21a:1050e474
Events : 28447

Number Major Minor RaidDevice State
3 8 19 0 active sync /dev/sdb3
2 8 1 1 active sync /dev/sda3

#mdadm —grow /dev/md1 —size=max
mdadm: component size of /dev/md1 has been set to 943428312K

#mdadm —detail /dev/md1

/dev/md1:
Version : 1.2
Creation Time : Wed Feb 6 23:02:41 2019
Raid Level : raid1
Array Size : 943428312 (899.72 GiB 966.07 GB)
Used Dev Size : 943428312 (899.72 GiB 966.07 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent

Intent Bitmap : Internal

Update Time : Tue Feb 18 13:16:13 2020
State : clean
Active Devices : 2

Working Devices : 2
Failed Devices : 0
Spare Devices : 0

Consistency Policy : bitmap

Name : userb:1 (local to host userb)
UUID : 8d3f781a:7b4cf635:a202d21a:1050e474
Events : 28450

Number Major Minor RaidDevice State
3 8 19 0 active sync /dev/sdb3
2 8 1 1 active sync /dev/sda3

Массив расширился, но файловую систему это не изменило. Это можно увидеть командой $df:

$df
Файловая система 1K-блоков Использовано Доступно Использовано% Cмонтировано в
udev 1002692 0 1002692 0% /dev
tmpfs 204024 7200 196824 4% /run
/dev/md0 30611392 5080764 23952596 18% /
tmpfs 1020116 0 1020116 0% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
tmpfs 1020116 0 1020116 0% /sys/fs/cgroup
/dev/md1 447779672 447763288 0 100% /shares
tmpfs 204020 0 204020 0% /run/user/03

17. После расширения массива начнётся ресинхронизация расширенной области, её ход можно проверить командой $watch cat /proc/mdstat и лучше дождаться окончания, прежде чем продолжать.

18. Чтобы полностью задействовать работу с увеличенным пространством, надо расширить файловую систему на весь массив. У меня сервер работает как файловое хранилище, поэтому я могу отключить хранилище на время расширения. В некоторых случаях это невозможно, например, если расширяются разделы /home, /var и т.д. В таких случаях надо перезагружаться в режим восстановления (выбирается при перезагрузке сервера в меню grub) — для /home, или загрузившись с установочного носителя и выбрав режим восстановления там — для любых разделов.

19. Нельзя просто так взять и проверить файловую систему, которая была корректно отмонтирована. Система посмотрит, что отмонтировано корректно и ничего проверять не станет, обязательно нужен ключ -f:

#e2fsck -f /dev/md1

Внимание! Если у вас файловая система, отличная от ext2|ext3|ext4, вам надо воспользоваться командами для вашей файловой системы!

e2fsck 1.44.5 (15-Dec-2018)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/shares: 1903229/28442624 files (0.6% non-contiguous), 113758720/113762816 blocks

Если информации очень много, проверка может занять продолжительное время! Ну вот, дождались, проверилось, а что некорректно — исправилось. Если были ошибки, желательно запустить ещё один раз, чтобы убедиться, что больше ошибок нет 🙂

Увеличиваем:

#resize2fs /dev/md1

Внимание! Помним про тип файловой системы и используем команду для именно вашей.

resize2fs 1.44.5 (15-Dec-2018)
Resizing the filesystem on /dev/md1 to 235857078 (4k) blocks.
The filesystem on /dev/md1 is now 235857078 (4k) blocks long.

Готово! Проверяем файловую систему ещё раз:

#e2fsck -f /dev/md1

e2fsck 1.44.5 (15-Dec-2018)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/shares: 1903229/58966016 files (0.6% non-contiguous), 115674909/235857078 blocks

Размер явно увеличился, осталось примонтировать и посмотреть командой df:

$df
Файловая система 1K-блоков Использовано Доступно Использовано% Cмонтировано в
udev 1002692 0 1002692 0% /dev
tmpfs 204024 7180 196844 4% /run
/dev/md0 30611392 5080908 23952452 18% /
tmpfs 1020116 0 1020116 0% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
tmpfs 1020116 0 1020116 0% /sys/fs/cgroup
tmpfs 204020 0 204020 0% /run/user/0
/dev/md1 928493744 447765068 480712292 49% /shares

Если сравнить со старым значением, то явно прибавилось!

20. Можно пользоваться!

No comments yet.