Программный рейд linux расширить

Обновлено: 08.07.2024

mdadm — утилита для работы с программными RAID-массивами различных уровней. В данной инструкции рассмотрим примеры ее использования.

Установка mdadm

Утилита mdadm может быть установлена одной командой.

Если используем CentOS / Red Hat:

yum install mdadm

Если используем Ubuntu / Debian:

apt-get install mdadm

Сборка RAID

Перед сборкой, стоит подготовить наши носители. Затем можно приступать к созданию рейд-массива.

Подготовка носителей

Сначала необходимо занулить суперблоки на дисках, которые мы будем использовать для построения RAID (если диски ранее использовались, их суперблоки могут содержать служебную информацию о других RAID):

mdadm --zero-superblock --force /dev/sd

* в данном примере мы зануляем суперблоки для дисков sdb и sdc.

Если мы получили ответ:

mdadm: Unrecognised md component device - /dev/sdb
mdadm: Unrecognised md component device - /dev/sdc

. то значит, что диски не использовались ранее для RAID. Просто продолжаем настройку.

Далее нужно удалить старые метаданные и подпись на дисках:

wipefs --all --force /dev/sd

Создание рейда

Для сборки избыточного массива применяем следующую команду:

mdadm --create --verbose /dev/md0 -l 1 -n 2 /dev/sd

  • /dev/md0 — устройство RAID, которое появится после сборки;
  • -l 1 — уровень RAID;
  • -n 2 — количество дисков, из которых собирается массив;
  • /dev/sd — сборка выполняется из дисков sdb и sdc.

Мы должны увидеть что-то на подобие:

Также система задаст контрольный вопрос, хотим ли мы продолжить и создать RAID — нужно ответить y:

Continue creating array? y

Мы увидим что-то на подобие:

mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

. и находим информацию о том, что у наших дисков sdb и sdc появился раздел md0, например:

.
sdb 8:16 0 2G 0 disk
??md0 9:0 0 2G 0 raid1
sdc 8:32 0 2G 0 disk
??md0 9:0 0 2G 0 raid1
.

* в примере мы видим собранный raid1 из дисков sdb и sdc.

Создание файла mdadm.conf

В файле mdadm.conf находится информация о RAID-массивах и компонентах, которые в них входят. Для его создания выполняем следующие команды:

echo "DEVICE partitions" > /etc/mdadm/mdadm.conf

DEVICE partitions
ARRAY /dev/md0 level=raid1 num-devices=2 metadata=1.2 name=proxy.dmosk.local:0 UUID=411f9848:0fae25f9:85736344:ff18e41d

* в данном примере хранится информация о массиве /dev/md0 — его уровень 1, он собирается из 2-х дисков.

Создание файловой системы и монтирование массива

Создание файловой системы для массива выполняется также, как для раздела:

* данной командой мы создаем на md0 файловую систему ext4.

Примонтировать раздел можно командой:

mount /dev/md0 /mnt

* в данном случае мы примонтировали наш массив в каталог /mnt.

Чтобы данный раздел также монтировался при загрузке системы, добавляем в fstab следующее:

/dev/md0 /mnt ext4 defaults 1 2

Для проверки правильности fstab, вводим:

Мы должны увидеть примонтированный раздел md, например:

/dev/md0 990M 2,6M 921M 1% /mnt

Информация о RAID

Посмотреть состояние всех RAID можно командой:

В ответ мы получим что-то на подобие:

md0 : active raid1 sdc[1] sdb[0]
1046528 blocks super 1.2 [2/2] [UU]

* где md0 — имя RAID устройства; raid1 sdc[1] sdb[0] — уровень избыточности и из каких дисков собран; 1046528 blocks — размер массива; [2/2] [UU] — количество юнитов, которые на данный момент используются.
** мы можем увидеть строку md0 : active(auto-read-only) — это означает, что после монтирования массива, он не использовался для записи.

Подробную информацию о конкретном массиве можно посмотреть командой:

* где /dev/md0 — имя RAID устройства.

Version : 1.2
Creation Time : Wed Mar 6 09:41:06 2019
Raid Level : raid1
Array Size : 1046528 (1022.00 MiB 1071.64 MB)
Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent

Update Time : Wed Mar 6 09:41:26 2019
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0

Consistency Policy : resync

Name : proxy.dmosk.local:0 (local to host proxy.dmosk.local)
UUID : 304ad447:a04cda4a:90457d04:d9a4e884
Events : 17

Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc

  • Version — версия метаданных.
  • Creation Time — дата в время создания массива.
  • Raid Level — уровень RAID.
  • Array Size — объем дискового пространства для RAID.
  • Used Dev Size — используемый объем для устройств. Для каждого уровня будет индивидуальный расчет: RAID1 — равен половине общего размера дисков, RAID5 — равен размеру, используемому для контроля четности.
  • Raid Devices — количество используемых устройств для RAID.
  • Total Devices — количество добавленных в RAID устройств.
  • Update Time — дата и время последнего изменения массива.
  • State — текущее состояние. clean — все в порядке.
  • Active Devices — количество работающих в массиве устройств.
  • Working Devices — количество добавленных в массив устройств в рабочем состоянии.
  • Failed Devices — количество сбойных устройств.
  • Spare Devices — количество запасных устройств.
  • Consistency Policy — политика согласованности активного массива (при неожиданном сбое). По умолчанию используется resync — полная ресинхронизация после восстановления. Также могут быть bitmap, journal, ppl.
  • Name — имя компьютера.
  • UUID — идентификатор для массива.
  • Events — количество событий обновления.
  • Chunk Size (для RAID5) — размер блока в килобайтах, который пишется на разные диски.

Подробнее про каждый параметр можно прочитать в мануале для mdadm:

Также, информацию о разделах и дисковом пространстве массива можно посмотреть командой fdisk:

Проверка целостности

Для проверки целостности вводим:

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

* если команда возвращает 0, то с массивом все в порядке.

Восстановление RAID

Рассмотрим два варианта восстановлении массива.

Замена диска

В случае выхода из строя одного из дисков массива, команда cat /proc/mdstat покажет следующее:

Personalities : [raid1]
md0 : active raid1 sdb[0]
1046528 blocks super 1.2 [2/1] [U_]

* о наличии проблемы нам говорит нижнее подчеркивание вместо U — [U_] вместо [UU].

.
Update Time : Thu Mar 7 20:20:40 2019
State : clean, degraded
.

* статус degraded говорит о проблемах с RAID.

Для восстановления, сначала удалим сбойный диск, например:

mdadm /dev/md0 --remove /dev/sdc

Теперь добавим новый:

mdadm /dev/md0 --add /dev/sde

Смотрим состояние массива:

.
Update Time : Thu Mar 7 20:57:13 2019
State : clean, degraded, recovering
.
Rebuild Status : 40% complete
.

* recovering говорит, что RAID восстанавливается; Rebuild Status — текущее состояние восстановления массива (в данном примере он восстановлен на 40%).

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

* по умолчанию скорость speed_limit_min = 1000 Кб, speed_limit_max — 200000 Кб. Для изменения скорости, можно поменять только минимальную.

Пересборка массива

Если нам нужно вернуть ранее разобранный или развалившийся массив из дисков, которые уже входили в состав RAID, вводим:

mdadm --assemble --scan

* данная команда сама найдет необходимую конфигурацию и восстановит RAID.

Также, мы можем указать, из каких дисков пересобрать массив:

mdadm --assemble /dev/md0 /dev/sdb /dev/sdc

Запасной диск (Hot Spare)

Если в массиве будет запасной диск для горячей замены, при выходе из строя одного из основных дисков, его место займет запасной.

Диском Hot Spare станет тот, который просто будет добавлен к массиву:

mdadm /dev/md0 --add /dev/sdd

Информация о массиве изменится, например:

.
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
2 8 48 1 active sync /dev/sdc

3 8 32 - spare /dev/sdd

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

mdadm /dev/md0 --fail /dev/sdb

И смотрим состояние:

.
Rebuild Status : 37% complete
.
Number Major Minor RaidDevice State
3 8 32 0 spare rebuilding /dev/sdd
2 8 48 1 active sync /dev/sdc

0 8 16 - faulty /dev/sdb
.

* как видим, начинается ребилд. На замену вышедшему из строя sdb встал hot-spare sdd.

Добавить диск к массиву

В данном примере рассмотрим вариант добавления активного диска к RAID, который будет использоваться для работы, а не в качестве запасного.

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

mdadm /dev/md0 --add /dev/sde

4 8 16 - spare /dev/sde

Теперь расширяем RAID:

mdadm -G /dev/md0 --raid-devices=3

* в данном примере подразумевается, что у нас RAID 1 и мы добавили к нему 3-й диск.

Удаление массива

При удалении массива внимателнее смотрите на имена массива и дисков и подставляйте свои значения.

Если нам нужно полностью разобрать RAID, сначала размонтируем и остановим его:

* где /mnt — каталог монтирования нашего RAID.

* где /dev/md0 — массив, который мы хотим разобрать.
* если мы получим ошибку mdadm: fail to stop array /dev/md0: Device or resource busy, с помощью команды lsof -f -- /dev/md0 смотрим процессы, которые используют раздел и останавливаем их.

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

mdadm --zero-superblock /dev/sdb

mdadm --zero-superblock /dev/sdc

mdadm --zero-superblock /dev/sdd

* где диски /dev/sdb, /dev/sdc, /dev/sdd были частью массива md0.

В этот раз я вам расскажу о том, как увеличить размер раздела который находится на software raid массиве. В качестве примера мы расширим раздел находящийся на RAID 1 массиве.

Ситуация:
Сервер с двумя дисками на которых собран программный RAID 1, было создано 3 логических диска.
md0 с точкой минирования / -10 Gb -Находится операционная система
Раздел подкачки- по 512Mb на каждом диске, итого 1Gb
md1 /home- под него выделено все оставшееся место на диске там и находятся данные файлового сервера.

Переставим задачу, у нас есть файловый сервер, на котором установлено 2 жестких диска, размером 160Gb каждый, объединенных в программный RAID 1, место в разделе перестало хватать и нам требуется установить более емкие жесткие диски, например- 2х1TB. Конечно можно засунуть новые диски и переустановить операционную систему, но это не «тру» т.к. придется многое перенести: информацию, перенастроить SAMBA, права доступа к директориям, снова настраивать резервное копирование и прочие малоинтересные, но крайне необходимые вещи, которые до этого момента отлично работали.
В общем все это нужно тихонько перенести, ничего не потеряв по дороге, иначе «капут»…
Пару лет назад я уже писал статью по установке системы на программный RAID, с которой можно ознакомиться в статье Как установить Ubuntu 10.04 на RAID 5, статья до сих пор не потеряла актуальности, рекомендую к ознакомлению, многие действия перекочевали оттуда.

Сам метод применим не только к RAID1, но и к другим массивам имеющим отказоустойчивость и выдерживающим потерю как минимум одного диска, а именно RAID5, RAID6, RAID10. Пример с RAID 1 рассматриваться как наиболее простой и доступный для понимания, алгоритм был протестирован на массивах 5,6 и 10го уровней и отлично показал себя.

Есть вариант более правильный и простой, при кажущейся «геморройности» процедуры, а именно, следите за мыслью:
1) Убрать 1 старый жесткий диск
2) Установить 1 новый жесткий диск,
3) Перенести таблицу разделов на новый жесткий диск,
4) Расширить размер раздела на новом жестком диске, за счет оставшегося свободного места.
5) Синхронизировать содержимое старого диска с новым
6) Убрать старый диск
7) Установить второй- новый жесткий диск
8) Перенести таблицу разделов на второй новый жесткий диск
9) Синхронизировать содержимое дисков.
10) Расширить раздел RAID массива, за счет присоединения свободного места
Пользоваться!
В результате такого «переезда» информация останется на одном из дисков, который будет выключен, благодаря чему можно, с довольно высокой долей вероятности, говорить что инфа не пропадет, но наличие резервных копий никто не отменял.

В качестве тестового стенда, у меня будет система, которая состоит из 2х дисков по 20Gb.
В системе создано 2 устройства md
md0-Корневая файловая система
md1-Раздел /home (его мы и будем расширять)
В систему мы установим 2 диска по 160Gb.

Итого, нам требуется выполнить 10 действий.
Заходим в систему и поднимаем права до root


Для начала определимся что у нас все в порядке с RAID массивом

Нам вывалит «портянку» о стоянии массива в целом и дисков которые включены в него:

Из которой понятно что у нас все хорошо, но это мы скоро исправим.
После этого посмотрим что у нас со сводным местом:


Из написанного видно что раздел /home, на устройстве md1 забит на 100%, я специально это сделал чтобы сделать более наглядно.

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


находим строку:
BOOT_DEGRADED и если в ней установлено:

Меняем значение на:

ну если совсем лень залезать в конфиги, то можно все сделать через dpkg:

mdadm

ну и дальше следуем указаниям системы:

mdadm

mdadm

mdadm

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

На этом с подготовкой все, переходим к практике.

1-Делай раз. Извлекаем старый жесткий диск.

Выключаем систему и извлекаем жесткий диск, он нам понадобится в качестве плана Б — если что-то пойдет не так, мы всегда сможем с него откатиться к прежней системе, но если все сделать правильно и заранее потренироваться, то все проходит гладко.
Не важно какой диск вы выдерните, система запустится со второго, и он у нас будет виден в системе в качестве устройства sda

2-Делай два. Добавляем новый диск и запускаем систему
Тут все ясно из названия пункта. Устанавливаем новый жесткий диск и включаем систему.

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


Тут мы можем понять что мы извлекли диск sdb -какая «неожиданность»…

Проверяем наличие дисков:

Если диск не определился, то перезагружаем систему и проверяем снова. Система остается работоспособной, ведь все данные имеются на втором диске.
Нам должно выдать следующее:


Нас интересует пункт:

Видно что диск большего объема определился, но не содержит никаких разделов, это нам и нужно было!

3-Делай три. Переносим таблицу разделов на новый жесткий диск.

Новый диск sdb определился, но он пуст, нам требуется создать дубликат таблицы разделов старого диска sda, давайте сделаем это:

Нам выдаст кучу всего, но нам нужно проверить что разделы создались:


Из написанного видно что на диске sdb создались разделы.

4- Делай четыре. Расширяем размер раздела на новом жестком диске, за счет оставшегося свободного места.

Вот тут мы сделаем небольшой «финт ушами» и удалим один раздел и создадим его по новой:

cfdisk

Выглядеть это будет следующим образом:

cfdisk

Удаляем раздел sdb6 и создаем его по новой:

cfdisk

В качестве типа раздела, выбираем logical:

cfdisk

В размер раздела укажем все доступное место на диске:

cfdisk

Указываем тип раздела:

cfdisk

Собственно тип раздела: Linux raid autodedect т.е. FD, нас скриншоте подчеркнуто красным:

cfdisk

Ну и самое главное, записываем изменения на диск, т.к. сами они не сохраняются, и выходим из cfdisk:
1 -запись изменений
2 -выход

5- Делай пять. Синхронизируем содержимое старого диска, с новым.

Тут тоже все просто, нам необходимо добавить разделы нового диска в md.
Для начала восстановим раздел md0-там где у нас живет операционная система.
устройстро md0 состоит у нас из разделов sdb1 и sda1 т.к. с sda1 у нас все хорошо, ведь с ним ПОКА ничего не происходило, то нам требуется добавить раздел со свежеустановленного диска, а он у нас sdb1

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

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


Видно что на устройстве md0 присутствует 2 диска, значит восстановление завершилось успешно.

Туже операцию проводим с устройством md1:

Проверяем ход восстановления:


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

Это говорит о том что массив восстановлен, а информация на дисках синхронизирована.
Все ничего, но наш новый жесткий диск не является загрузочным т.к. на нем не установлен загрузчик, и с него система стартовать не сможет.
Устанавливаем загрузчик в нашем случае grub, наш новый диск sdb

Значит загрузчик установился нормально.
Выключаем систему!
Делай -6. Удаляем второй старый жесткий диск
Делай -7. Устанавливаем второй НОВЫЙ жесткий диск

Все как и в прошлый раз система «почешет репу» и обнаружит что её ОПЯТЬ немного ополовинили, бывает же такое…
Т.к. мы загрузились уже с нового жесткого диска, он у нас единственный в системе, который содержит данные, то он у нас определился как устройство sda, чувствуете к чему я клоню?! Правильно, выполняем все действия повторно, начиная с пункта 4.

Делай 8. Переносим разделы с одного диска, на тот, который мы только что установили

Копируем таблицу разделов с диска который содержит информацию, на новый, но с небольшими изменениями:

Кому требуется проверить успешность копирования разделов, можно воспользоваться командой:

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

Делай 9. Синхронизируем содержимое обоих дисков

Тут тоже все просто, снова добавляем диск sdb в массив:

Дождемся перестроения массива md0 и добавим раздел в md1

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

Делай 10. Расширяем место в устройстве md1

Вот мы и добрались до самой «мякотки», собственно нам требуется расширить место, правда система его пока не видит но мы это сейчас исправим.
расширяем место на устройстве md1 до максимального размера:

В ответ на это система выдаст нам:

Это говорит о том что система увидела появившееся свободное пространство и начала перестроение массива. Запускаем, неоднократно, ранее использованную команду:

И периодически проверяем ход перестроения массива md1
Должно выдавать нечто похожее:

grub recovery mode

Где:
159950816-объем раздела, сравните это с тем что нам выдавало ранее…
Из этого видно что массив md1 находится в исправном состоянии, но выполняет синхронизацию.
В общем, нам нужно дождаться окончания перестроения массива и перезагрузить систему.
В меню grub выбираем recovery mode (на скриншоте подчекрнуто красным)

Немного поясню мои действия, чтобы выполнить проверку файловой системы нам необходимо от монтировать раздел md1, но на работающей системе этого сделать не получается и при запуске, массив остается в использовании и никакие действия с собой производить не позволяет. По этому, мы зайдем через режим восстановления, когда разделы точно не находятся в использовании.
В общем нам нужно гарантированно от монтировать раздел md1 иначе команда e2fsck и resize2fs завершаются ошибкой:

Если у кого-то есть решение данной проблемы, на работающей системе, пожалуйста отпишитесь т.к. я эту проблемы по другому решить не смог.


Тут мы выбираем командную строку root:

Вот тут можно вытворять системой все что вам угодно!

Для начала запускаем проверку файловой системы, на устройстве md1


получаем, то что указано на скриншоте:

после этого запустим резайз файловой системы:


Получаем:

Видно что система увидела прибавку на устройстве md1.
еще раз запустим проверку файловой системы:


наблюдаем небольшие изменения в файловой системе

После этого, перезагружаем систему и проверяем -чего мы в ней «наворотили»…
Набираем:


Видно что раздел /home на устройстве md1 увеличился теперь он занят всего на 9%, значит все наши действия завершены успешно, с чем я вас и поздравляю.

Если у вас возникнет необходимость в увеличении массива из 3х и более дисков, то тут тоже нет ничего сложного, достаточно разметить один новый диск как вам требуется, а затем копировать таблицу разделов на новые диски.
Например у вас массив состоящий из 4х дисков, тогда схема замены дисков будет иметь следующий вид, перечислю диски в порядке замены:

Допустим вы разметили диск №2 так как вам требуется, вы просто копируете разделы с него на все остальные диски, а когда приходит очередь поменять первый диск в системе, то вы просто диск №2 ставите первым, а новый диск на месте первого, ставите последним, копируете таблицу, синхронизируете содержимое разделов/восстанавливаете целостность массивов, ну а дальше-все как обычно по пункту 10.
Едиснственной проблемой данного метода, является необходимость как минимум 3х перезагрузок, а также время на восстановление целостности массивов, но согласитесь, это лучше, чем переносить данные руками…

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

К написанию данной статьи меня побудило отсутствие внятной информации на русском языке по работе с утилитой mdadm, реализующей RAID различных типов в ОС linux. В принципе, основные положения работы данной утилиты освещаются достаточно подробно. Почитать об этом можно, например, раз, два, три.

Преобразование RAID1 в RAID5

Основным посылом было преобразование RAID1, созданного при установке Ubuntu массива из двух дисков к RAID5. Начал я, как водится с гугления, и набрел на более раннюю статью на Хабре К сожалению, протестированный на виртуальных машинах, этот способ гарантировано убивал возможность загрузки с корневого раздела. С чем это связано, с более новой версией mdadm, или со спецификой тестирования (корневой раздел на массиве, требуется работа с live CD) выявить не удалось.

Версия системы



Разметка диска в моем случае была проще некуда, я смоделировал ее на тестовой виртуальной машине, выделив для дисков по 20 гигов:

Корневой раздел находится на собранных в массив устройствах /dev/sda2 /dev/sdb2 и имеет имя /dev/md0 в базовой системе. Загрузочный раздел находится на обоих дисках, /boot в отдельный диск не выделен.
В версии mdadm v3.2.5, которая устанавливается по умолчанию в Ubuntu, процедура конвертации RAID возможна в направлении 1->5, и невозможна обратно. Выполняется она командой изменения массива –grow, -G. Перед конвертацией вставьте в устройство флешку и примонтируйте ее для сохранения резервного суперблока. В случае сбоев с нее мы будем восстанавливать массив. Монтируем ее в /mnt/sdd1
mkdir /mnt/sdd1
mount /dev/sdd1 /mnt/sdd1
mdadm --grow /dev/md0 --level=5 --backup-file=/mnt/sdd1/backup1

Операция обычно проходит очень быстро и безболезненно. Тут нужно отметить, что получившийся массив типа RAID5 на двух дисках является фактически массивом RAID1, с возможностью расширения. Полноценным RAID5 он станет только при добавлении еще хотя бы одного диска.
Чрезвычайно важно то, что наш загрузочный раздел находится на этом массиве и после перезагрузки GRUB автоматически не подгрузит модули для запуска. Для этого мы делаем обновление загрузчика
update-grub

Если же вы все-таки забыли сделать обновление, и после перезагрузки получили

то не отчаивайтесь, вам достаточно загрузится с LiveCD, скопировать на флешку каталог /boot, перегрузиться снова с основного раздела в grub rescue> и подгрузить модуль RAID5 c флешки согласно распространенным инструкциям, например так.
Добавляете строчку insmod /boot/grub/raid5rec.mod
После загрузки с основного раздела не забываем сделать update-grub

Расширение массива RAID5

  1. Клонируем структуру существующего диска
    sfdisk –d /dev/sda | sfdisk /dev/sdc
  2. Добавляем диск к массиву
    mdadm /dev/md0 --add /dev/sdc2
  3. Расширяем массив
    mdadm --grow /dev/md0 --raid-device=3 --backup-file=/mnt/sdd1/backup2
  4. Ждем окончания переконфигурации и наблюдаем за процессом
    watch cat /proc/mdstat
  5. Устанавливаем загрузочный сектор на новый диск
    grub-install /dev/sdc
  6. Обновляем загрузчик
    update-grub
  7. Расширяем свободное место до максимального, работает на живом и смонтированном разделе.
    resize2fs /dev/md0
  8. Смотрим на получившийся массив
    mdadm --detail /dev/md0
  9. Смотрим на свободное место
    df -h

Изменение Chunk Size существующего массива RAID5

В массиве RAID1 понятие Chunk Size отсутствует, т.к. это размер блока, который по очереди пишется на разные диски. При конвертации типа массива к RAID5 этот параметр появляется в выводе детализированной информации о массиве:


При этом размер chunk выбирается согласно правилу: Наибольший общий делитель размера массива (в нашем случае 20967352К) и максимального автоматически выставляемого размера chunk(который составляет 64К). В моем случае максимально возможный размер chunk составляет 8K (20967352/8=2620919 дальше на 2 не делится).

Если вы в дальнейшем планируете добавлять диски, увеличивая размер массива, то вам желательно в определенный момент сменить размер chunk. Про производительность можно почитать достаточно интересную статью.
Для изменения параметра chunk в массиве необходимо привести его размер в соответствие с мультипликатором. Перед этим важно изменить размер раздела, т.к. если вы будете резать по живому максимальному разделу, то скорее всего затрете суперблок раздела, и гарантированно испортите файловую систему.

Как вычислить необходимый размер раздела для нужного вам размера chunk? Берем максимальный текущий размер раздела в килобайтах
mdadm --detail /dev/md0 | grep Array
Делим нацело на требуемый нам размер chunk и на (количество дисков в массиве-1, для RAID5). Полученное число снова умножаем на размер chunk и на (количество дисков в массиве -1), и итогом будет нужный нам размер раздела.
(41934704/256)/2=81903; 81903*256*2=41934336

  1. Проверяем запущенные массивы
    Cat /proc/mdstat
    Обнаруживаем, что наш массив в режиме RO
  2. Пересобираем его в обычном режиме
    Mdadm --stop /dev/md127
    Mdadm --assemble --scan
  3. Выполняем проверку массива на ошибки с автоисправлением
    e2fsck -f /dev/md127
  4. Меняем размер активного раздела, указывая в качестве параметра -S 256, чтобы утилита понимала, что данный раздел будет находится на RAID-массиве и добавляя в конец нового размера массива буковку K, чтобы утилита не посчитала данное число — числом блоков
    resize2fs -p S 256 /dev/md127 41934336K
  5. Для изменения размеров массива используем снова параметр --grow в утилите mdadm. Нужно учитывать, изменение массива происходит на каждом диске, а потому в параметрах указываем не общий требуемый размер массива, а размер массива на каждом диске, соответственно делить нужно на (количество дисков в массиве -1). Операция проходит мгновенно
    41934336/2=20967168
    mdadm --grow /dev/md127 --size=20967168
  6. Перезагружаемся в обычный режим, изменяем размер chunk, не забывая предварительно смонтировать флешку для бэкапа суперблока, и ждем окончания пересинхронизации массива.
    mdadm --grow /dev/md0 --chunk=256 --backup-file=/mnt/sdd1/backup3
    watch cat /proc/mdstat

Восстановление массива

Если на каком-то этапе работы с массивом через mdadm у вас произошел сбой, то для восстановления массива из бэкапа (вы же не забыли указать файл для бэкапа?) вам необходимо загрузится с liveCD и пересобрать массив заново с указанием правильной последовательности дисков, входящих в массив и указанием суперблока для загрузки
mdadm --assemble /dev/md0 /dev/sda2 /dev/sdb2 /dev/sdc2 --backup-file=/mnt/sdd1/backup3
В моем случае последняя операция по изменению chunk массива перевела его в состояние *reshape, однако сам процесс пересборки не начинался длительное время. Пришлось перезагружаться с liveCD и восстанавливать массив. После этого пошел процесс пересборки массива, и по окончанию оного размер Chunk Size был уже новый, 256K.

Заключение

Надеюсь, данная статья поможет вам безболезненно менять ваши домашние системы хранения, и возможно кого-то натолкнет на мысль, что утилита mdadm не такая непонятная, как кажется.

Как расширить существующий программный RAID 6 (добавление дополнительных дисков), созданный с помощью mdadm из дисковых multipath-устройств в CentOS

В этой статье мы произведём расширение ранее созданного программного RAID 6 /dev/md0, в котором на текущий момент участвует 10 дисков. Мы добавим 2 дополнительных диска, которые также будут представлены в системе как multipath-устройства

Обновление информации о дисках

Итак, предполагаем, что 2 новых диска уже презентованы нашему файловому серверу на уровне SAN, и каждый из дисков доступен по двум путям (multipath).

Получим список каналов подключений (scsi_host):

Проверим список устройств, доступных системе:

Если добавленные диски не отображается, то попробуем обновить информацию соответствующих каналов:

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

Как видно, в моём примере в систему добавлено 2 диска (Lun11 и Lun12), каждый из которых доступен по двум путям (scsi2 и scsi3) Если после последней команды добавленные диски всё же не появились, то можно попробовать перезагрузить сервер.

Теперь посмотрим, что нам покажет служба multipathd:

В выводе команды мы должны увидеть наши 2 добавленных multupath-диска (вывод команды сокращён) :

В нашем примере:

multupath-диск mpathv собран из устройств scsi2\Lun11 и scsi3\Lun11 multupath-диск mpathu собран из устройств scsi2\Lun12 и scsi3\Lun12

Посмотрим список устройств /dev/dm*. Эти устройства мы будем использовать для расширения нашего RAID-массива (вывод команды сокращён):

Добавление SPARE-дисков в RAID-массив

Посмотрим состояние нашего программного RAID-массива и увидим то, какие /dev/dm* устройства уже включены в него:

Добавляем в RAID-массив /dev/md0 первое multupath-устройство dm-10 (mpathu)

Добавляем в RAID-массив /dev/md0 второе multupath-устройство dm-11 (mpathv)

Устройства будут добавлены как spare-диски. В нашем примере эти диски имеют номера 10 и 11 внутри массива md0:

Как видим автоматически запущена процедура проверки состояния (State : …, checking ) Следим за статусом окончания процедуры командой (процесс может занять длительное время):

Расширение RAID-массива

Когда процедура проверки массива будет окончена, можно приступать к преобразованию spare-дисков в активные диски RAID-массива. С учётом добавленных дисков в массиве будет 12 дисков, поэтому используем команду:

Команда может выполниться, а может вызвать ошибку типа

Тогда можно просто попробовать выполнить команду повторно.

После этого можно следить за преобразованием RAID-массива (процесс может занять длительное время)

Когда процесс перестроения массива закончен, снова посмотрим его свойства:

Как видим, размер нашего RAID-массива увеличен на объём добавленных дисков.

Читайте также: