понедельник, 8 февраля 2010 г.

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

 

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

Условия:

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

На основе /dev/sda и /dev/sdb создать raid-массив первого уровня /dev/md0. Затем перенести на /dev/md0 операционную систему и настроить ее загрузку.

Дополнительные условия:

  • На рабочем диске существует два раздела — корневой и подкачка.
  • В качестве корневой файловой системы используется reiserfs.
  • Предполагается, что используется стандартное ядро для slackware версии 2.6.xx, т.е. минимальная версия — Slackware 12. Однако, если очень хочется, существует возможность установки ядра из стандартных пакетов от новых версий slackware на более старые версии этой операционной системы.

Перед началом необходимо убедиться, что в рабочей slackware установлена утилита mdadm для управления программными raid-массивами. При ее отстутствии нужно установить пакет mdadm, который включется в состав дистрибутива начиная с Slackware 10.

 

Решение задачи

Шаг 1. Загрузка с внешнего носителя.

Загружаемся с SystemResсueCD или c Slax или чего-нибудь еще, чтобы получить полный доступ ко всем дискам и ни один из них не был бы текущим загрузочным.

Шаг 2. Создание таблицы разделов.

Сначала, с помощью команды:

cfdisk /dev/sda

создаем следующие разделы на первом пустом диске:

  • /dev/sda1 — Раздел под raid-массив. Отводим под него большую часть диска. Установить признак «загрузочный». Задать тип раздела «Linux raid autodetect» (код fd).
  • /dev/sda2 — Раздел под подкачку. Отводим под него половину от необходимого размера подкачки. Задать тип раздела «Linux swap» (код 82).

Обращаю внимание, что нельзя полностью заполнять разделами все доступное пространство диска. Т.к., несмортя на указанный одинаковый размер дисков, фактический их размер у разных производителей может не совпадать.

Пример того, что получилось:

# fdisk -l /dev/sda
   Device  Boot   Start     End      Blocks  Id  System
/dev/sda1  *          1  115498  927737653+  fd  Linux raid autodetect
/dev/sda2        115499  116471    7815622+  82  Linux swap

Затем копируем таблицу разделов с первого диска на второй:

sfdisk -d /dev/sda | sfdisk /dev/sdb

Убеждаемся, что таблицы разделов на дисках /dev/sda и /dev/sdb идентичны:

# fdisk -l /dev/sda /dev/sdb
   Device  Boot   Start     End      Blocks  Id  System
/dev/sda1  *          1  115498  927737653+  fd  Linux raid autodetect
/dev/sda2        115499  116471    7815622+  82  Linux swap

   Device  Boot   Start     End      Blocks  Id  System
/dev/sdb1  *          1  115498  927737653+  fd  Linux raid autodetect
/dev/sdb2        115499  116471    7815622+  82  Linux swap

Шаг 3. Создание raid-массива.

Сначала, на всякий случай, очищаем из разделов возможные следы предыдущих raid-массивов:

mdadm --zero-superblock /dev/sda1
mdadm --zero-superblock /dev/sdb1

Теперь, собственно, создаем raid-массив:

mdadm --create /dev/md0 --level=1 --raid-disks=2 /dev/sda1 /dev/sdb1

Здесь запустится процесс синхронизации двух дисков, входящих в массив, который можно отслеживать с помощью команды:

cat /proc/mdstat

Этот процесс никак не ограничивает работу с уже созданным массивом. Т.е. блочное устройство /dev/md0 уже доступно и с ним можно работать. Можно даже перезагружать компьютер. Но, конечно, в полноценную работу raid-массив встанет самостоятельно, когда синхронизация будет завершена.

Шаг 4. Копирование операционной системы.

Форматируем разделы:

mkfs.reiserfs /dev/md0
mkswap /dev/sda2
mkswap /dev/sdb2

Монтируем raid-массив:

mkdir /mnt/md0
mount /dev/md0 /mnt/md0

Монтируем раздел с рабочей системой:

mkdir /mnt/sdc1
mount /dev/sdc1 /mnt/sdc1

Копируем содержимое рабочей системы на raid-массив:

cp -aT /mnt/sdc1 /mnt/md0

Шаг 5. Настройка скопированной системы.

Сохраняем конфигурацию 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

Шаг 6. Настройка загрузки с raid-массива.

Редактируем /mnt/md0/etc/lilo.conf, заменяем строчку:

boot = /dev/XXXN

на:

boot = /dev/md0

И добавляем строчку:

raid-extra-boot=mbr

Далее действуем в зависимости от типа стандартного ядра slackware.

Шаг 6.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

Шаг 6.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

Шаг 7. Проверка.

Выключаем компьютер. Отсоединяем теперь уже не нужный диск /dev/sdc. Включаем компьютер и убеждаемся что загрузка операционной системы происходит нормально с любого диска из raid-массива.

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

Aladdyn комментирует...

Все супер, только после переноса на RAID пароль для root перестал воспринимать. Думал может я что-то забыл, перезагрузился снова с SDC - пароль правильно помнил. Но на райде он не работал...