среда, 24 февраля 2010 г.

Перенос установленной Slackware на программный raid1-массив 2

 

Описание задачи

Условия:

  • Имеется диск с установленной операционной системой slackware — /dev/sda.
  • Имеется дополнительный, пустой диск /dev/sdb.

На основе /dev/sda и /dev/sdb создать raid-массив первого уровня /dev/md0. Затем перенести на /dev/md0 операционную систему и настроить ее загрузку. Т.к. один из дисков изначально занят данными, создание raid-массива будем проводить в три этапа:

  1. Создание неполного массива /dev/md0 только на основе /dev/sdb1.
  2. Перенос операционной системы с /dev/sda1 на неполный массив /dev/md0.
  3. Добавление диска /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-массива.

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