среда, 30 октября 2013 г.

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

Введение




К написанию данной статьи меня побудило отсутствие внятной информации на русском языке по работе с утилитой 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

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends:



Комментариев нет:

Отправить комментарий