Pull to refresh

Работа с утилитой mdadm. Изменение типа массива, chunk size, расширение

Reading time 5 min
Views 70K

Введение


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

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


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

Версия системы
root@u1:/home/alf# uname -a
Linux u1 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux


Разметка диска в моем случае была проще некуда, я смоделировал ее на тестовой виртуальной машине, выделив для дисков по 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

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

то не отчаивайтесь, вам достаточно загрузится с 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 этот параметр появляется в выводе детализированной информации о массиве:
Mdadm –detail /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Tue Oct 29 03:57:36 2013
     Raid Level : raid5
     Array Size : 20967352 (20.00 GiB 21.47 GB)
  Used Dev Size : 20967352 (20.00 GiB 21.47 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Tue Oct 29 04:35:16 2013
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 8K

           Name : u1:0  (local to host u1)
           UUID : cec71fb8:3c944fe9:3fb795f9:0c5077b1
         Events : 20

    Number   Major   Minor   RaidDevice State
       0       8        2        0      active sync   /dev/sda2
       1       8       18        1      active sync   /dev/sdb2


При этом размер 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

Изменить размер раздела в сторону уменьшения невозможно на рабочем, смонтированном разделе, и, поскольку он у нас корневой, мы перезагружаемся с любого LiveCD (мне нравится RescueCD, у него mdadm загружается автоматически)
  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 не такая непонятная, как кажется.

Дополнительно почитать


www.spinics.net/lists/raid/msg36182.html
www.spinics.net/lists/raid/msg40452.html
enotty.pipebreaker.pl/2010/01/30/zmiana-parametrow-md-raid-w-obrazkach
serverhorror.wordpress.com/2011/01/27/migrating-raid-levels-in-linux-with-mdadm
lists.debian.org/debian-kernel/2012/09/msg00490.html
www.linux.org.ru/forum/admin/9549160
Для особых гурманов fossies.org/dox/mdadm-3.3/Grow_8c_source.html
Tags:
Hubs:
+11
Comments 20
Comments Comments 20

Articles