Настройка программного RAID1 на работающей системе openSuSe 11.2 (11.*, 12.*) Часть 1.

Ниже представлена общая инструкция для настройки программного массива RAID1 на базе mdadm в работающем экземпляре операционной  системы (далее ОС) OpenSuSE 11.2. Внимание !!! Все операции выполняются автором на удаленной машине и соответственно требуют подхода гарантированной загрузки.

В качестве загрузчика операцинной системы используется GRUB. Цель данного улучшения состоит в дополнительном подключении второго жесткого диска в паралелльном режиме для обеспечения работы ОС в том случае, если один из винчестеров будет поврежден. Данное описание не дает каких-либо гарантий, что это будет работать на вашей системе, в силу возможных конфигурационных особенностей.
Все действия описаны для OpenSuSE 11.2, однако также справедливы для новых версий 11.* и 12.* и вариантов разбивки жестких дисков с новой системой разделов gpt, вместо устаревшей msdos/mbr. Для gpt разделов рекомендуется использовать правильную разбивку и установки смещения разделов с использованием предпочтительной утилиты gdisk.

Исходная система установлена на диск /dev/sda/ и представляет собой следующую систему разделов:

storage:~ # smartctl -i /dev/sda
=== START OF INFORMATION SECTION ===
Model Family: Seagate Momentus 5400.6 series
Device Model: ST9500325AS
User Capacity: 500 107 862 016 bytes
storage:~ #

storage:~ # cat /proc/mounts |egrep sda|sort
/dev/sda1 / ext3 rw,...  0 0
/dev/sda5 /opt ext3 rw,... 0 0
/dev/sda6 /tmp ext3 rw,... 0 0
/dev/sda7 /var ext3 rw,... 0 0
/dev/sda8 /home_local ext3 rw,... 0 0
storage:~ #

/dev/sda2 – swap и /dev/sda3 – раздел расширений. После добавления в систему нового жесткого диска, он идентифицируется как /dev/sdb:

storage:~ # smartctl -i /dev/sdb
=== START OF INFORMATION SECTION ===
Model Family: Seagate Momentus 5400.6 series
Device Model: ST9500325AS
User Capacity: 500 107 862 016 bytes
storage:~ #

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

badblocks -v -w -p 5 -t random -c 2048 /dev/sdb

В итоге мы хотим получить следующую конфигурацию:

/dev/md0 (составлен из /dev/sda1 и /dev/sdb1)   - / ext3 rw,...  0 0
/dev/md1 (составлен из/dev/sda5  и /dev/sdb5)   - /opt ext3 rw,... 0 0
/dev/md2 (составлен из/dev/sda6  и /dev/sdb6)   - /tmp ext3 rw,... 0 0
/dev/md3 (составлен из/dev/sda7 и  /dev/sdb7)   - /var ext3 rw,... 0 0
/dev/md4 (составлен из /dev/sda8  и /dev/sdb8)   - /home_local ext3 rw,... 0 0

Теперь сделаем отступление и установим или проверим наличие программных компонент для программного массива.

А именно, установим  “mdadm” – в текущий момент это главный инструмент построения программных RAID-массивов.

# zupper update
# zypper se mdadm
Loading repository data...
Reading installed packages...
S | Name | Summary | Type
--+-------+--------------------------------------------------------------------------+-----------
| mdadm | Utility for Configuring MD Setup | package
| mdadm | Utility for Configuring MD Setup | srcpackage
| mdadm | mdadm: This update fixes a invalid command syntax in /etc/init.d/boot.md | patch
# zypper install mdadm

Предварительно рекомендуется скопировать старую версию initrd и создать альтернативный пункт в загрузчике grub со старым initrd. Старый вариант можно оставить как вариант для опции fallback, а для нового установить загрузку по умолчанию.
Так же включаем сервис boot.md:

# chkconfig -A --list|egrep boot.md; chkconfig --add boot.md
boot.md 0:off 1:off 2:off 3:off 4:off 5:off 6:off
boot.md 0:off 1:off 2:off 3:off 4:off 5:off 6:off B:on
#

Выполняем обновление initrd для включения поддержки md массивов:

# mkinitrd -f md
Kernel image: /boot/vmlinuz-2.6.31.14-0.8-default
Initrd image: /boot/initrd-2.6.31.14-0.8-default
Root device: /dev/disk/by-id/ata-VBOX_HARDDISK_VB03d7e69d-ae6ef420-part1 (/dev/sda1)
(mounted on / as ext4)
Resume device: /dev/disk/by-id/ata-VBOX_HARDDISK_VB03d7e69d-ae6ef420-part2 (/dev/sda2)
Kernel Modules: hwmon thermal_sys thermal libata ahci ata_piix ata_generic ide-core piix ....
Features: block usb md resume.userspace resume.kernel
Bootsplash: openSUSE (1024x768)
30935 blocks
#

Перегружаем сервер и смотрим состояние mdstat:

# cat /proc/mdstat
Personalities :
unused devices: none
#:

Готовим новый диск для массива /dev/sdb, копируем на него все данные с /dev/sda, добавляем его в массив.
Сначала скопируем таблицу разделов:

# ll /dev/sd
sda sda1 sda2 sda3 sda5 sda6 sda7 sda8 sdb
# sfdisk -d /dev/sda > /tmp/sdab.layout
# sfdisk -f /dev/sdb < /tmp/sdab.layout
Checking that no-one is using this disk right now ...
OK

Disk /dev/sdb: 326 cylinders, 255 heads, 63 sectors/track

sfdisk: ERROR: sector 0 does not have an msdos signature
/dev/sdb: unrecognized partition table type
Old situation:
No partitions found
New situation:
Units = sectors of 512 bytes, counting from 0

Device Boot Start End #sectors Id System
/dev/sdb1 * 63 3148739 3148677 83 Linux
/dev/sdb2 3148740 3678884 530145 82 Linux swap / Solaris
/dev/sdb3 3678885 5237189 1558305 f W95 Ext'd (LBA)
/dev/sdb4 0 - 0 0 Empty
/dev/sdb5 3678948 3887729 208782 83 Linux
/dev/sdb6 3887793 4096574 208782 83 Linux
/dev/sdb7 4096638 4498199 401562 83 Linux
/dev/sdb8 4498263 5237189 738927 83 Linux
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).)
#
#dd if=/dev/sda of=/dev/sdb bs=512 count=1

Теперь изменим тип разделов на втором жестком диске на Linux raid autodetect:

# fdisk /dev/sdb
Command (m for help): t
Partition number (1-8): 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

Command (m for help): t
Partition number (1-8): 2
Hex code (type L to list codes): fd
Changed system type of partition 2 to fd (Linux raid autodetect)

Command (m for help): t
Partition number (1-8): 5
Hex code (type L to list codes): fd
Changed system type of partition 5 to fd (Linux raid autodetect)

Command (m for help): t
Partition number (1-8): 6
Hex code (type L to list codes): fd
Changed system type of partition 6 to fd (Linux raid autodetect)

Command (m for help): t
Partition number (1-8): 7
Hex code (type L to list codes): fd
Changed system type of partition 7 to fd (Linux raid autodetect)

Command (m for help): t
Partition number (1-8): 8
Hex code (type L to list codes): fd
Changed system type of partition 8 to fd (Linux raid autodetect)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
#

Вычищаем метаданные новых разделов на /dev/sdb:

mdadm --zero-superblock /dev/sdb1
mdadm --zero-superblock /dev/sdb2
mdadm --zero-superblock /dev/sdb5
mdadm --zero-superblock /dev/sdb6
mdadm --zero-superblock /dev/sdb7
mdadm --zero-superblock /dev/sdb8

Теперь создаем пустой массив с использованием разделов диска /dev/sdb:

mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb1
mdadm --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb2
mdadm --create /dev/md2 --level=1 --raid-devices=2 missing /dev/sdb5
mdadm --create /dev/md3 --level=1 --raid-devices=2 missing /dev/sdb6
mdadm --create /dev/md4 --level=1 --raid-devices=2 missing /dev/sdb7
mdadm --create /dev/md5 --level=1 --raid-devices=2 missing /dev/sdb8

Создаем файловые системы на разделах аналогичные разделам с /dev/sda:

# mkfs.ext3 /dev/md0
# mkfs.ext3 /dev/md2
# mkfs.ext3 /dev/md3
# mkfs.ext3 /dev/md4
# mkfs.ext3 /dev/md5
# mkswap /dev/md1

И дополняем файл конфигурации для mdadm:

mdadm -E --scan >> /etc/mdadm.conf

На этом этапе монтируем новые разделы и переносим данные с диска /dev/sda:

# mkdir -p /mnt/md{0,1,2,3,4,5}
# mount /dev/md0 /mnt/md0
# mount /dev/md2 /mnt/md2

Редактируем файл /etc/fstab  и файл /etc/mtab

Заменим /dev/sda* на /dev/md* в соответствии с нашими разделами. Например:

# cat /etc/fstab
/dev/md1 swap swap defaults 0 0
/dev/md0 / ext4 acl,user_xattr 1 1
/dev/md5 /home ext4 acl,user_xattr 1 2
/dev/md2 /opt ext4 acl,user_xattr 1 2
/dev/md3 /tmp ext4 acl,user_xattr 1 2
/dev/md4 /var ext4 acl,user_xattr 1 2
proc /proc proc defaults 0 0
sysfs /sys sysfs noauto 0 0
debugfs /sys/kernel/debug debugfs noauto 0 0
usbfs /proc/bus/usb usbfs noauto 0 0
devpts /dev/pts devpts mode=0620,gid=5 0 0

Настраиваем файл загрузчика GRUB.
Откройте файл /boot/grub/menu.lst и добавьте опцию fallback сразу после default

default 1
fallback 0

Это значит, что если 1 конфигурация (нумерация начинается с нуля) не сможет загрузиться, то будет загружена 0.
Копируйте 0 блок, вставляем следом его копию и правим:
добавляем в title - MD
заменяем root=... на root=/dev/md0 и root (hd0,0) на root (hd1,0) и добавляем параметр panic=10 и need_mdadm=1.
Вид нового блока для примера:

title openSUSE 11.2 - 2.6.31.14-0.8 MD
root (hd1,0)
kernel /boot/vmlinuz-2.6.31.14-0.8-default root=/dev/md0 need_mdadm=1 vga=0x317 panic=10
initrd /boot/initrd-2.6.31.14-0.8-default

При загрузке система попытается загрузиться с все еще поврежденного массива /dev/md0. В случае неудачи загрузка продолжится со следующего по списку раздела /dev/sda ( fallback 0).
Теперь еще раз обновим RAM-диск, предварительно создав копию initrd с суффиксом .orig в директории /boot. После создания копии новое имя initrd нужен изменить в 0 блоке файла конфигурации grub.
Добавляем в список модулей /etc/sysconfig/kernel:

raid0 raid1 raid456 linear multipath

В параметрах загрузки ядра перепроверяем опцию need_mdadm=1 если еще не добавлена или пропущена и выполняем

mkinitrd -f md

Если получаем ошибки поиска диска, то приводим в должный вид файл - /boot/grub/device.map

Копируем все данные на новые разделы на примере и проверяем с diff:
Повторяем для всех целевых разделов - md0, md2, md3, md4, md5

# cd / ; find . -xdev | cpio -pm /mnt/md0 ; diff / /mnt/md0
# cd /opt ; find . -xdev | cpio -pm /mnt/md2 ;   diff /opt /mnt/md2
# cd /tmp ; find . -xdev | cpio -pm /mnt/md3 ;   diff /tmp /mnt/md3    
# cd /var ; find . -xdev | cpio -pm /mnt/md4 ;   diff /var /mnt/md4 
# cd /home ; find . -xdev | cpio -pm /mnt/md5 ;   diff /home /mnt/md5

И последний этап - обновление загрузчика GRUB на дисках

grub> root (hd0,0)
grub> setup (hd0)
grub> root (hd1,0)
grub> setup (hd1)
grub> quit

После этих действий выполняем перезагрузку и надеемся на загрузку с RAID-массива.
После загрузки смотрим дальнейшие действия во второй части статьи.

Scroll to top