- PVSM.RU - https://www.pvsm.ru -
К написанию данной статьи меня побудило отсутствие внятной информации на русском языке по работе с утилитой mdadm, реализующей RAID различных типов в ОС linux. В принципе, основные положения работы данной утилиты освещаются достаточно подробно. Почитать об этом можно, например, раз [1], два [2], три [3].
Основным посылом было преобразование RAID1, созданного при установке Ubuntu массива из двух дисков к RAID5. Начал я, как водится с гугления, и набрел на более раннюю статью на Хабре [4] К сожалению, протестированный на виртуальных машинах, этот способ гарантировано убивал возможность загрузки с корневого раздела. С чем это связано, с более новой версией 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 флешки согласно распространенным инструкциям, например так [5].
Добавляете строчку insmod /boot/grub/raid5rec.mod
После загрузки с основного раздела не забываем сделать update-grub
Расширения измененного массива описано во всех источниках и проблем не представляет. Питание не выключаем.
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
В массиве 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. Про производительность можно почитать достаточно интересную статью [6].
Для изменения параметра chunk в массиве необходимо привести его размер в соответствие с мультипликатором. Перед этим важно изменить размер раздела, т.к. если вы будете резать по живому максимальному разделу, то скорее всего затрете суперблок раздела, и гарантированно испортите файловую систему.
Как вычислить необходимый размер раздела для нужного вам размера chunk? Берем максимальный текущий размер раздела в килобайтах
mdadm --detail /dev/md0 | grep Array
Делим нацело на требуемый нам размер chunk и на (количество дисков в массиве-1, для RAID5). Полученное число снова умножаем на размер chunk и на (количество дисков в массиве -1), и итогом будет нужный нам размер раздела.
(41934704/256)/2=81903; 81903*256*2=41934336
Изменить размер раздела в сторону уменьшения невозможно на рабочем, смонтированном разделе, и, поскольку он у нас корневой, мы перезагружаемся с любого LiveCD (мне нравится RescueCD [7], у него mdadm загружается автоматически)
Cat /proc/mdstat
Mdadm --stop /dev/md127
Mdadm --assemble --scan
e2fsck -f /dev/md127
resize2fs -p S 256 /dev/md127 41934336K
41934336/2=20967168
mdadm --grow /dev/md127 --size=20967168
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 [8]
www.spinics.net/lists/raid/msg40452.html [9]
enotty.pipebreaker.pl/2010/01/30/zmiana-parametrow-md-raid-w-obrazkach/ [10]
serverhorror.wordpress.com/2011/01/27/migrating-raid-levels-in-linux-with-mdadm/ [11]
lists.debian.org/debian-kernel/2012/09/msg00490.html [12]
www.linux.org.ru/forum/admin/9549160 [13]
Для особых гурманов fossies.org/dox/mdadm-3.3/Grow_8c_source.html [14]
Автор: dmbarsukov
Источник [15]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/news/47053
Ссылки в тексте:
[1] раз: http://xgu.ru/wiki/%CF%F0%EE%E3%F0%E0%EC%EC%ED%FB%E9_RAID_%E2_Linux
[2] два: http://ru.wikipedia.org/wiki/Mdadm
[3] три: http://wiki.dieg.info/mdadm
[4] статью на Хабре: http://habrahabr.ru/post/100952/
[5] так: http://adw0rd.com/2010/4/5/grub-rescue/#.Um-b8PnIbpY
[6] статью: https://romanrm.net/mdadm-raid
[7] RescueCD: http://citylan.dl.sourceforge.net/project/systemrescuecd/sysresccd-x86/3.8.0/systemrescuecd-x86-3.8.0.iso
[8] www.spinics.net/lists/raid/msg36182.html: http://www.spinics.net/lists/raid/msg36182.html
[9] www.spinics.net/lists/raid/msg40452.html: http://www.spinics.net/lists/raid/msg40452.html
[10] enotty.pipebreaker.pl/2010/01/30/zmiana-parametrow-md-raid-w-obrazkach/: http://enotty.pipebreaker.pl/2010/01/30/zmiana-parametrow-md-raid-w-obrazkach/
[11] serverhorror.wordpress.com/2011/01/27/migrating-raid-levels-in-linux-with-mdadm/: http://serverhorror.wordpress.com/2011/01/27/migrating-raid-levels-in-linux-with-mdadm/
[12] lists.debian.org/debian-kernel/2012/09/msg00490.html: http://lists.debian.org/debian-kernel/2012/09/msg00490.html
[13] www.linux.org.ru/forum/admin/9549160: http://www.linux.org.ru/forum/admin/9549160
[14] fossies.org/dox/mdadm-3.3/Grow_8c_source.html: http://fossies.org/dox/mdadm-3.3/Grow_8c_source.html
[15] Источник: http://habrahabr.ru/post/200194/
Нажмите здесь для печати.