Сохранность данных на диске можно повысить за счёт использования второго диска, работающего как зеркало первого. Этот режим называется 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
# /etc/init.d/mdadm-raid stop
# vi /etc/default/mdadm
....
INITRDSTART='none'
AUTOSTART=false
AUTOCHECK=false
START_DAEMON=false
....
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.
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"
....
GRUB_CMDLINE_LINUX_DEFAULT="quiet raid=noautodetect"
....
# update-grub
После всех вышеприведённых манипуляций можно считать, что мы искоренили автоматическую инициализацию mdadm на всех уровнях загрузки: на уровне GRUB2, на уровне "Initial RAM Disk" и на уровне "init.rc".
При загрузке операционной системы модуль DM (Device Manager) по умолчанию автоматически сканирует все доступные блочные устройства на предмет наличия в них метаданных, свидетельствующих о том, что они части массива. В случае обнаружения - массив собирается автоматически.
Если модуль не загрузился, это можно сделать вручную:
# modprobe md
# modprobe raid1
# 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>
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
# 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
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) устройство, то оно вводится в эксплуатацию вместо отключённого.
Переход к настройке автоматизации зеркалирования блочных устройств в рамках локальной системы.