UMGUM.COM (лучше) 

MDADM ( Зеркалирование блочных устройств в рамках локальной системы. )

18 сентября 2012  (обновлено 17 июля 2019)

Эта публикация отнесена в архив. Она неактуальна.

OS: "Linux Debian 5/6/7 (Lenny/Squeeze/Wheezy)".

Сохранность данных на диске можно повысить за счёт использования второго диска, работающего как зеркало первого. Этот режим называется RAID первого уровня (Redundant Array of Inexpensive Disks - избыточный массив недорогих дисков). Коротко - RAID-1.

Отмечу, что большую надёжность (но не производительность) даёт зеркалирование по сети посредством DRDB.


Устанавливаем пакет приложений MDADM:

# aptitude install mdadm

Первым делом отключим автоматический запуск утилит "mdadm" - в дальнейшем будем ими управлять самодельными скриптами, ориентируясь на UUID готовых к эксплуатации массивов.

Надо понимать, что есть модуль ядра "md", обеспечивающий работу с MD-устройствами, а есть пакет утилит "mdadm", который позволяет управлять и мониторить состояние массива, работающего на модуле "md". В частности, утилиты часто запускаются в фоновом режиме для контроля состояния массивов и уведомления по почте. Кстати, файл "mdadm.conf" предназначен именно для работы этого пакета и не нужен для работы модуля "md".

Ничего нам не мешает отдать процедуры сборки массивов, последующего активирования томов LVM, монтирования файловых систем и дальнейшей публикации каталогов соответствующим подсистемам, но мне хотелось бы свести управление хозяйством в единую точку, со своим набором конфигурационных файлов, что позволит упростить перенос и масштабирование схемы. Для этого отключаем всю автоматику.

Прежде всего останавливаем автоматически запущенные при инсталляции сервисы:

# /etc/init.d/mdadm stop
# /etc/init.d/mdadm-raid stop

# vi /etc/default/mdadm

....
INITRDSTART='none'
AUTOSTART=false
AUTOCHECK=false
START_DAEMON=false
....

Следует иметь в виду, что простая правка параметров вышеприведённого конфигурационного файла не окажет ожидаемого влияния на работу всех компонентов подсистемы "mdadm"; у таковой имеется как набор утилит, которые могут читать информацию их этого конфигурационного файла, так и модули ядра, параметры к которым нужно сформировать отдельно. Кроме того, упомянутые модули ядра подсистемы mdadm загружаются ещё и в составе образа "initramfs" (специальным образом подготовленный "Initial RAM Disk" - мини операционная система, загружающая целевую) изменить конфигурацию которой можно только обновив её содержимое путём создания нового образа с учётом произведённых изменений. Применения изменений можно добиться перезапустив конфигурацию пакета и в процессе диалога подтвердить выбранные значения параметров; во время переконфигурирования пакета все необходимые изменения будут применены, так же и обновлением "initramfs":

# dpkg-reconfigure mdadm

....
Generating array device nodes... done.
update-initramfs: Generating /boot/initrd.img-2.6.32-5-amd64
W: mdadm: /etc/mdadm/mdadm.conf defines no arrays.

В качестве последнего шага можно запретить загрузчику операционной системы (в нашем случае GRUB2) инициировать модуль "md" при обнаружении блочных устройств с мета-информацией RAID. Надо понимать, что это не позволит загрузить систему с устройств, объединённых в RAID-массив, но в нашем случае этого и не требуется. Зато, таким образом мы полностью исключим на этапе загрузке операционной системы возможность преждевременной автоматической инициализации наших массивов (и загрузка системы ускоряется за счёт пропуска операций сканирования всех блочных устройств):

# vi /etc/default

....
GRUB_CMDLINE_LINUX_DEFAULT="quiet raid=noautodetect"
....

# update-grub

После всех вышеприведённых манипуляций можно считать, что мы искоренили автоматическую инициализацию mdadm на всех уровнях загрузки: на уровне GRUB2, на уровне "Initial RAM Disk" и на уровне "init.rc".

При загрузке операционной системы модуль DM (Device Manager) по умолчанию автоматически сканирует все доступные блочные устройства на предмет наличия в них метаданных, свидетельствующих о том, что они части массива. В случае обнаружения - массив собирается автоматически.

Если модуль не загрузился, это можно сделать вручную:

# modprobe md
# modprobe raid1

Проверяем, загрузились ли нужные нам модули:

# lsmod | grep raid

Попробуем подготовить HDD (или любые другие блочные устройства) для ввода их в RAID-1.

Проверяем, имеется ли на блочном устройстве "мета-данные":

# mdadm --misc --query /dev/sdb

/dev/sdb: is not an md array

Если на HDD имеются "мета-данные" от предыдущих экспериментов - затираем их (или делаем это из профилактических соображений):

# dd if=/dev/zero of=/dev/sdb bs=1M count=10

Даём команду операционной системе перечитать обновлённую разметку HDD:

# blockdev --rereadpt /dev/sdb

В команде "dd" выше, в особо злостных случаях, когда на диске предварительно порезвились и по натыкали массу вариантов разметки (вложенные контейнеры, многослойные загрузчики, сжатые файловые системы и тому подобное), параметр "count" можно установить в "1000", что бы перезаписать не один килобайт информации в начале дискового устройства, а мегабайт, например.

Для начала нужно подготовить разделы, которые хочется включить в RAID, присвоив им тип "fd (Linux RAID Autodetect)". Это не обязательно, но желательно. Для создания "программного массива" желательно использовать не весь аппаратный диск целиком, а лишь логические диски (желательно - одинакового объёма, в противном случае размер массива будет рассчитываться исходя из размера диска с минимальным объёмом), понятно, что желательно не растягивать раздел на всё доступное пространство, а оставить пару-пятёрку-десятку секторов свободными на возможность люфта объёма дисков:

# fdisk -cu /dev/sdb

Программный RAID в "Linux" ведёт журнал изменений блоков данных "bitmap". Он довольно активно используется и в случае медленного HDD ещё более замедляет его работу. Этот журнал по умолчанию сохраняется внутри самого блочного устройства RAID-а, но (режим "internal"), но можно вынести в файл на отдельный диск (системный в моём случае). Журнал вещь вспомогательная, массив восстанавливается и без "bitmap"-а, но медленнее.

Создаём директорию для выноса в неё журналов MDADM:

# mkdir -p /mnt/journal/mdadm

Первичную сборку массива осуществим ориентируясь на символические имена дисков, что автоматически создаются в каталоге устройств /dev. После будем ориентироваться на идентификаторы UUID.

Содаём массив из двух дисков:

# mdadm --create /dev/md0 --level=raid1 --chunk=512 --bitmap=/mnt/journal/mdadm/md0-bitmap --raid-devices=2 /dev/sdb1 /dev/sdc1

Как вариант создаём вначале массив для двух дисков из одного диска, с резервированием места для подключения второго впоследствии:

# mdadm --create /dev/md1 --level=raid1 --chunk=512 --bitmap=/mnt/journal/mdadm/md1-bitmap --raid-devices=2 /dev/sdd1 missing

Подключаем диск в массив, на место зарезервированное для него ранее:

# mdadm /dev/md1 --add /dev/sde1

Если что не так - массив можно деактивировать:

# mdadm --misc --stop /dev/md0

Наблюдаем за процессом зеркалирования:

# cat /proc/mdstat

Personalities : [raid1]
md0 : active raid1 sdc1[1] sdb1[0]
  976759343 blocks super 1.2 [2/2] [UU]
  [>.....] resync =  0.9% (9579008/976759343) finish=177.6min speed=90732K/sec
  bitmap: 462/466 pages [1848KB], 1024KB chunk, file: /var/spool/mdadm/md0-bitmap
unused devices: <none>

Следующим набором команд можно выяснить состояние RAID-массивов и компонентов таковых:

# mdadm --detail --scan --verbose
# mdadm --misc --query --examine /dev/sdb1
# mdadm --misc --query --detail /dev/md0

После создания RAID-массивов можно ознакомиться с перечнем всех доступных в системе блочных устройств, как физических, так и виртуальных:

# blkid

Иногда, например после некорректного завершения работы, синхронизация блочных устройств массива может быть отложена, переведена в неактивное состояние:

# cat /proc/mdstat

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active (auto-read-only) raid1 sdb1[0] sdc1[1]
  976759343 blocks super 1.2 [2/2] [UU]
  resync=PENDING

В таком случае синхронизацию нужно активизировать и она продолжиться с места остановки:

# echo idle > /sys/block/md0/md/sync_action

Важно иметь в виду, что при обнаружении любой (!) ошибки при работе с RAID-1, RAID-4, RAID-5, RAID-6 и RAID-10 драйвер "mdadm" отключает устройство (помечает его как сбойное флагом "faulty") и продолжает работу на оставшихся. Если есть запасное (spare) устройство, то оно вводится в эксплуатацию вместо отключённого.

Переход к настройке автоматизации зеркалирования блочных устройств в рамках локальной системы.


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )