Данный пост предназначен для тех, кто совсем не разбирается в md и lvm. В нем будет дано краткое описание данных понятий и инструкция по базовой настройке.
Краткое описание инструментов
Описание mdadm
Начнем с информации о mdadm из википедии:
“mdadm — утилита для управления программными RAID массивами в Linux (Linux Software Raid), ранее известная, как mdctl. MD — сокращение от Multiple Devices.
Изначально была создана просто для объединения физических дисков в один логический.
На данный момент в Linux можно использовать следующие разновидности RAID:
LINEAR (JBOD) — расширение размера логического диска за счет нескольких физических дисков;
RAID0 (striping) — распределение блоков на нескольких физических дисках для повышения скоростей записи и чтения, но без обеспечения отказоустойчивости;
RAID1 (mirroring) — зеркалирование, т.е. запись одних и тех же данных одновременно на несколько дисков, что обеспечивает отказоустойчивость при выходе из строя любого количества дисков, пока остаётся хотябы один работоспособный;
RAID4 — RAID 4 похож на RAID 3, но отличается от него тем, что данные разбиваются на блоки, а не на байты;
RAID5 — массив с обеспечением отказоустойчивости за счет минимальной избыточности (требуется минимум три диска);
RAID6 — похож на RAID 5, но имеет более высокую степень надежности — под контрольные суммы выделяется емкость 2-х дисков, рассчитываются 2 суммы по разным алгоритмам;
MULTIPATH — не RAID-массив, позволяющий создавать разные псевдо-дисковые устройства для одного физического диска;
FAULTY — псевдо RAID-массив.
Не все разновидности RAID-массивов доступны в ядре Linux в начальной конфигурации. Например, чтобы использовать RAID5 необходимо внести изменения в конфигурацию ядра и скомпилировать его заново. Для уже скомпилированных ядер из дистрибутивов, возможно потребуется явная загрузка соответствующего модуля. Пример: modprobe raid5.”
Также там написано: “Загрузка с тома md возмжожна, в отличие от загрузки с тома LVM”. На самом деле эта информация уже устарела, и GRUB2 позволяет загружаться с тома LVM, что мы и увидим дальше.
Описание LVM
Из википедии: “Менеджер логических томов (англ. Logical Volume Manager) — менеджер логических томов операционных систем Linux и OS/2. LVM — это метод распределения пространства жёсткого диска по логическим томам, размер которых можно легко менять, в отличие от разделов.
LVM увеличивает гибкость файловой системы, однако, являясь просто промежуточным слоем, не отменяет ограничения и использование других слоёв и усложняет работу. То есть, по-прежнему нужно создавать и изменять разделы, форматировать их; изменение размера должно поддерживаться также и самой файловой системой (так, для JFS и XFS невозможно уменьшить раздел).
Физический том (англ. physical volume) — устройство, представляющееся системе как один диск (жесткий диск или его раздел, RAID-массив).
Группа томов (англ. volume group) — набор физических томов объединенныъ в один объект.
Логический том (англ. logical volume) — аналогичен разделу (hda1, sdb3, etc) на не-LVM системах. Так же, как и на них, представляется как блочное устройство и может нести файловую систему.
Физический диапазон (англ. physical extent) — диапазоны (обычно несколько мегабайт) физического диска, подобные кластерам.
Логический диапазон (англ. logical extent) — диапазоны, на которые разбивается логический том. Объём логических экстентов одинаков по всей группе томов.”
Cравнение чистого md, lvm и md+lvm
Пару слов по поводу используемой конфигурации, и почему имеет смысл совместное использование MD + LVM, именно такая конфигурация будет описываться далее. Конфигурация совместного использования md + lvm является весьма популярной, несмотря на то что RAID 10 можно реализовать используя любой из них по отдельности. В частности использование такой конфигурации привносит следующие приемущества:
- RAID 1 созданный с помощью MD является более надежным при сбоях связанных с отключением питания
- LVM2 имеет ряд интересных возможностей, таких как снэпшоты, возможность увеличиения и уменьшения томов, отката на предыдущие конфигурации
Более подробную информацию можно найти в интернете (например: http://serverfault.com/questions/126851/linux-lvm-mirror-vs-md-mirror или http://www.joshbryan.com/blog/2008/01/02/lvm2-mirrors-vs-md-raid-1/).
Практическая реализация
Постановка задачи: Создать RAID 1 с помощю mdadm с хотсвоп диском, создать на нем физический том, логическую группу и логический том LVM, и установить на них ОС. Затем содать еще одно зеркало с помощью md и присоеденить его к текущему корневому диску с помощью LVM. Сэмитировать выход из строя диска, показать возможность отката конфигурации LVM, добавить диск горячей замены ко второму массиву md.
Надо оговориться, что все что дальше описано делалось на Debian 6 squeeze.
Часть действий будет проделана на этапе установки, но не с помощью мастера, а переключившись в свободный виртуальный терминал, чтобы процесс был более наглядным. А вторая часть практики будет выполнена после установке, на уже работающей системе. Будет использоваться два логических тома LVM один для /boot, второй для /. После создания RAID обычно нужно перегенерировать образ initrd, чтобы система корректно загрузилась, но за нас это сделает установщик дебиан.
У нас имеется 2 диска. Разобьем их на 7 разделов, с которыми и будем работать. Два раздела под зеркало для корневой ФС, два для зеркала которое мы подлючим потом с помощью LVM, один для swap’а и два для дисков горячей замены.
Можно установить сначала все без RAID’а потом создать его, перенести туда корневую ФС, подправить меню загручика, перегенерить initrd, но мы не ищем сложных путей (по-крайней мере в данном случае), поэтому будем устанавливать сразу на массив. Но чтобы поработать с утилитами командной строки, мы не будем пользоваться мастером, который нам предоставляет установочная программа Debian. Поэтому в режиме экспертной установки дойдя до этапа разбиения диска “Partition disks” входим в него, для того чтобы загрузились необхомые модули установщика, а затем нажмем Alt + F3 и переключимся в свободный виртуальный терминал. Можно также использовать возможность установки через SSH. В нем запустим fdisk и разобьем их, как было описано выше (разбить кстати можно и средствами установщика, в данном случае не принципиально), в итоге должны получиться следующие таблицы разделов для каждого диска:
Сам процесс разбиения не относиться к теме статьи и не будет описываться здесь.
На следующем шаге создадим первое зеркало. Для этого выполняется команда:
# mdadm --create /dev/md0 -l 1 -n 2 -x 1 \ /dev/sda1 /dev/sdb1 /dev/sda3
, где:
–create /dev/md0 – создаваемое логическое устройство
-l 1 – уровень RAID, в данном случае 1 – зеркало
-n 2 – количество дисков в массиве
-x 1 – количество дисков горячей замены (hot spare)
/dev/sda1 /dev/sdb1 /dev/sda3 – сами диски для массива и горячей замены
После этого начнется создание и синхронизация зеркала, за которой можно следить в файле /proc/mdstat. Во время создания массива в нем отображается индикатор его готовности, его можно отслеживать в соседней консоли, например. После создания он выглядит следующим образом:
Следующие шаги: создание физического тома LVM на нашем массиве, затем создание на нем виртуально группы LVM и наконец двух логических томов, на которые будет устанавливаться система, один для /boot и второй для корня. Это выполняется следующей последовательностью комманд:
# pvcreate /dev/md0 # vgcreate debian_vg0 /dev/md0 # lvcreate --size 128M debian_vg0 # lvcreate -l 100%FREE debian_vg0
Это простейший вариант конфигурации, возможно задание более тонких настроек, они указаны в справке к данным инструментам. Посмотреть текущую конфигурацию LVM можно командами pvdisplay, vgdisplay и lvdisplay.
Теперь возвращаемся в первую консоль и продолжаем установку системы. Выбираем ручной вариант разбивки “Manual”. У меня он сразу не увидел изменений, которые были внесены предыдущими командами, поэтому я выбрал пункт “Configure sowtware RAID”, положительно ответил на заданный вопрос и сразу нажал finish, после чего установщик перечитал кофигурацию дисков и увидел все изменения. Теперь в нем же помечаем созданные логические диски как /boot и /, выбираем правильные файловые системы и т. п. У меня в результате получилась следующая картина:
Если все верно, переходим дальше выбирая “Finish partitioning and write changes to disk” и положительно отвечаем на заданные вопросы.
Далее следует доустановить до конца Debian. Этот процесс описываться не будет. После перезагруки система загрузиться с собранного нами массива.
При загрузке GRUB2 может ругнуться, следующим образом: “error: superfluous RAID member (2 found)”. Повидимому это баг grub2 в Debian http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=611561. Похоже таким образом он ругается на “hot spare” диски, потому что у меня совпадало количество подобных сообщений с количеством дисков горячей замены.
Теперь посмотрим, как поведет себя система при отказе одного из дисков. Для эмуляции отказа в mdadm имеется специальный ключ. Следующая последовательность команд эмулирует выход из строя раздела sdb1, затем выводит состояние массива, которое должно отобразить, что диск sdb1 вышел из строя, а также, что диск горячей замены /dev/sda3, автоматически его заменил и запустился процесс синхронизации. Затем эмулируется отключение диска /dev/sda1 и добавление нового диска, в данном случае того же sda1. И наконец снова выводиться состояние массива в котором видно, что массив в целостном состоянии, на этот раз синхронизация не нужна, а диск sda1 теперь становиться диском горячей замены. Итак, команды со скриншотами:
# mdadm --manage --fail /dev/md0 /dev/sda1 # cat /proc/mdstat
, или для более динамичной и интересной картинки выполняем:
# watch -n1 cat /proc/mdstat
# mdadm --manage --remove /dev/md0 /dev/sda1 # mdadm --manage --add /dev/md0 /dev/sda1 # cat /proc/mdstat
Кстати, еще один способ посмотреть состояние md-устройства:
# mdadm --misc --detail /dev/md0
Продолжаем эксперементировать. Предположим, что на корневой файловой системе заканчивается свободное пространство и его надо увеличить. Для этого создаем еще одно зеркало с помощью mdadm. Затем сделаем его физическим томом LVM и добавим его в пространсто логической группы debian_vg0. Далее на этом пространстве можно создать еще один логический диск, или расширить один из имеющихся. Нас инетересует увеличение размера корневого раздела, поэтому мы увеличиваем логический том lvol1. И наконец говорим файловой системе, что появилось свободное пространство и чтобы она его заняла.
# mdadm --create /dev/md1 -l 1 -n 2 /dev/sda2 /dev/sdb2 # pvcreate /dev/md1 # vgextend debian_vg0 /dev/md1 # lvextend /dev/debian_vg0/lvol1 -l +100%FREE # resize2fs /dev/debian_vg0/lvol1
Параллельно можно мониторить процесс описанными выше командами, а именно: cat /proc/mdstat, mdstat –misc –detail, pvdisplay, vgdisplay, lvdisplay, df -h и др.
После этого что бы система корректно работала после перезагрузки обязательно, добавить в конфиг /etc/mdadm/mdadm.conf запись о новом массиве и перегенерить образ initrd. Часть конфига выглядит, так:
Мною была добавлена строка начинающаяся с ARRAY /dev/md/1. UUID и другую информацию для ее заполнения можно узнать командой mdadm –misc –detail /dev/md1. Перегенерация загрузочного образа:
# mkinitramfs -o /boot/initrd.img-`uname -r`
После чего можно перезагрузиться, для того что бы убедиться что система загружается.
Следующий эксперимент. LVM умеет откатываться на предыдую конфигурацию. Которую он автоматически каждый раз сохраняет при изменении его настроек. Для примера, отменим увеличение логического тома, сделанное на предыдущем шаге.
Во избежание потери данных, и повреждения ФС, надо ее уменьшить, но к сожалению он-лайн уменьшения в отличие от увеличения ext4 не поддерживает, поэтму следует загрузиться с какого либо носителя, который сможет, понять md и LVM и уменьшить, например с того установочного диска Debian в режиме эксперной установки или Rescue mode. Для уменьшения сначала проверяем файловую систему, затем уменьшаем ее и, наконец, после перезагрузки, откатываем конфигурацию LVM. Это делается следующими командами:
# fsck.ext4 -f /dev/debian_vg0/lvol1 # resize2fs /dev/debian_vg0/lvol1 1024M # reboot
Перезагрузка системы…
# vgcfgrestore -f /etc/lvm/archive/debian_vg0_00005.vg debian_vg0
В последней команде, debian_vg0_00005.vg это файл с конфигурацией для восстановления. После этого размер логического тома вернется на свое место, а в группе томов debian_vg0 появиться свободное место, проверяется опять же командами lvdisplay и vgdisplay. Тут важно не уменьшить логический том, так чтобы на него не влезла файловая система, иначе она может повредиться.
Напоследок добавим к массиву md1 диск горячей замены, а то диск остался не использован, а тут как раз его не хватает:
# mdadm /dev/md1 -a /dev/sdb3
Затем в конфиге mdadm – /etc/mdadm/mdadm.conf, после строки с объявлением массива md1 добавить строку spares=1, аналогично, как это указано для массива md0. И перегенерить загрузочный образ:
# mkinitramfs -o /boot/initrd.img-`uname -r`
Можно перезагрузиться для проверки.
Также при перезгрузке системы и отключении локальных дисков, может появляться сообщение типа:
Can’t deactivate volume group “debian_vg0″ with 1 open logical volume(s)
Похоже это ошибка является следствием бага остановочных скриптов Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=466141. Можно попытаться избвавиться от нее но, она не носит критического характера и на нее можно просто не обращать внимания.
Заключение
В данной статье были рассмотрены основы двух популярных программных RAID массиов, предлагаемых Linux. Они имеют ряд преимуществ и недостатков по сравнению с аппартными реализациями RAID. Например, в плане переносимости, с одной машины на другую, а также наличием таких интересных возможностей как снэпшоты и др., при относительно небольших затратах ресурсов на обеспечение их работы. Про преимущества использования именно этой связки сказано в одной из главы выше.
В Debian конфиг MD находиться в каталоге /etc/mdadm, а конфиг LVM в /etc/lvm.
На этом все, надеюсь кому нибудь данная статья окажется интересной или даже полезной.
Использованные материалы:
Видео-лекции Яndex
http://ru.wikipedia.org/wiki/Mdadm
http://ru.wikipedia.org/wiki/LVM
![Screenshot-vm2 [Работает] - Oracle VM VirtualBox](http://blog.iv-t.ru/wp-content/uploads/2011/07/Screenshot-vm2-Работает-Oracle-VM-VirtualBox.png)
![Screenshot-vm2 [Работает] - Oracle VM VirtualBox-1](http://blog.iv-t.ru/wp-content/uploads/2011/07/Screenshot-vm2-Работает-Oracle-VM-VirtualBox-1.png)
![Screenshot-vm2 [Работает] - Oracle VM VirtualBox-3](http://blog.iv-t.ru/wp-content/uploads/2011/07/Screenshot-vm2-Работает-Oracle-VM-VirtualBox-3.png)
![Screenshot-vm2 [Работает] - Oracle VM VirtualBox-4](http://blog.iv-t.ru/wp-content/uploads/2011/07/Screenshot-vm2-Работает-Oracle-VM-VirtualBox-4.png)
![Screenshot-vm2 [Работает] - Oracle VM VirtualBox-5](http://blog.iv-t.ru/wp-content/uploads/2011/07/Screenshot-vm2-Работает-Oracle-VM-VirtualBox-5.png)
![Screenshot-vm2 [Работает] - Oracle VM VirtualBox-8](http://blog.iv-t.ru/wp-content/uploads/2011/07/Screenshot-vm2-Работает-Oracle-VM-VirtualBox-8.png)