Описание задачи
Условия:
- Имеется диск с установленной операционной системой slackware — /dev/sda.
- Имеется дополнительный, пустой диск /dev/sdb.
На основе /dev/sda и /dev/sdb создать raid-массив первого уровня /dev/md0. Затем перенести на /dev/md0 операционную систему и настроить ее загрузку. Т.к. один из дисков изначально занят данными, создание raid-массива будем проводить в три этапа:
- Создание неполного массива /dev/md0 только на основе /dev/sdb1.
- Перенос операционной системы с /dev/sda1 на неполный массив /dev/md0.
- Добавление диска /dev/sda1 к raid-массиву /dev/md0.
Дополнительные условия:
- На рабочем диске существует два раздела — корневой и подкачка.
- В качестве корневой файловой системы используется reiserfs.
- Предполагается, что используется стандартное ядро для slackware версии 2.6.xx, т.е. минимальная версия — Slackware 12.
Перед началом необходимо убедиться, что в рабочей slackware установлена утилита mdadm для управления программными raid-массивами. При ее отстутствии нужно установить пакет mdadm.
Решение задачи
Шаг 1. Загрузка с внешнего носителя.
Загружаемся с SystemResсueCD или c Slax или чего-нибудь еще, чтобы получить полный доступ ко всем дискам и ни один из них не был бы текущим загрузочным.
Шаг 2. Создание таблицы разделов на новом диске.
Начальное состояние таблицы разделов на дисках:
# fdisk -l /dev/sda /dev/sdb Device Boot Start End Blocks Id System /dev/sda1 * 1 973 7815591 83 Linux /dev/sda2 974 1044 570307+ 82 Linux swap / Solaris Disk /dev/sdb doesn't contain a valid partition table
Сначала, с помощью команды:
cfdisk /dev/sdb
создаем следующие разделы на новом пустом диске:
- /dev/sdb1 — Раздел под raid-массив. Отводим под него большую часть диска. Установить признак «загрузочный». Задать тип раздела «Linux raid autodetect» (код fd).
- /dev/sdb2 — Раздел под подкачку. Отводим под него половину от необходимого размера подкачки. Задать тип раздела «Linux swap» (код 82).
Обращаю внимание, что нельзя полностью заполнять разделами все доступное пространство диска. Т.к., несмортя на указанный одинаковый размер дисков, фактический их размер у разных производителей может не совпадать.
Пример того, что получилось:
# fdisk -l /dev/sdb Device Boot Start End Blocks Id System /dev/sdb1 * 1 1009 8104761 fd Linux raid autodetect /dev/sdb2 1010 1044 281137+ 82 Linux swap / Solaris
Шаг 3. Создание неполного raid-массива.
Сначала, на всякий случай, очищаем возможные следы предыдущих raid-массивов:
mdadm --zero-superblock /dev/sdb1
Теперь, создаем неполный raid-массив, с одним отсутствующим диском:
# mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1 mdadm: array /dev/md0 started.
Просмотреть состояние raid-массива можно с помощью команды:
# cat /proc/mdstat Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid1 sdb1[1] 8104640 blocks [2/1] [_U] unused devices: <none>
Шаг 4. Копирование операционной системы.
Форматируем разделы:
mkfs.reiserfs /dev/md0 mkswap /dev/sdb2
Монтируем raid-массив:
mkdir /mnt/md0 mount /dev/md0 /mnt/md0
Монтируем раздел с рабочей системой:
mkdir /mnt/sda1 mount /dev/sda1 /mnt/sda1
Копируем содержимое рабочей системы на raid-массив:
cp -aT /mnt/sda1 /mnt/md0
Теперь всё полезное содержимое диска /dev/sda скопировано на raid-массив. Отмонтируем раздел с рабочей системой:
umount /mnt/sda1
Шаг 5. Подготовка таблицы разделов на старом диске.
Копируем таблицу разделов с диска /dev/sdb на /dev/sda:
sfdisk -d /dev/sdb | sfdisk /dev/sda
Убеждаемся, что таблицы разделов на дисках /dev/sda и /dev/sdb стали идентичны:
# fdisk -l /dev/sda /dev/sdb Device Boot Start End Blocks Id System /dev/sda1 * 1 1009 8104761 fd Linux raid autodetect /dev/sda2 1010 1044 281137+ 82 Linux swap / Solaris Device Boot Start End Blocks Id System /dev/sdb1 * 1 1009 8104761 fd Linux raid autodetect /dev/sdb2 1010 1044 281137+ 82 Linux swap / Solaris
Форматируем раздел подкачки:
mkswap /dev/sda2
Шаг 6. Добавление диска в неполный raid-массив.
Опять, очищаем возможные следы предыдущих raid-массивов:
mdadm --zero-superblock /dev/sda1
Добавляем раздел /dev/sda1 в неполный raid-массив /dev/md0:
# mdadm /dev/md0 -a /dev/sda1 mdadm: added /dev/sda1
Здесь запустится процесс синхронизации дисков raid-массива. Отслеживать его можно с помощью команды:
cat /proc/mdstat Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid1 sda1[2] sdb1[1] 8104640 blocks [2/1] [_U] [==>..................] recovery = 13.7% (1118016/8104640) finish=2.5min speed=44720K/sec unused devices: <none>
Шаг 7. Настройка скопированной системы.
Сохраняем конфигурацию raid-массива:
mdadm -D --scan >> /mnt/md0/etc/mdadm.conf
Редактируем в файле /mnt/md0/etc/fstab строчки монтирования корневого раздела и раздела подкачки:
/dev/md0 / reiserfs defaults 1 1 /dev/sda2 swap swap pri=1,defaults 0 0 /dev/sdb2 swap swap pri=1,defaults 0 0
Шаг 8. Настройка загрузки с raid-массива.
Редактируем /mnt/md0/etc/lilo.conf, заменяем строчку:
boot = /dev/sda1
на:
boot = /dev/md0
И добавляем строчку:
raid-extra-boot=mbr
Далее действуем в зависимости от типа стандартного ядра slackware.
Шаг 8.1. Используется huge ядро.
В /mnt/md0/etc/lilo.conf добавляем строки:
image = /boot/vmlinuz-huge-smp-2.6.27.7-smp root = /dev/md0 label = gener-raid read-only
Версия ядра может быть другой, в зависимости от используемой версии slackware.
Запускаем установку загрузчика lilo на оба диска в raid-массиве:
chroot /mnt/md0 /sbin/lilo
Шаг 8.2. Используется generic ядро.
Создаем файл /mnt/md0/etc/mkinitrd.conf, содержащий строки:
CLEAR_TREE="1" OUTPUT_IMAGE="/boot/initrd-generic-2.6.27.7-smp-raid.gz" KERNEL_VERSION="2.6.27.7-smp" MODULE_LIST="reiserfs" ROOTDEV="/dev/md0" RAID="1"
Генерируем initrd-файл:
chroot /mnt/md0 /sbin/mkinitrd -F
В /mnt/md0/etc/lilo.conf добавляем строки:
image = /boot/vmlinuz-generic-smp-2.6.27.7-smp initrd = /boot/initrd-generic-2.6.27.7-smp-raid.gz root = /dev/md0 label = gener-raid read-only
Запускаем установку загрузчика lilo на оба диска в raid-массиве:
chroot /mnt/md0 /sbin/lilo
Шаг 9. Проверка.
Перезагружаем компьютер и убеждаемся что загрузка операционной системы происходит нормально с любого диска из raid-массива.