Для управления программными RAID массивами в Linux используется утилита mdadm. Для того чтобы установить её в Ubuntu или Debian выполните такую команду:
sudo apt install mdadm
Посмотреть список дисков, подключённых к системе можно с помощью команды lsblk:
lsblk
Мы объединим три диска в RAID на примере дисков /dev/sda, /dev/sdb и /dev/sdc. Сначала необходимо определиться стоит ли размещать RAID непосредственно на диски или на разделы. Лучше выбрать разделы, так как это дает больше гибкости и безопасности. Во первых, операционная система может перезаписать суперблок RAID если он размещён прямо на диске. Во вторых, если вы выделяете весь диск под RAID, то у вас могут возникнуть проблемы при замене диска. Диски одинакового объема, обычно, немного отличаются у разных производителей. Поэтому для замены вам придется искать точно такой же диск с точно таким же реальным объемом. Если же у вас будет раздел, вы просто сможете создать раздел нужного объема.
Сначала нужно создать таблицу разделов на всех выбранных дисках:
sudo parted /dev/sda mklabel msdos
sudo parted /dev/sdb mklabel msdos
sudo parted /dev/sdc mklabel msdos
Если диски большого размера, старые материнские платы могут не распознать раздел более 2Тб. В таком случае размечаем диск в GPT:
sudo parted /dev/sda mklabel gpt
sudo parted /dev/sdb mklabel gpt
sudo parted /dev/sdc mklabel gpt
Если на диске уже существует таблица разделов программа предупредит о том, что создание новой сотрёт все данные с диска.
После создания таблицы разделов следует создать по разделу на каждом диске. Например, создадим разделы размером 460 гигабайт. Для этого можно воспользоваться той же командой parted:
sudo parted /dev/sda mkpart primary ext4 2048 460Gb
sudo parted /dev/sdb mkpart primary ext4 2048 460Gb
sudo parted /dev/sdc mkpart primary ext4 2048 460Gb
Если хотите создать раздел на весь объёи диска, команда будет выглядеть так:
sudo parted /dev/sda mkpart primary ext4 0% 100%
sudo parted /dev/sdb mkpart primary ext4 0% 100%
sudo parted /dev/sdc mkpart primary ext4 0% 100%
Процентами можно также определять размер разделов на дисках, если вы хотите создать несколько. Однако учитывайте то, что на каждом диске эти разделы должны быть одинакового размера.
Теперь диски готовы к размещению на них RAID:
Для создания RAID массива надо выполнить команду mdadm с опцией --create, указать режим работы массива, количество дисков и сами диски. Синтаксис команды такой:
$ sudo mdadm --create /dev/имя_массива --level=режим_работы --raid-devices=количество_устройств список устройств
Например:
sudo mdadm --create /dev/md0 --level=0 --raid-devices=3 /dev/sda1 /dev/sdb1 /dev/sdc1
После выполнения этой команды вы увидите раздел raid в lsblk. С этим разделом можно работать как с любым обычным разделом в вашей системе.
Давайте для примера отформатируем полученный раздел в файловую систему Ext4, смонтируем и попробуем записывать туда файлы:
sudo mkfs -t ext4 /dev/md0
sudo mount /dev/md0 /mnt
Затем можно тестировать скорость с помощью dd:
sudo dd if=/dev/zero of=/mnt/file bs=1G count=5
Детальную информацию о массиве /dev/md0 можно с помощью самой утилиты mdadm:
sudo mdadm --detail /dev/md0
Здесь в том числе отображается состояние RAID Linux. Посмотреть детальную информацию о каждом устройстве, которое входит в RAID можно с помощью опции --examine:
sudo mdadm --examine /dev/sda1 /dev/sdb1 /dev/sdc1
В принципе, уже сейчас RAID массив работает и продолжит работать после перезагрузки, потому что mdadm просканирует все диски, найдёт метаданные массива и построит его. Но неизвестно какое имя программа присвоит полученному массиву и неизвестно все ли параметры будут восстановлены верно. Поэтому конфигурацию массива лучше сохранить. Для этого используйте такую команду:
sudo mdadm --detail --scan --verbose | sudo tee -a /etc/mdadm/mdadm.conf
Затем нужно пересоздать initramfs с поддержкой этого массива:
sudo update-initramfs -u
С полученным массивом можно обращаться как с обычным разделом диска. Например, для того чтобы автоматически монтировать его в систему добавьте такую строчку в /etc/fstab:
sudo vi /etc/fstab
/dev/md0 /mnt/ ext4 defaults 0 0
На этом создание raid массива linux завершено.
Если вы не выполните предыдущий пункт и перезагрузите компьютер, то можете получить RAID массив с именем md127 вместо md0, такое имя также может быть присвоено второму RAID массиву. Для того чтобы переименовать массив, его придется пересобрать. Для этого сначала остановите существующий массив:
sudo mdadm --stop /dev/md127
Затем выполните команду переименования. Синтаксис у неё такой:
$ sudo mdadm --assemble --update=name --name=номер /dev/md_номер список устройств
Например:
sudo mdadm --assemble --update=name --name=0 /dev/md0 /dev/sda1 /dev/sdb1 /dev/sdc1
После этого следует повторить предыдущий шаг для уже правильного сохранения RAID устройства.
Если вы не хотите чтобы ваши диски и дальше были объединены в RAID, его можно удалить. Для этого выполните такую команду:
sudo mdadm --remove /dev/md0
Она удалит все метаданные с дисков /dev/md0. Дальше останется только удалить или закомментировать секцию данного RAID массива в /etc/mdadm/mdadm.conf
sudo vi /etc/mdadm/mdadm.conf
Теперь вы знаете как создать raid linux на примере RAID 0. Давайте ещё разберемся с RAID 1. Для создания RAID 1 используется такая же команда как и для RAID 0, но указывается другой уровень работы массива:
sudo mdadm --create /dev/md0 --level=1 --raid-devices=3 /dev/sda1 /dev/sdb1 /dev/sdc1
Затем вы можете убедится что RAID создан посмотрев информацию о нём:
sudo mdadm --detail /dev/md0
Ну и с помощью lsblk можно оценить размер устройства:
lsblk
Как и ожидалось, размер не увеличился, поскольку копии данных будут записываться на все три диска.
Основная информация была взята отсюда.
Прежде всего обязательно сделайте копию своих данных на сторонний носитель. Этим лишите себя многих проблем при ошибочных действиях.
До замены диска установить загрузчик на второй диск (если он не был изначально установлен, у меня второй диск sdb, у вас может быть другое обозначение)
grub-install /dev/sdb
или
grub2-install /dev/sdb
Проверить /etc/initramfs-tools/conf.d/mdadm, нужно что бы стояло BOOT_DEGRADED=true
Дальше замена диска:
Проверяем наличие диска
cat /proc/scsi/scsi
Выполняем
fdisk -l
и получаем что-то типа
Disk /dev/sda doesn’t contain a valid partition table
Переносим структуру партиций между дисками
sfdisk -d /dev/sda | sfdisk --force /dev/sdb
--force нужен иначе будет ругаться на то что новый диск не размечен
Проверяем
fdisk -l /dev/sda
fdisk -l /dev/sdb
разделы должны быть одинаковые
Добавляем новый диск в рейд
mdadm —manage /dev/md0 —add /dev/sda1
mdadm —manage /dev/md1 —add /dev/sda6
mdadm —manage /dev/md2 —add /dev/sda5
Проверяем как синхронизируются диски
cat /proc/mdstat
Вывод примерно такой:
md2: active raid1 sdb5[2] sda5[3]
11716536 blocks super 1.2 [2/2] [UU]
md1: active raid1 sdb6[2] sda6[3]
[>………………..] recovery = 0.1% (97408/71585536) finish=73.3min speed=76234K/sec
md0: active raid1 sda1[3] sdb1[2]
9763840 blocks super 1.2 [2/2] [UU]
Через время (примерно), указанное в finish синхронизация данных будет окончена.
Чтобы следить в реальном времени:
watch --interval=1 cat /proc/mdstat
После делаем
grub-install /dev/sda
и
update-grub
mdadm inactive md0
Пример для массива md0, с одним диском (у меня такая ситуация когда вывалился второй диск из системы, не определялся, поэтому добавлял один) у вас может быть другое обозначение md1, md2 и т.п.
Получаем информацию что там у нас с массивом вообще:
Смотрим статус массива:
cat /proc/mdstat
В выводе получаем что
mdadm inactive md0
Получаем информацию о массиве:
mdadm --examine -v /dev/md0
mdadm --detail -v /dev/md0
Тут берем раздел диска, который входит в массив, он будет указан в предыдущем выводе (у меня sda2):
mdadm --examine -v /dev/sda2
Пробуем сканировать все разделы которые входят в массив и запустить массив с найденными разделами
mdadm --assemble --scan
Проверяем статус массива и его детали:
cat /proc/mdstat
mdadm --detail /dev/md0
Останавливаем массив и добавляем в него наш раздел (ы):
mdadm --stop /dev/md2
mdadm -A --force /dev/md2
Перезагружаемся и если всё сделано правильно, массив будет работать штатно.
Если не работает, проверяйте заполнение
/etc/fstab
и/etc/mdadm/mdadm.conf
Добавить текущую конфигурацию в mdadm.conf можно командой
mdadm --examine --scan >> /etc/mdadm/mdadm.conf
(после добавлениря проверяем файл чтобы не было задвоения строки, команда добавить в конец файла правильную строку, такую же, но выше нужно удалить или закомментировать.
Командой lsblk
смотрим структуру разделов
Как можно увидеть, в нашем случае на двух физических жестких дисках sda и sdb расположены два программных массива raid1: md0 с корневой файловой системой и md1 с разделом подкачки объемом 16,8 ГБ и 3,2 ГБ соответственно.
Следующим шагом нам нужно посмотреть разметку на физических дисках, это можно сделать при помощи утилиты fdisk, но лучше использовать ее аналог с псевдографическим интерфейсом - cfdisk. Запустим ее с указанием интересующего нас диска:
cfdisk /dev/sda
Здесь мы видим, что диск имеет таблицу разделов MBR (Label: dos в шапке) и содержит первичный раздел sda1 объемом 16,8 ГБ типа fd Linux RAID, а также логический раздел sda2, в котором находится еще один раздел типа fd Linux RAID размером 3,2 ГБ - sda5.
Запомним эти данные, так как аналогичную по структуре разметку нам нужно будет воспроизвести на новом жестком диске. Для этого нам нужно заменить один из старых дисков массива на новый, так как загрузились мы с первого физического диска, т.е. sda, то заменить нам следует sdb. Поэтому пометим его как сбойный для каждого из расположенных на нем массивов:
mdadm -f /dev/md0 /dev/sdb1
mdadm -f /dev/md1 /dev/sdb5
Теперь можно выключить сервер и физически заменить старый жесткий диск на новый. После этого загрузимся и выполним команду:
fdisk -l
Как видим в системе появился новый неразмеченный диск sdb объемом 30 ГБ. Теперь следует разметить его:
cfdisk /dev/sdb
Первым шагом указываем тип таблицы разделов, так как у нас уже используется MBR, то выбираем dos.
Теперь нам нужно создать аналогичную по структуре sda разметку, но с новыми размерами разделов. Единственное условие - они не должны быть меньше уже имеющихся. В нашем случае мы создадим первичный раздел объемом 26 ГБ и укажем для него тип Linux raid autodetect (fd) используя для этого кнопку Type утилиты.
Затем запишем изменения кнопкой Write. На оставшемся месте создадим расширенный раздел (extended) и внутри его еще один раздел Linux raid autodetect (fd). В итоге у вас должна получиться разметка аналогичная по структуре sda, но с новыми размерами разделов.
Теперь добавим вновь созданные разделы в массивы:
mdadm --add /dev/md0 /dev/sdb1
mdadm --add /dev/md1 /dev/sdb5
После чего убедимся, что начался процесс ресинхронизации:
cat /proc/mdstat
И обязательно дождемся ее окончания. Система в это время будет доступной, но может испытывать проблемы с производительностью из-за повышенной нагрузки на дисковую подсистему, поэтому желательно запланировать данный процесс на нерабочее время. После успешной ресинхронизации вывод команды будет выглядеть следующим образом:
Вроде бы все хорошо, но не забываем про загрузчик, на новом диске его нет. Поэтому выполним:
dpkg-reconfigure grub-pc
Принимаем значения по умолчанию пока не появится окно с выбором дисков, указываем установку загрузчика на все физические диски, выбирать RAID-массив не надо.
Перезагружаем систему, выбрав в BIOS в качестве загрузочного устройства новый жесткий диск. Если все было сделано правильно, то вы загрузитесь уже с нового жесткого диска. Теперь нужно пометить sda как сбойный и исключить его из массива:
mdadm -f /dev/md0 /dev/sda1
mdadm -f /dev/md1 /dev/sda5
Выключаем сервер, физически заменяем диск на новый, загружаемся. Проверяем дисковую конфигурацию:
Как видим, теперь у нас в системе появился новый неразмеченный диск sda, но так как нам уже не нужно создавать разделы с отличным от sdb размером, то просто скопируем разметку с одного диска на второй, для этого используем еще одну утилиту sfdisk:
sfdisk -d /dev/sdb | sfdisk /dev/sda
При выполнении данной операции важно не перепутать диски местами, иначе вы скопируете разметку с пустого диска на диск с данными, что приведет к их утере. Первым следует указать диск источник, вторым - целевой диск. Плюс данной операции - вместе с разметкой скопируется также загрузчик.
Снова добавим разделы в массив:
mdadm --add /dev/md0 /dev/sda1
mdadm --add /dev/md1 /dev/sda5
Дождемся окончания ресинхронизации:
Перезагрузимся несколько раз и убедимся, что загрузка возможна с обоих физических дисков. Теперь снова выполним команду:
lsblk
и внимательно изучим вывод:
Несмотря на то, что мы увеличили размер sda1/sdb1 и sda5/sdb5 размеры массивов md0 и md1 остались неизменными. Но если мы вспомним, что программный RAID в Linux строится поверх разделов, то все станет на свои места. Это аналогично тому, что если бы мы заменили жесткий диск в системе на более емкий, но перенесли раздел без изменения размера.
Что делать? Расширить объем массива, для этого выполните команды:
mdadm --grow /dev/md0 --size=max
mdadm --grow /dev/md1 --size=max
Что у нас получилось?
Вроде бы все хорошо. Но если для раздела подкачки этого достаточно, то с разделами, содержащими файловую систему не все так просто. В этом можно убедиться, выполнив:
df -h
Из ее вывода видно, что размер файловой системы не изменился и нам по-прежнему доступно около 17 ГБ. Но здесь нет никакой ошибки, если мы вспомним, что программный RAID является для системы аналогом диска, который содержит раздел с файловой системы, то поймем, что несмотря на то, что мы увеличили размер диска, нам следует также увеличить размер раздела с данными. Для этого выполним:
resize2fs /dev/md0
Вот теперь можно считать процесс расширения массива законченным, мы расширили все необходимые разделы и теперь можем использовать все доступное пространство новых дисков. Сам процесс может показаться несколько сложным, но если представить всю эту систему как матрешку, когда одни разделы вкладываются в другие - то все станет на свои места и система вновь станет стройной и логичной.
Информация по расширению взята тут