Введение
К написанию данной статьи меня побудило отсутствие внятной информации на русском языке по работе с утилитой 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
Расширения измененного массива описано во всех источниках и проблем не представляет. Питание не выключаем.
- Клонируем структуру существующего диска
sfdisk –d /dev/sda | sfdisk /dev/sdc
- Добавляем диск к массиву
mdadm /dev/md0 --add /dev/sdc2
- Расширяем массив
mdadm --grow /dev/md0 --raid-device=3 --backup-file=/mnt/sdd1/backup2
- Ждем окончания переконфигурации и наблюдаем за процессом
watch cat /proc/mdstat
- Устанавливаем загрузочный сектор на новый диск
grub-install /dev/sdc
- Обновляем загрузчик
update-grub
- Расширяем свободное место до максимального, работает на живом и смонтированном разделе.
resize2fs /dev/md0
- Смотрим на получившийся массив
mdadm --detail /dev/md0
- Смотрим на свободное место
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 загружается автоматически)
- Проверяем запущенные массивы
Cat /proc/mdstat
Обнаруживаем, что наш массив в режиме RO
- Пересобираем его в обычном режиме
Mdadm --stop /dev/md127
Mdadm --assemble --scan
- Выполняем проверку массива на ошибки с автоисправлением
e2fsck -f /dev/md127
- Меняем размер активного раздела, указывая в качестве параметра -S 256, чтобы утилита понимала, что данный раздел будет находится на RAID-массиве и добавляя в конец нового размера массива буковку K, чтобы утилита не посчитала данное число — числом блоков
resize2fs -p S 256 /dev/md127 41934336K
- Для изменения размеров массива используем снова параметр —grow в утилите mdadm. Нужно учитывать, изменение массива происходит на каждом диске, а потому в параметрах указываем не общий требуемый размер массива, а размер массива на каждом диске, соответственно делить нужно на (количество дисков в массиве -1). Операция проходит мгновенно
41934336/2=20967168
mdadm --grow /dev/md127 --size=20967168
- Перезагружаемся в обычный режим, изменяем размер 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
ссылка на оригинал статьи http://habrahabr.ru/post/200194/
Добавить комментарий