Создание программного RAID на Debian

Часть 1

Организация отказоустойчивой системы хранения данных — это, естественно, RAID. Стоит дать некоторое определение RAID: избыточный (резервный) массив собранный из независимых дисков. Полное описание классификации RAID массивов можно посмотреть на «Википедия 45». Рассматривая возможности покупки аппаратных RAID массивов, всегда приходится сталкиваться с достаточно высокой ценой. Однако, при выборе хранилища данных можно рассмотреть и другие альтернативы. Так, например, одно из возможных решений может быть реализовано на Linux (Debian) с применением недорогих комплектующих. Вот такое решение программного RAID массива мы сегодня и рассмотрим.

Постановка задачи:
Организовать отказоустойчивую систему хранения данных;
Условия:
быстрое развёртывание;
лёгкое управление;
минимальные потери при аппаратных сбоях;
возможность быстрого ремонта (замены) при аппаратных сбоях;
низкая стоимость;
Условия, которые мы поставили вполне выполнимы если мы будем использовать программный RAID массив. Для решения этой задачи не требуется высокопроизводительного и дорогостоящего оборудования, а также платного программного обеспечения.

Решение:
системный блок с установленным необходимым количеством жёстких дисков (наверняка, в закромах найдется старенький системник, можно использовать и новый с SATA дисками. Все зависит от того, какой дисковый объем и какая надёжность вам нужна)
операционная система Linux (почему именно она? Просто сейчас занимаюсь именно ей. Она бесплатна, всегда можно найти информацию по настройке и внедрению, открытые исходные коды)
Подготовка завершена, можно приступать к реализации нашего плана. Утилита отвечающая за создание и обслуживание дисковых массивов называется mdadm. Поищем её в репозитариях Debian
[user]$su
[root]#aptitude search mdadm
p mdadm - tool to administer Linux MD arrays (software RAID)

Установим ее и приступим к «творению».
[root]#aptitude install mdadm

Во время установки система попросит параметры для обслуживания уже установленных массивов или для будущих. Чтобы не заморачиваться оставьте предложенные параметры по-умолчанию (all). Далее необходимо подготовить жёсткие диски для соединения в массив, определимся, что будем использовать массив класса RAID 1. Один из наиболее надежных (полное зеркалирование) и не дорогое решение.
[root]#fdisk -l
fdisk -l
Disk /dev/hda: 64.4 GB, 64424509440 bytes
255 heads, 63 sectors/track, 7832 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000d1626
Device Boot Start End Blocks Id System
/dev/hda1 * 1 34 273073+ 83 Linux
/dev/hda2 35 7832 62637435 5 Extended
/dev/hda5 35 642 4883728+ 83 Linux
/dev/hda6 643 1007 2931831 83 Linux
/dev/hda7 1008 1195 1510078+ 82 Linux swap / Solaris
/dev/hda8 1196 1244 393561 83 Linux
/dev/hda9 1245 7832 52918078+ 83 Linux
Disk /dev/hdb: 21.4 GB, 21474836480 bytes
16 heads, 63 sectors/track, 41610 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Disk identifier: 0x00000000
Disk /dev/hdb doesn't contain a valid partition table
Disk /dev/hdd: 21.4 GB, 21474836480 bytes
16 heads, 63 sectors/track, 41610 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Disk identifier: 0x00000000
Disk /dev/hdd doesn't contain a valid partition table

В тестовом варианте системы я использую виртуальную машину. Как видно из информации об установленных дисках, у нас имеется два одинаковых жестких диска объемом 21,4Gb (не размечены) - /dev/hdb и /dev/hdd. Разметку можно провести утилитами cfdisk или fdisk. Для наглятности я буду использовать fdisk. В качестве параметров к fdisk указываем устройство с которым будем работать /dev/hdb. Ответы на вопросы системы я буду помечать красным жирным текстом.
[root]#fdisk /dev/hdb
Command (m for help): <span style="color: red; font-weight: bold;">n</span>
Command action
e extended
p primary partition (1-4)
<span style="font-weight: bold; color: red;">p</span>
Partition number (1-4): <span style="color: red; font-weight: bold;">1</span>
First cylinder (1-41610, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-41610, default 41610):
Using default value 41610

Раздел у нас создан. Посмотрим его параметры.
Command (m for help): <span style="color: red; font-weight: bold;">p</span>
Disk /dev/hdb: 21.4 GB, 21474836480 bytes
16 heads, 63 sectors/track, 41610 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Disk identifier: 0xda185917
Device Boot Start End Blocks Id System
<span style="font-weight: bold;">/dev/hdb1 1 41610 20971408+ 83 Linux</span>

Индификатор созданного раздела — 83, это стандартный раздел Linux. Он нам не подходит. Его необходимо сменить на «fd» (linux raid autodetect). Полный список можно посмотреть указав «L» вместо «fd», потом система задаст повторный вопрос.
Command (m for help): <span style="color: red; font-weight: bold;">t</span>
Selected partition 1
Hex code (type L to list codes): <span style="color: red; font-weight: bold;">fd</span>
Changed system type of partition 1 to fd (Linux raid autodetect)

Раздел создан, указан необходимый тип, для проверки можно ввести команду «p» и посмотреть результат, если все устраивает, то пора записать разделы на диск и приступить ко второму жёсткому диску.
Command (m for help): p
Disk /dev/hdb: 21.4 GB, 21474836480 bytes
16 heads, 63 sectors/track, 41610 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Disk identifier: 0xda185917
Device Boot Start End Blocks Id System
<span style="font-weight: bold;">/dev/hdb1 1 41610 20971408+ fd Linux raid autodetect</span>
Command (m for help): <span style="color: red; font-weight: bold;">w</span>
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.

Часть 2

В предыдущей части мы подготовили диски для финальной стадии завершения нашего программного RAID. Напомню, что мы собираем RAID 1. По этой аналогии собираются и остальные классификации массивов - RAID 5, 6, 10 и т.д. После завершения подготовки дисков можно приступать к непосредственному созданию массива. Создание RAID массива выполняется с помощью программы mdadm (ключ --create). Добавим опцию --level, для указания типа RAID массива, который хотим получить, в нашем случае первого (1) уровня. С помощью ключа --raid-devices укажем устройства, поверх которых будет собираться RAID массив.
root# mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/hdb1 /dev/hdd1
mdadm: size set to 20971328K
mdadm: array /dev/md0 started.

Если во время сборки не хватает физических дисков, но вы планируете добавить их позже, т.е. собрать не полный RAID массив (degraded) можно указать слово missing вместо имени устройства. Для RAID 5 это может быть только один диск, для RAID 6 — не более двух, для RAID 1 сколько угодно, но должен быть как минимум один рабочий. Массив создан, теперь необходимо убедится, что собранный RAID массив собран правильно.


root# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
<span style="font-weight: bold;">md0</span> : active (auto-read-only) <span style="font-weight: bold;">raid1 hdd1[1] hdb1[0]</span>
20971328 blocks [2/2] <span style="font-weight: bold;">[UU]</span>
resync=PENDING

unused devices: <none>

Система сообщает, что создан RAID 1 массив, в который входят два устройства - hdd1 и hdb1. Проверка состояния нашего массива показывает [UU] - означает, что все в порядке, а ([_U] или [U_] означает, что массив поврежден. Имя нашего RAID массива md0. Теперь можно переходить к созданию файловой системы поверх нашего массива.
root# mkfs.ext3 /dev/md0
mke2fs 1.41.2 (02-Oct-2008)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
1310720 inodes, 5242832 blocks
262141 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
160 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 31 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

Файловая система создана, но она еще не готова принимать к размещению данных. Можно посмотреть статус массива.
root# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 hdd1[1] hdb1[0]
20971328 blocks [2/2] [UU]
[==>..................] resync = <span style="font-weight: bold;">10.7%</span> (2260416/20971328) finish=<span style="font-weight: bold;">8.4min</span> speed=36824K/sec

unused devices: <none>

Здесь видно, что идет формирование нашего RAID массива, выполнено 10.7%, до завершения осталось 8.4 минуты и показывает с какой скоростью идет процесс. Вы можете запустить watch cat /proc/mdstat для наблюдения за ходом процесса. Выход из watch осуществляется нажатием CTRL+C.
root# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 hdd1[1] hdb1[0]
20971328 blocks [2/2] [UU]

unused devices: <none>

Создание файловой системы завершено. Теперь нужно создать файл конфигурации нашего RAID массива. Система сама не запоминает какие RAID массивы ей нужно создать и какие компоненты в них входят. Эта информация находится в файле конфигурации mdadm.conf. Параметры, которые следует добавить в этот файл, можно получить при помощи команды mdadm --detail --scan --verbose.
root# mdadm --detail --scan --verbose
ARRAY /dev/md0 level=raid1 num-devices=2 metadata=00.90 UUID=ddddad18:ae4cb9be:cb5f3c5d:d16ad809
devices=/dev/hdb1,/dev/hdd1

Команда не добавляет параметры в файл конфигурации, а только выдает, что нужно добавить в него. Полученные параметры можно внести в конфигурационный файл вручную или воспользоваться перенаправлением.
root# mdadm --detail --scan --verbose | awk '/ARRAY/ {print}' >> /etc/mdadm/mdadm.conf

Теперь все готово. И можно приступать к настройке автомонтирования нашего RAID массива при загрузке системы. Но сначало надо создать дирректорий куда будем монтировать RAID массив.
root# mkdir /my_raid

Далее редактируем файл /etc/fstab.
root# nano /etc/fstab

Строка, которая отвечает за монтирование нашего RAID массив выделена жирным.
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
/dev/hda1 / ext3 errors=remount-ro 0 1
/dev/hda9 /home ext3 defaults 0 2
/dev/hda8 /tmp ext3 defaults 0 2
/dev/hda5 /usr ext3 defaults 0 2
/dev/hda6 /var ext3 defaults 0 2
/dev/hda7 none swap sw 0 0
/dev/hdc /media/cdrom0 udf,iso9660 user,noauto 0 0
/dev/fd0 /media/floppy0 auto rw,user,noauto 0 0
<span style="font-weight: bold;">/dev/md0 /my_raid ext3 defaults 0 0</span>

Стоит заметить, что если вносите в файле /etc/fstab коррективы, обязательно на последней строке делайте перевод корретки (последняя строка в файле пустая), дабы избежать потом проблем с монтированием устройств хранения. Создание, настройка RAID 1 массива завершено. Теперь можно его смотрировать и использовать. При следующей загрузке системы массив будет смонтирован автоматически.
root# mount /my_raid

http://www.qdesnic.ru

Обновлено: 13.03.2015