Ниже представлена общая инструкция для настройки программного массива 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-массива.
После загрузки смотрим дальнейшие действия во второй части статьи.