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

Перенос корня на raid (mdadm)


Перенос корня на raid (mdadm)


План:

1. Необходимые знания
2. Постановка задачи
3. Установка ПО и подготовка дисков
4. Создание массива и перенос данных на него
5. Настройка системы и загрузчика на использование массива в качестве корневого раздела системы, перезагрузка в новую систему
6. Подготовка и подключение исходного диска к массиву в качестве второго диска в зеркале
7. Доказательство выполнения поставленной задачи
8. Дополнение
9. Используемая литература


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


Для наилучшего понимания необходимо прочитать следующие статьи:
Установка программ, управление пакетами и системные обновления (apt, dpkg)
Инструменты администратора
Установка программ, управление пакетами и системные обновления (apt, dpkg)
Работаем с накопителями (fdisk, mount)
Программный RAID - шпаргалка (mdadm)



2. Постановка задачи


Дано: Есть система (ubuntu server), установленная на 1 жесткий диск с авторазбитием при установке ( /=ext4 + swap ). Имеется второй жесткий диск такого же объема. Пустой.
Цель: Перенести систему на raid-зеркало из двух дисков, попутно сменив файловую систему на reiserfs. При этом не переустанавливать систему, а именно перенести существующую со всеми настройками и данными, которые в ней могли бы быть.
Доказательством достижения цели будет демонстрация вывода команд:
mount - корень должен быть на /dev/md0, файловая система reiserfs
fdisk -l - разделы на обоих дисках будут Linux Raid Autodetect, наличие устройства /dev/md0
mdadm --detail /dev/md0 - в составе массива будут разделы с обоих дисков /dev/sda1 и /dev/sdb1, их состояние будет active sync
cat /proc/mdstat - уровень raid-массива будет raid1 (зеркало), целостность массива [UU] - не нарушена.
lsblk - наглядное интуитивнопонятное отображение
swapon -s - использование разделов на обоих дисках под своп
free - размер свопа равен сумме размеров своп-разделов обоих дисков



3. Установка ПО и подготовка дисков


Состояние дисков на начальном этапе:
# fdisk -l

Диск /dev/sda: 8589 МБ, 8589934592 байт
255 головок, 63 секторов/треков, 1044 цилиндров, всего 16777216 секторов
Units = секторы of 1 * 512 = 512 bytes
Размер сектора (логического/физического): 512 байт / 512 байт
I/O size (minimum/optimal): 512 bytes / 512 bytes
Идентификатор диска: 0x000c0f42

Устр-во Загр Начало Конец Блоки Id Система
/dev/sda1 * 2048 15728639 7863296 83 Linux
/dev/sda2 15730686 16775167 522241 5 Расширенный
/dev/sda5 15730688 16775167 522240 82 Linux своп / Solaris

Диск /dev/sdb: 8589 МБ, 8589934592 байт
255 головок, 63 секторов/треков, 1044 цилиндров, всего 16777216 секторов
Units = секторы of 1 * 512 = 512 bytes
Размер сектора (логического/физического): 512 байт / 512 байт
I/O size (minimum/optimal): 512 bytes / 512 bytes
Идентификатор диска: 0x00015df5

Устр-во Загр Начало Конец Блоки Id Система

# mount
/dev/sda1 on / type ext4 (rw,errors=remount-ro)


Устанавливаем утилиту, с помощью которой мы организуем программный raid-массив первого уровня (зеркало) - mdadm:
# apt-get install mdadm

При установке mdadm за ним как зависимость потянется postfix. Если это первая установка postfix, то система спросит о варианте настройки почты. Как бы вы ни ответили - это не отложит отпечаток на работу mdadm. Моя система не будет почтовой, а если и будет, то я вручную перенастрою postfix. По-этому я спокойно выбираю "без настройки". После этого postfix вообще можно удалить
# apt-get purge postfix
mdadm всё-равно будет работать.
Посмотрим состояние raid в системе
# mdadm --detail --scan
# cat /proc/mdstat
Personalities :
unused devices: <none>

Разбиваем второй жесткий диск под собственные нужды
У нас будет зеркало из двух разделов (sda1+sdb1) и на каждом из дисков еще будет по 700мб свопа (sda2,sdb2). Swap-разделы не будут в зеркале - это не нужно.
Создаём таблицу разделов на втором диске
# fdisk -l /dev/sdb

Диск /dev/sdb: 8589 МБ, 8589934592 байт
255 головок, 63 секторов/треков, 1044 цилиндров, всего 16777216 секторов
Units = секторы of 1 * 512 = 512 bytes
Размер сектора (логического/физического): 512 байт / 512 байт
I/O size (minimum/optimal): 512 bytes / 512 bytes
Идентификатор диска: 0x00015df5

Устр-во Загр Начало Конец Блоки Id Система
/dev/sdb1 2048 15362047 7680000 fd Автоопределение Linux raid
/dev/sdb2 15362048 16777215 707584 82 Linux своп / Solaris

Создаём swap на подготовленном разделе /dev/sdb2
# mkswap /dev/sdb2
Setting up swapspace version 1, size = 707580 KiB
без метки, UUID=2cd4e3cd-66d5-4f10-be20-e518b3641037




4. Создание массива и перенос данных на него


Хорошим тоном перед созданием массива или добавлением устройства в массив является удаление суперблока на устройстве
# mdadm --zero-superblock /dev/sdb1

Так как у нас только 1 свободный жесткий диск, то мы не сможем создать массив из двух дисков сразу. Вместо второго мы укажем missing, это будет означать "отсутствует". Потом, когда загрузимся в систему на массиве и освободим первый диск, мы его подключим к массиву.
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 missing
mdadm: Note: this array has metadata at the start and
 may not be suitable as a boot device. If you plan to
 store '/boot' on this device please ensure that
 your boot-loader understands md/v1.x metadata, or use
 --metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

# mdadm --detail /dev/md0
/dev/md0:
 Version : 1.2
 Creation Time : Tue Dec 11 16:11:42 2012
 Raid Level : raid1
 Array Size : 7675840 (7.32 GiB 7.86 GB)
 Used Dev Size : 7675840 (7.32 GiB 7.86 GB)
 Raid Devices : 2
 Total Devices : 1
 Persistence : Superblock is persistent

 Update Time : Tue Dec 11 16:11:42 2012
 State : clean, degraded
 Active Devices : 1
Working Devices : 1
 Failed Devices : 0
 Spare Devices : 0

 Name : ubuntu:0 (local to host ubuntu)
 UUID : ee15f1d8:f12fdd83:b3bcfbca:8d295a36
 Events : 0

 Number Major Minor RaidDevice State
 0 8 17 0 active sync /dev/sdb1
 1 0 0 1 removed


# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[0]
 7675840 blocks super 1.2 [2/1] [U_]

unused devices: <none>

Подчеркнутые degraded, removed, [2/1] [U_] говорят о том, что целостность массива нарушена (из двух дисков только один присутствует). Это как раз и есть результат нашего missing.

Для форматирования раздела в reiserfs необходимо установить пакет reiserfsprogs
# apt-get install reiserfsprogs
После форматируем
# mkfs.reiserfs /dev/md0
mkfs.reiserfs 3.6.21 (2009 http://www.namesys.com)

A pair of credits:
Elena Gryaznova performed testing and benchmarking.

The Defense Advanced Research Projects Agency (DARPA, http://www.darpa.mil) is the
primary sponsor of Reiser4. DARPA does not endorse this project; it merely
sponsors it.


Guessing about desired format.. Kernel 3.2.0-23-generic-pae is running.
Format 3.6 with standard journal
Count of blocks on the device: 1918960
Number of blocks consumed by mkreiserfs formatting process: 8270
Blocksize: 4096
Hash function used to sort names: "r5"
Journal Size 8193 blocks (first block 18)
Journal Max transaction length 1024
inode generation number: 0
UUID: 6fc39ba1-9d56-4b8b-807f-605fcb703519
ATTENTION: YOU SHOULD REBOOT AFTER FDISK!
 ALL DATA WILL BE LOST ON '/dev/md0'!
Continue (y/n):y
Initializing journal - 0%....20%....40%....60%....80%....100%
Syncing..ok
ReiserFS is successfully created on /dev/md0.



Вот, что мы имеем после всех этих действий:
# blkid
/dev/sda1: UUID="46462076-9e17-44d9-be3d-15eb8360b2d2" TYPE="ext4"
/dev/sda5: UUID="b40e124a-380a-42ca-b774-695c03ff60f6" TYPE="swap"
/dev/sdb1: UUID="ee15f1d8-f12f-dd83-b3bc-fbca8d295a36" UUID_SUB="0a545820-67e1-8d94-9723-b19cae648523" LABEL="ubuntu:0" TYPE="linux_raid_member"
/dev/sdb2: UUID="2cd4e3cd-66d5-4f10-be20-e518b3641037" TYPE="swap"
/dev/md0: UUID="6fc39ba1-9d56-4b8b-807f-605fcb703519" TYPE="reiserfs"


# mount /dev/md0 /mnt/
# df -h
Файл.система Размер Использовано Дост Использовано% Cмонтировано в
/dev/sda1 7,5G 956M 6,2G 14% /
...
/dev/md0 7,4G 33M 7,3G 1% /mnt


Копируем исходную систему с первого раздела жесткого диска №1 на зеркальный raid-массив, состоящий пока что только из первого раздела жесткого диска №2.
# cp -dprx / /mnt/
Это занимает некоторое время (от 3 минут)
# df -h
Файл.система Размер Использовано Дост Использовано% Cмонтировано в
/dev/sda1 7,5G 956M 6,2G 14% /
...
/dev/md0 7,4G 703M 6,7G 10% /mnt
Мне бросилось в глаза то, что размер различный.




5. Настройка системы и загрузчика на использование массива в качестве корневого раздела системы, перезагрузка в новую систему


Приводим файл /mnt/etc/fstab к виду
proc /proc proc nodev,noexec,nosuid 0 0
UUID=6fc39ba1-9d56-4b8b-807f-605fcb703519 / reiserfs notail,acl 0 1
UUID=2cd4e3cd-66d5-4f10-be20-e518b3641037 none swap sw 0 0
С опцией errors=remount-ro не монтирруется корень, соответственно не загружается система. Пишем туда notail,acl (первое, что пришло в голову из man mount).
Устанавливаем grub на второй диск
# grub-install /dev/sdb
Installation finished. No error reported.

Добавляем информацию о массиве в конфиг
# mdadm --examine --scan >> /mnt/etc/mdadm/mdadm.conf

Перезагружаемся. grub2 не перенастроен на загрузку системы с массива. Но это не беда. Во время отображения меню загрузки нажмем 'c' и попадём в консоль. Далее 'ls' - grub не видит md-устройства (md/0)
c
ls
(hd0) (hd0,msdos1) (hd0,msdos5) (hd1) (hd1,msdos1) (hd1,msdos2)

Надо загрузить модуль mdraid1x
insmod mdraid1x
ls
(md/0) (hd0) (hd0,msdos1) (hd0,msdos5) (hd1) (hd1,msdos1) (hd1,msdos2)

Теперь вводим следующие команды (можно пользоваться табом [TAB] для завершения имён файлов vmlinuz и initrd). Так как целостность массива у нас нарушена, добавим опцию bootdegraded=true в конец строки linux, чтоб не было ошибок при загрузке. Обратите внимание на /dev/md127 - это и есть устройство нашего массива. Именно его нужно указывать.
set root=(md/0)
linux /boot/vmlinuz-3.2.0-23-generic-pae root=/dev/md127 bootdegraded=true
initrd /boot/initrd.img-3.2.0-23-generic-pae
boot
Пошла загрузка системы, расположенной на массиве.



6. Подготовка и подключение исходного диска к массиву в качестве второго диска в зеркале


Загрузился на md127, который уже на reiserfs. Смотрим
# mount
/dev/md127 on / type reiserfs (rw,notail,acl)
...

Копируем таблицу разделов с /dev/sdb на /dev/sda
# sfdisk -d /dev/sdb | sfdisk /dev/sda
Checking that no-one is using this disk right now ...
OK

Disk /dev/sda: 1044 cylinders, 255 heads, 63 sectors/track
Warning: extended partition does not start at a cylinder boundary.
DOS and Linux will interpret the contents differently.
Old situation:
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

 Device Boot Start End #cyls #blocks Id System
/dev/sda1 * 0+ 979- 979- 7863296 83 Linux
/dev/sda2 979+ 1044- 66- 522241 5 Extended
/dev/sda3 0 - 0 0 0 Empty
/dev/sda4 0 - 0 0 0 Empty
/dev/sda5 979+ 1044- 66- 522240 82 Linux swap / Solaris
New situation:
Units = sectors of 512 bytes, counting from 0

 Device Boot Start End #sectors Id System
/dev/sda1 2048 15362047 15360000 fd Linux raid autodetect
/dev/sda2 15362048 16777215 1415168 82 Linux swap / Solaris
/dev/sda3 0 - 0 0 Empty
/dev/sda4 0 - 0 0 Empty
Warning: partition 1 does not end at a cylinder boundary
Warning: partition 2 does not start at a cylinder boundary
Warning: partition 2 does not end at a cylinder boundary
Warning: no primary partition is marked bootable (active)
This does not matter for LILO, but the DOS MBR will not boot this disk.
Successfully wrote the new partition table

Re-reading the partition table ...

If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)

Создаём swap-раздел на /dev/sda2
# mkswap /dev/sda2
Setting up swapspace version 1, size = 707580 KiB
no label, UUID=09050439-69a3-4eba-b39e-7f34c929e9af

добавляем его в /etc/fstab
proc /proc proc nodev,noexec,nosuid 0 0
UUID=6fc39ba1-9d56-4b8b-807f-605fcb703519 / reiserfs notail,acl 0 1
UUID=6aa1ddea-2cd6-4f7c-b0de-823eccccd8dd none swap sw 0 0
UUID=09050439-69a3-4eba-b39e-7f34c929e9af none swap sw 0 0

Подключаем раздел на первом жестком диске к массиву
# mdadm /dev/md127 -a /dev/sda1
mdadm: added /dev/sda1

Проверяем
# cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md127 : active raid1 sda1[2] sdb1[0]
 7675840 blocks super 1.2 [2/1] [U_]
 [=>...................] recovery = 5.5% (423424/7675840) finish=4.8min speed=24907K/sec

unused devices: <none>

Идёт синхронизация. Нужно дождаться завершения. Устанавливаем grub на первый диск.
# grub-install /dev/sda
Installation finished. No error reported.

Обновляем конфигурацию grub, чтобы каждый раз не вводить set root...linux...initrd...boot...
# update-grub
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.2.0-23-generic-pae
Found initrd image: /boot/initrd.img-3.2.0-23-generic-pae
Found memtest86+ image: /boot/memtest86+.bin
done

Перезагружаемся
# reboot




7. Доказательство выполнения поставленной задачи


Загрузились в систему. Проверяем.
mount - корень должен быть на /dev/md0, файловая система reiserfs
# mount
/dev/md127 on / type reiserfs (rw,notail,acl)
...

fdisk -l - разделы на обоих дисках будут Linux Raid Autodetect, наличие устройства /dev/md0
# fdisk -l

Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders, total 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c0f42

 Device Boot Start End Blocks Id System
/dev/sda1 2048 15362047 7680000 fd Linux raid autodetect
/dev/sda2 15362048 16777215 707584 82 Linux swap / Solaris

Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders, total 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x744af781

 Device Boot Start End Blocks Id System
/dev/sdb1 2048 15362047 7680000 fd Linux raid autodetect
/dev/sdb2 15362048 16777215 707584 82 Linux swap / Solaris

Disk /dev/md127: 7860 MB, 7860060160 bytes
2 heads, 4 sectors/track, 1918960 cylinders, total 15351680 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/md127 doesn't contain a valid partition table


mdadm --detail /dev/md0 - в составе массива будут разделы с обоих дисков /dev/sda1 и /dev/sdb1, их состояние будет active sync

# mdadm --detail /dev/md127
/dev/md127:
 Version : 1.2
 Creation Time : Wed Dec 12 15:01:32 2012
 Raid Level : raid1
 Array Size : 7675840 (7.32 GiB 7.86 GB)
 Used Dev Size : 7675840 (7.32 GiB 7.86 GB)
 Raid Devices : 2
 Total Devices : 2
 Persistence : Superblock is persistent

 Update Time : Wed Dec 12 15:50:25 2012
 State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
 Spare Devices : 0

 Name : ubuntu:0 (local to host ubuntu)
 UUID : 6fc39ba1-9d56-4b8b-807f-605fcb703519
 Events : 281

 Number Major Minor RaidDevice State
 0 8 17 0 active sync /dev/sdb1
 2 8 1 1 active sync /dev/sda1


cat /proc/mdstat - уровень raid-массива будет raid1 (зеркало), целостность массива [UU] - не нарушена.

# cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md127 : active raid1 sdb1[0] sda1[2]
 7675840 blocks super 1.2 [2/2] [UU]

unused devices: <none>


# lsblk - наглядное интуитивнопонятное отображение

# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 8G 0 disk
├─sda1 8:1 0 7,3G 0 part
│ └─md127 9:127 0 7,3G 0 raid1 /
└─sda2 8:2 0 691M 0 part [SWAP]
sdb 8:16 0 8G 0 disk
├─sdb1 8:17 0 7,3G 0 part
│ └─md127 9:127 0 7,3G 0 raid1 /
└─sdb2 8:18 0 691M 0 part [SWAP]
sr0 11:0 1 1024M 0 rom


swapon -s - использование разделов на обоих дисках под своп
# swapon -s
Filename Type Size Used Priority
/dev/sda2 partition 707580 0 -1
/dev/sdb2 partition 707580 0 -2


free - размер свопа равен сумме размеров своп-разделов обоих дисков
# free
 total used free shared buffers cached
Mem: 507536 87556 419980 0 4968 43896
-/+ buffers/cache: 38692 468844
Swap: 1415160 0 1415160




8. Дополнение


В случае, если наша система не грузится и необходимо загрузиться с live-cd, или из другой ОС и примонтировать нашу систему, не забудьте, загрузившись, установить mdadm
# apt-get install mdadm

выполнить
# mdadm --assemble --scan

удостовериться, что массив собран правильно
# cat /proc/mdstat

и только после этого монтировать
# mount /dev/md0 /mnt/somedir




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


http://iamsan.ru/unix-like/mdadm-raid1
http://forum.ubuntu.ru/index.php?topic=74165.0;topicseen

1 комментарий: