пятница, 28 декабря 2012 г.

Программный RAID - шпаргалка (mdadm)


Программный RAID - шпаргалка (mdadm)


План:

1. Необходимые знания
2. Введение
3. Установка программ и подготовка дисков
4. Создание и администрирование массива
5. Используемая литература


1. Необходимые знания


Для наилучшего понимания необходимо прочитать следующие статьи:
Инструменты администратора
Системные сообщения и управление ими (logrotate)
Установка программ, управление пакетами и системные обновления (apt, dpkg)
Автозагрузка и запланированные задания (rc.local, cron)

2. Введение 


Теории не будет!
Много писалось о том, что такое RAID, какие бывают уровни, чем он лучше аппаратного, чем хуже. Всю эту информацию можно легко найти в списке используемой литературы (пункт 5).
Скажу одно: в большинстве случаев удобнее использовать зеркальный массив, реализованный программными средствами (mdadm, raid-1).
Это шпаргалка о порядке действий и синтаксисе программы. Мы детально проследим за тривиальными действиями при работе с программным RAID на примере зеркала из трёх дисков.
Насколько эта информация легка в усваивании, настолько же она легко забывается при отсутствии практики.
Создадим зеркальный массив из двух дисков. Примонтируем его. Запишем на него данные. Отмонтируем. Подключим к массиву третий диск. Отключим от него третий диск. Выключим массив. Примонтируем только третий диск (да, так тоже можно). Увидим, что данные на него засинхронизировались. Отмонтируем третий диск. Соберем автомаитчески зеркальный массив из трёх дисков. Примонтируем. Убедимся в существовании данных. Отмонтируем. Разберем.

3. Установка программ и подготовка дисков


Установка элементарная:
# apt-get install mdadm
Необходимые модули для зеркального рейда:
# modprobe raid1
Подготовка дисков сводится к тому, что создаются разделы типа linux-raid (номер в таблице = fd) одинакового размера на разных физических устройствах
fdisk /dev/sda
После чего необходимо проделать ту же самую операцию на всех дисках, которые будут участвовать в зеркале. Можно выполнить копирование таблицы разделов с /dev/sda на /dev/sdb
# sfdisk -d /dev/sda | sfdisk /dev/sdb
проверить, что оба диска имеют одинаковую разметку
# fdisk -l
В нашем случае физический дисков нет. Есть свободное пространство в размере 300 мегабайт. Этого вполне достаточно для того, чтобы потренероваться.
Подготовим три тестовые "виртуальные" диска по 100 мегабайт каждый
# dd if=/dev/zero of=test0 bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0,827134 s, 127 MB/s
# losetup -fs test0
/dev/loop0

# dd if=/dev/zero of=test1 bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0,991705 s, 106 MB/s
# losetup -fs test1
/dev/loop1

# dd if=/dev/zero of=test2 bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0,828726 s, 127 MB/s
# losetup -fs test2
/dev/loop2

# losetup -a
/dev/loop0: [0801]:221186 (test0)
/dev/loop1: [0801]:221187 (test1)
/dev/loop2: [0801]:221188 (test2)
Теперь мы будем работать с устройствами /dev/loop0, /dev/loop1 и /dev/loop2 как с реальными разделами на жестких дисках.
Когда закончим работать с RAID, отключим "виртуальные" диски
# losetup -d /dev/loop0
# losetup -d /dev/loop1
# losetup -d /dev/loop2

4. Создание и администрирование массива


Создадим массив raid1 из 2 дисков
# mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/loop0 /dev/loop1
mdadm: array /dev/md0 started.
Посмотрим информацию о массиве
# mdadm --detail /dev/md0
/dev/md0:
 Version : 00.90.03
 Creation Time : Fri Dec 7 17:32:24 2012
 Raid Level : raid1
 Array Size : 102336 (99.95 MiB 104.79 MB)
 Used Dev Size : 102336 (99.95 MiB 104.79 MB)
 Raid Devices : 2
 Total Devices : 2
Preferred Minor : 0
 Persistence : Superblock is persistent

 Update Time : Fri Dec 7 17:32:24 2012
 State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
 Spare Devices : 0

 UUID : 898ab442:c8c8c46f:0efd52e4:14dd7403 (local to host veles)
 Events : 0.4

 Number Major Minor RaidDevice State
 0 7 0 0 active sync /dev/loop0
 1 7 1 1 active sync /dev/loop1

# cat /proc/mdstat
Personalities : [raid1] [raid0]
md0 : active raid1 loop1[1] loop0[0]
 102336 blocks [2/2] [UU]

unused devices: <none>
Отформатируем получившийся массив
# mkfs.ext3 /dev/md0
mke2fs 1.40.8 (13-Mar-2008)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
25584 inodes, 102336 blocks
5116 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
13 block groups
8192 blocks per group, 8192 fragments per group
1968 inodes per group
Superblock backups stored on blocks:
 8193, 24577, 40961, 57345, 73729

Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 39 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
Примонтируем его
# mkdir -p /mnt/md0
# mount /dev/md0 /mnt/md0/
# mount|grep md0
/dev/md0 on /mnt/md0 type ext3 (rw)
# df -h /dev/md0
Filesystem Size Used Avail Use% Mounted on
/dev/md0 97M 5,6M 87M 7% /mnt/md0
# blkid /dev/md0
/dev/md0: UUID="5be69e0d-4600-4ca4-b235-f84efdd572c8" TYPE="ext3"
Запишем туда какие-нибудь данные
# echo "hello" > /mnt/md0/hello.txt
Отмонтируем массив
# umount /mnt/md0
Добавим в массив еще один диск, который засинхронизируется с первыми двумя
# mdadm /dev/md0 --add /dev/loop2
mdadm: added /dev/loop2
Посмотрим информацию о массиве
# mdadm --detail /dev/md0
/dev/md0:
 Version : 00.90.03
 Creation Time : Fri Dec 7 17:32:24 2012
 Raid Level : raid1
 Array Size : 102336 (99.95 MiB 104.79 MB)
 Used Dev Size : 102336 (99.95 MiB 104.79 MB)
 Raid Devices : 2
 Total Devices : 3
Preferred Minor : 0
 Persistence : Superblock is persistent

 Update Time : Fri Dec 7 17:46:38 2012
 State : clean
 Active Devices : 2
Working Devices : 3
 Failed Devices : 0
 Spare Devices : 1

 UUID : 898ab442:c8c8c46f:0efd52e4:14dd7403 (local to host veles)
 Events : 0.6

 Number Major Minor RaidDevice State
 0 7 0 0 active sync /dev/loop0
 1 7 1 1 active sync /dev/loop1

 2 7 2 - spare /dev/loop2


# cat /proc/mdstat
Personalities : [raid1] [raid0]
md0 : active raid1 loop2[2](S) loop1[1] loop0[0]
 102336 blocks [2/2] [UU]

unused devices: <none>
Добавим в массив информацию об увеличении числа дисков
# mdadm --grow -n 3 /dev/md0
Посмотрим информацию о массиве
# mdadm --detail /dev/md0
/dev/md0:
 Version : 00.90.03
 Creation Time : Fri Dec 7 17:32:24 2012
 Raid Level : raid1
 Array Size : 102336 (99.95 MiB 104.79 MB)
 Used Dev Size : 102336 (99.95 MiB 104.79 MB)
 Raid Devices : 3
 Total Devices : 3
Preferred Minor : 0
 Persistence : Superblock is persistent

 Update Time : Fri Dec 7 17:59:41 2012
 State : clean
 Active Devices : 3
Working Devices : 3
 Failed Devices : 0
 Spare Devices : 0

 UUID : 898ab442:c8c8c46f:0efd52e4:14dd7403 (local to host veles)
 Events : 0.14

 Number Major Minor RaidDevice State
 0 7 0 0 active sync /dev/loop0
 1 7 1 1 active sync /dev/loop1
 2 7 2 2 active sync /dev/loop2

# cat /proc/mdstat
Personalities : [raid1] [raid0]
md0 : active raid1 loop2[2] loop1[1] loop0[0]
 102336 blocks [3/3] [UUU]

unused devices: <none>
Запишем информацию о нашем массиве в конфиг. файл
# mdadm --detail --scan >> /etc/mdadm/mdadm.conf
Попытаемся отсоединить один из дисков
# mdadm /dev/md0 --remove /dev/loop2
mdadm: hot remove failed for /dev/loop2: Device or resource busy
# mdadm --grow -n 2 /dev/md0
mdadm: Cannot set raid-devices for /dev/md0: Device or resource busy
Пометим один из дисков как "сбойный"
# mdadm /dev/md0 --fail /dev/loop2
mdadm: set /dev/loop2 faulty in /dev/md0
Посмотрим информацию о массиве
# mdadm --detail /dev/md0
/dev/md0:
 Version : 00.90.03
 Creation Time : Fri Dec 7 18:26:19 2012
 Raid Level : raid1
 Array Size : 102336 (99.95 MiB 104.79 MB)
 Used Dev Size : 102336 (99.95 MiB 104.79 MB)
 Raid Devices : 3
 Total Devices : 3
Preferred Minor : 0
 Persistence : Superblock is persistent

 Update Time : Fri Dec 7 18:26:53 2012
 State : clean, degraded
 Active Devices : 2
Working Devices : 2
 Failed Devices : 1
 Spare Devices : 0

 UUID : 4d09dae5:c6167189:0efd52e4:14dd7403 (local to host veles)
 Events : 0.6

 Number Major Minor RaidDevice State
 0 7 0 0 active sync /dev/loop0
 1 7 1 1 active sync /dev/loop1
 2 0 0 2 removed

 3 7 2 - faulty spare /dev/loop2
# cat /proc/mdstat
Personalities : [raid1] [raid0]
md0 : active raid1 loop2[3](F) loop1[1] loop0[0]
 102336 blocks [3/2] [UU_]

unused devices: <none>
Еще раз попытаемся отсоединить один из дисков
# mdadm /dev/md0 --remove /dev/loop2
mdadm: hot removed /dev/loop2
Пытаемся выключить массив
# mdadm -S /dev/md0
mdadm: fail to stop array /dev/md0: Device or resource busy
Отмонтируем массив
# umount /mnt/md0
Выключим массив
# mdadm -S /dev/md0
mdadm: stopped /dev/md0
Примонтируем только третий диск
# mount /dev/loop2 /mnt/md0/ -t ext3
Видим наши данные
# cat /mnt/md0/hello.txt
hello
Отмонтируем третий диск
# umount /dev/loop2
Вновь создадим массив, но на этот раз автоматически
# mdadm --assemble /dev/md0
mdadm: /dev/md/0 has been started with 3 drives.
Можно было сделать и так:
# mdadm --assemble --scan
Но в связи с тем, что у нас неразбериха небольшая (первые два диска думают, что они в массиве из двух дисков, а третий думает, что он в массиве из трёх дисков) надо явно указывать, какой именно массив мы хотим собрать. При этом данные берутся именно из конфиг. файла /etc/mdadm/mdadm.conf.
Посмотрим информацию о массиве
# mdadm --detail /dev/md0
/dev/md0:
 Version : 00.90.03
 Creation Time : Fri Dec 7 17:32:24 2012
 Raid Level : raid1
 Array Size : 102336 (99.95 MiB 104.79 MB)
 Used Dev Size : 102336 (99.95 MiB 104.79 MB)
 Raid Devices : 3
 Total Devices : 3
Preferred Minor : 0
 Persistence : Superblock is persistent

 Update Time : Fri Dec 7 18:10:34 2012
 State : clean
 Active Devices : 3
Working Devices : 3
 Failed Devices : 0
 Spare Devices : 0

 UUID : 898ab442:c8c8c46f:0efd52e4:14dd7403 (local to host veles)
 Events : 0.54

 Number Major Minor RaidDevice State
 0 7 0 0 active sync /dev/loop0
 1 7 1 1 active sync /dev/loop1
 2 7 2 2 active sync /dev/loop2

# cat /proc/mdstat
Personalities : [raid1] [raid0]
md0 : active raid1 loop0[0] loop2[2] loop1[1]
 102336 blocks [3/3] [UUU]

unused devices: <none>
Примонтируем массив
# mount /dev/md0 /mnt/md0
Проверим данные
# cat /mnt/md0/hello.txt
hello
Отмонтируем массив
# umount /mnt/md0/
Отключим массив
# mdadm -S /dev/md0
mdadm: stopped /dev/md0

5. Используемая литература


http://xgu.ru/wiki/RAID
http://ru.wikipedia.org/wiki/Mdadm
http://www.filosof.name/tags/grub

Комментариев нет:

Отправить комментарий