Boot + Root + Raid + Lilo : Программный Raid

Что вам потребуется до НАЧАЛА РАБОТЫ
Ниже перечислены пакеты, которые вам понадобятся, а также приведен список документации, которая отвечает на все обычные вопросы о настройке и запуске raid. Пожалуйста, прочитайте это внимательно.

Необходимые пакеты

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

ядро linux, поддерживающее raid и initrd Я взял linux-2.2.14 с kernel.org

ftp://ftp.kernel.org/pub/linux/daemons/raid/alpha/ - самые новые утилиты и патч с поддержкой новых raid1/4/5 Я использовал http://people.redhat.com/mingo/raid-patches/

Где найти новые версии этого документа.

Можете просмотреть последнюю версию авторского оригинала этого документа. Исправления и предложения приветствуются!

Документация рекомендуемая для прочтения

Если вы планируете использовать raid1/5 поверх raid0, прочтите:
/usr/src/linux/Documentation/initrd.txt
а также документацию и руководства, поставляемые с утилитами raidtools.

Информационные ресурсы по RAID

Подключиться к спискам рассылки можно по адресам:

Этот достаточно спокоен: majordomo@nuclecu.unam.mx пошлите письмо с темой subscribe raiddevпочту посылайте по адресу: raiddev@nuclecu.unam.mx

Разработка Raid: majordomo@vger.rutgers.edu пошлите письмо с темой subscribe linux-raidпочту посылайте по адресу: linux-raid@vger.rutgers.edu (это по-видимому наиболее активный список)

Загружаемый Raid

Я не собираюсь здесь описывать фундаментальные аспекты настройки raid0/1/5 на Linux, т.к. все полностью описано в других документах. Проблема, которой займусь я - это настройка raid на корневой файловой системе, и возможность сделать его загружаемым при помощи стандартного LILO. Документация, поставляемая с исходными текстами LILO (не руководствами) и с утилитами raidtools-0.90, описывает детали загрузки, загрузочные параметры и общую настройку raid соответственно.

Здесь описаны два варианта действий. Настройка и установка загружаемого корневого raid, и преобразование уже существующей не-raid системы в загружаемый корневой raid без потери данных.

Загрузка RAID 1 при помощи стандартного LILO

Чтобы загрузочная информация была избыточной и легкой в сопровождении, создайте небольшой RAID1 и смонтируйте его в каталог /boot вашего системного диска. LILO не знает об устройствах 0x9?? и не может найти информацию во время загрузки, потому что подсистема raid еще не активна. Чтобы обойти это, вы можете передать LILO информацию о геометрии диска (дисков), из которой LILO сможет определить положение информации, необходимой для загрузки ядра, даже если он на RAID1-разделе. Это происходит потому, что раздел RAID1 аналогичен стандартному разделу, за исключением супер-блока raid, записанного в конце. Загружаемый raid-массив должен находиться в пределах первых 1024 Мбайт диска. Теоретически, он может начинаться, где угодно в 1024 Мегабайтном пространстве, но на практике мне так и не удалось его запустить, если загружаемый raid не находился в самом начале этого гигабайта. Возможно, это было из-за того, что я делал что-то глупое, но теперь это не имеет значения. С тех пор я всегда настраиваю все мои системы так, чтобы загружаемый raid-массив был первым разделом в системе. У меня есть следующие конфигурации корневых raid-систем, с загружаемым RAID1, подключенным к /boot с корневыми raid-массивами: RAID1, RAID5, RAID10 & RAID1-10 ( 1 зеркало + 1 raid0-блок). У последнего имеется особая пара lilo-файлов, потому что у всех дисков разные геометрии, однако, принципы первоначального загрузочного процесса абсолютно одинаковы. Корневые системы RAID10 и RAID1-10 требуют использования initrd для подключения корневой файловой системы после того, как процесс загрузки ядра закончен. Смотрите приложения с примерами конфигурационных файлов для всех моих систем.
Стандартный конфигурационный файл LILO выглядит примерно так:
# lilo.conf - предполагаем, что диск менее 1024 Мб
boot = /dev/hda
delay = 40               # многовато, но красиво
vga = normal             # обычно не требуется
image = /bzImage
root = /dev/hda1
read-only
label = Linux

Пара конфигурационных файлов LILO для raid выглядят примерно так:

# lilo.conf.hda - первичный ide, главный диск
disk=/dev/md0
bios=0x80
sectors=63
heads=16
cylinders=39770
partition=/dev/md1
start=63
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
image=/boot/bzImage
root=/dev/md0
read-only
label=LinuxRaid

# ---------------------

# lilo.conf.hdc - вторичный ide, главный диск
disk=/dev/md0
bios=0x80                # см. замечание ниже
sectors=63
heads=16
cylinders=39770
partition=/dev/md1
start=63
boot=/dev/hdc            # вот это второй диск
map=/boot/map
install=/boot/boot.b
image=/boot/bzImage
root=/dev/md0
read-only
label=LinuxRaid
Если ваш BIOS достаточно "умен" (многие нет), чтобы понять, что первый диск не работает или отсутствует, и затем начать загружаться со второго, то здесь должна находиться строка bios=81. Это ситуация больше подходит для SCSI-bios, чем для IDE-bios. Я просто планирую перенос диска, в случае проблем с главным загрузочным диском, чтобы заменить отказавший диск C.
Информация о геометрии диска может быть получена при помощи fdisk:
fdisk -ul (маленькая L)
fdisk -ul /dev/hda

Disk /dev/hda: 16 heads, 63 sectors, 39770 cylinders
Units = sectors of 1 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/hda1            63     33263     16600+  fd  Linux raid autodetect
/dev/hda2         33264    443519    205128   82  Linux swap
/dev/hda3        443520  40088159  19822320   fd  Linux raid autodetect

* Заметьте, что здесь приведено начало каждого раздела

Подробный разбор lilo.conf для загружаемого raid

Здесь приведен файл lilo.conf для raid, показанный выше, с комментариями к каждой строке.

# lilo.conf.hda - первичный ide, главный диск
#       местоположение каталога /boot, в котором буден находиться
#       ядро, таблицы Lilo, и т.п.
#       Заметьте, что это не НАСТОЯЩИЙ раздел, в котором находятся
#       загрузочный образ и информация, а устройство,
#       которое логически содержит этот каталог.
#       В этом примере /dev/md1 подключен к точке /dev/md0/boot
disk=/dev/md0

#       указать LILO, которое BIOS-устройство использовать для загрузки, т.е. диск C:
bios=0x80

#       указать LILO физическую геометрию устройства,
#       которая не всегда совпадает с "логической"
#       геометрией. Смотрите файловую систему /proc или
#       просмотрите сообщения ядра при загрузке, когда он опрашивает  диски
#
sectors=63
heads=16
cylinders=39770

#       Это подставная строка, чтобы LILO был удовлетворен тем, что
#       узнал raid-набор (set) и потом нашел НАЧАЛО
#       загрузочного сектора. Для того, чтобы узнать
#       для чего эта строка на самом деле, читайте
#       документацию, идущую с пакетом исходных текстов LILO.
#       Этот параметр "должен" отличаться от строки
#       disk= ,приведенной выше. Это может быть любое другое mdx
#       устройство, используемое или нет, и не обязательно должно быть тем,
#       которое содержит информацию каталога /boot
#
partition=/dev/md1

#       первый сектор раздела, содержащего каталог /boot
start=63

#       настоящее устройство, куда LILO запишет загрузочную информацию
boot=/dev/hda

#       логическое устройство, куда LILO поместит загрузочную информацию
map=/boot/map
install=/boot/boot.b

#       логическое местоположение ядра
image=/boot/bzImage

#       стандартные строки приведены ниже
#       корневым (root) может быть raid1/4/5-устройство
root=/dev/md0
read-only
label=LinuxRaid

 Переход с не-raid на RAID1/4/5

Переход с не-raid системы к raid достаточно прост, и состоит из нескольких последовательных шагов, приведенных ниже. Описание приведено для системы с загрузочным, корневым и swap-разделами.

СТАРЫЙ диск в существующей системе:

    /dev/hda1     загрузочный, возможно dos+loadlin или lilo
/dev/hda2     корневой
/dev/hda3     swap

Мы добавим дополнительный диск и преобразуем систему в RAID1. Вы можете легко добавить несколько дисков и сделать RAID5-массив, при помощи подобной процедуры.

Шаг 1 - готовим новое ядро

Скачайте новое чистое ядро, утилиты raidtools-0.90 (или более новую версию), и патч к ядру, для поддержки raid версии 0.90.

Соберите и установите raidtools и ПРОЧИТАЙТЕ документацию.

Соберите и установите ядро с поддержкой тех видов (0/1/4/5 ?) raid, которые вы будете использовать. Убедитесь в том, что разрешили автозапуск raid-устройств в конфигурации ядра. Удостоверьтесь в том, что ядро нормально загружается и изучите файл /proc/mdstat, чтобы еще раз убедиться в том, что необходимые вам виды raid поддерживаются ядром.

Шаг 2 - настраиваем raidtab для вашего нового raid-а.

Новый диск будет добавлен на второй IDE-контроллер как главное устройство, поэтому станет /dev/hdc
/dev/hdc1     16 Мб -- более чем достаточно для нескольких ядер
/dev/hdc2     большая часть диска
/dev/hdc3     еще немного swap-пространства, если необходимо. Если нет, увеличьте /dev/hdc2
Измените виды разделов /dev/hdc1 и /dev/hdc2 на вид "fd" для автозапуска raid.
Используя параметр failed-disk, создайте raidtab для необходимой конфигурации RAID1. Этот параметр (failed disk) должен быть последним в таблице.

# пример raidtab
# md0 - это корневой массив
raiddev                 /dev/md0
raid-level              1
nr-raid-disks           2
chunk-size              32
# Свободные диски для реконструкции данных "на-ходу"
nr-spare-disks          0
persistent-superblock   1
device                  /dev/hdc2
raid-disk               0
# это наш старый диск, временно пометим его как отказавший
device                  /dev/hda2
failed-disk             1

# md1 - это загрузочный /boot массив
raiddev                 /dev/md1
raid-level              1
nr-raid-disks           2
chunk-size              32
# Свободные диски для реконструкции данных "на-ходу"
nr-spare-disks          0
persistent-superblock   1
device                  /dev/hdc1
raid-disk               0
# boot также пометим сломанным
device                  /dev/hda1
failed-disk               1

Создаем, форматируем и настраиваем RAID

Создайте md-устройства следующими командами:
mkraid /dev/md0
mkraid /dev/md1

Raid-устройства должны быть созданы, и запущены. Изучите /proc/mdstat, там должны быть указаны виды raid-устройств, поддерживаемые ядром, а также список работающих raid-устройств.
Отформатируйте загрузочное и корневое устройства командами:
mke2fs /dev/md0
mke2fs /dev/md1
Подключите новое корневое устройство туда, куда удобно, создайте в нем каталог /boot и подключите туда загрузочный раздел:

    mount /dev/md0 /mnt
mkdir /mnt/boot
mount /dev/md1 /mnt/boot

Копируем текущую ОС на новое raid-устройство

Это достаточно просто и понятно.
cd /
# настройте скрипт для того чтобы это сделать
cp -a /bin /mnt
cp -a /dev /mnt
cp -a /etc /mnt
cp -a (все каталоги кроме /mnt, /proc, и сетевых дисков) /mnt
Процедура может усложниться, если вы подключили или сделали ссылки на другие диски к вашей корневой файловой системе. Пример, приведенный выше, предполагает простую систему, вам, возможно, придется немного изменить процедуру копирования.

Проверяем ваш новый RAID

Создайте загрузочный флоппи и запустите команду rdev для ядра.

    dd if=kernal.image of=/dev/fd0 bs=2k
rdev /dev/fd0 /dev/md0
rdev -r /dev/fd0 0
rdev -R /dev/fd0 1

Измените файл fstab на RAID-устройстве для отражения новых точек подключения, как указано ниже:
/dev/md0        /       ext2    defaults        1 1
/dev/md1        /boot   ext2    defaults        1 1

Отключите raid-устройства и перезагрузите систему, чтобы убедиться в том, что все работает правильно.
umount /mnt/boot
umount /mnt
raidstop /dev/md0
raidstop /dev/md1
shutdown -r now

Ваша RAID-система должна загрузиться и работать в сокращенном (degraded) режиме с загрузочным флоппи-диском. Аккуратно проверьте, что вы скопировали ВСЕ на вашу новую raid-систему. Если вы что-то на этом этапе напутаете без сохранения резервной копии, ВАМ БУДЕТ НЕСЛАДКО!
Если что-то не заработало, перезагрузите вашу старую систему, вернитесь и исправьте все, пока все не будет нормально.

Интегрируем старый диск в raid-массив

Удачное завершение процедур предыдущего пункта означает, что raid-массив работает, но пока без излишеств. Теперь надо переделать разделы старого диска (дисков) для того, чтобы добавить его в raid-массив. Запомните, если геометрии дисков разные, то размер раздела на старом диске должен быть равен или больше размеров raid-разделов, а иначе их нельзя будет добавить в raid-массив.

Переделайте нужным образом разделы на старом диске, например:
/dev/hda1     равен или больше /dev/hdc1
/dev/hda2     равен или больше /dev/hdc2
/dev/hda3     нечто, оставшееся под swap или что-то еще...
Смените параметр failed-disk в raidtab на raid-disk и добавьте новые (старые) разделы к raid-массиву, что называется "на ходу" (hot add).
raidhotadd /dev/md1 /dev/hda1
raidhotadd /dev/md0 /dev/hda2

В файле /proc/mdstat должны теперь появиться одно или более raid-устройств, перестраивающих данные для новых разделов. Через минуту или две...или несколько, raid-массивы должны быть полностью синхронизированы (эта процедура может занять длительное время для больших разделов).

Использование вышеописанной процедуры настроит загружаемый raid на новой raid-паре. Пользуйтесь загрузочным флоппи-диском, пока настраиваете и тестируете последний шаг.

Пример raidtab

Пример RAID1 описан в первых главах этого документа
df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/md0              19510780   1763188  16756484  10% /
/dev/md1                 15860       984     14051   7% /boot

# --------------------------

 fdisk -ul /dev/hda

Disk /dev/hda: 16 heads, 63 sectors, 39770 cylinders
Units = sectors of 1 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/hda1            63     33263     16600+  fd  Linux raid autodetect
/dev/hda2         33264    443519    205128   83  Linux native
/dev/hda3        443520  40088159  19822320   fd  Linux raid autodetect

# --------------------------

 fdisk -ul /dev/hdc

Disk /dev/hdc: 16 heads, 63 sectors, 39770 cylinders
Units = sectors of 1 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/hdc1            63     33263     16600+  fd  Linux raid autodetect
/dev/hdc2         33264    443519    205128   82  Linux swap
/dev/hdc3        443520  40088159  19822320   fd  Linux raid autodetect

# --------------------------

# md0 - это корневой массив, примерно 20 Гб
raiddev                 /dev/md0
raid-level              1
nr-raid-disks           2
chunk-size              32
# Свободные диски для реконструкции "на-ходу"
nr-spare-disks          0
persistent-superblock   1
device                  /dev/hda3
raid-disk               0
device                  /dev/hdc3
raid-disk               1

# md1 - это загрузочный массив, примерно 16 Мб
raiddev                 /dev/md1
raid-level              1
nr-raid-disks           2
chunk-size              32
# Свободные диски для реконструкции "на-ходу"
nr-spare-disks          0
persistent-superblock   1
device                  /dev/hda1
raid-disk               0
device                  /dev/hdc1
raid-disk               1

# --------------------------

# ГЛОБАЛЬНЫЙ РАЗДЕЛ
# устройство, содержащее каталог /boot
disk=/dev/md0
# геометрия
bios=0x80
sectors=63
heads=16
cylinders=39770
# подставная строка
partition=/dev/md1
# начало "диска" на устройстве
start=63

boot=/dev/hda
map=/boot/map
install=/boot/boot.b

image=/boot/bzImage
root=/dev/md0
label=LinuxRaid
read-only

# -------------------------

# ГЛОБАЛЬНЫЙ РАЗДЕЛ
# устройство, содержащее каталог /boot
disk=/dev/md0
# геометрия
bios=0x80
sectors=63
heads=16
cylinders=39770
# подставная строка
partition=/dev/md1
# начало "диска" на устройстве
start=63

boot=/dev/hdc
map=/boot/map
install=/boot/boot.b

image=/boot/bzImage
root=/dev/md0
label=LinuxRaid
read-only

Пример реализации RAID5 на SCSI

4-дисковый SCSI RAID5

 df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/md0              11753770   2146076   9000678  19% /
/dev/md1                 15739       885     14042   6% /boot

# --------------------------

 fdisk -ul /dev/sda

Disk /dev/sda: 64 heads, 32 sectors, 4095 cylinders
Units = sectors of 1 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/sda1            32     32767     16368   fd  Linux raid autodetect
/dev/sda2         32768    292863    130048    5  Extended
/dev/sda3        292864   8386559   4046848   fd  Linux raid autodetect
/dev/sda5         32800    260095    113648   82  Linux swap
/dev/sda6        260128    292863     16368   83  Linux native - test

# ------------------------

 fdisk -ul /dev/sdb

Disk /dev/sdb: 64 heads, 32 sectors, 4095 cylinders
Units = sectors of 1 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/sdb1            32     32767     16368   fd  Linux raid autodetect
/dev/sdb2         32768    292863    130048    5  Extended
/dev/sdb3        292864   8386559   4046848   fd  Linux raid autodetect
/dev/sdb5         32800    260095    113648   82  Linux swap
/dev/sdb6        260128    292863     16368   83  Linux native - test

# ------------------------

# fdisk -ul /dev/sdc

Disk /dev/sdc: 64 heads, 32 sectors, 4095 cylinders
Units = sectors of 1 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/sdc2            32    292863    146416    5  Extended
/dev/sdc3        292864   8386559   4046848   fd  Linux raid autodetect
/dev/sdc5            64    260095    130016   83  Linux native - development
/dev/sdc6        260128    292863     16368   83  Linux native - test

# ------------------------

 fdisk -ul /dev/sdd

Disk /dev/sdd: 64 heads, 32 sectors, 4095 cylinders
Units = sectors of 1 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/sdd2            32    292863    146416    5  Extended
/dev/sdd3        292864   8386559   4046848   fd  Linux raid autodetect
/dev/sdd5            64    260095    130016   83  Linux native - development
/dev/sdd6        260128    292863     16368   83  Linux native - test

# --------------------------

# raidtab
#
raiddev /dev/md0
raid-level      5
nr-raid-disks   4
persistent-superblock 1
chunk-size      32

# Свободные диски для реконструкции "на-ходу"
nr-spare-disks  0
device          /dev/sda3
raid-disk       0
device          /dev/sdb3
raid-disk       1
device          /dev/sdc3
raid-disk       2
device          /dev/sdd3
raid-disk       3

# загрузочный раздел
#
raiddev /dev/md1
raid-level      1
nr-raid-disks   2
persistent-superblock 1
chunk-size      32

# Свободные диски для реконструкции "на-ходу"
nr-spare-disks  0
device          /dev/sda1
raid-disk       0
device          /dev/sdb1
raid-disk       1

# --------------------------

# cat lilo.conf.sda
# ГЛОБАЛЬНЫЙ РАЗДЕЛ
# устройство, содержащее каталог /boot
disk=/dev/md0
# геометрия
bios=0x80
sectors=32
heads=64
cylinders=4095
# подставная строка
partition=/dev/md1
# начало "диска" на устройстве
start=32

boot=/dev/sda
map=/boot/map
install=/boot/boot.b

image=/boot/bzImage
root=/dev/md0
label=LinuxRaid
read-only

# ------------------------
# cat lilo.conf.sdb
# ГЛОБАЛЬНЫЙ РАЗДЕЛ
# устройство, содержащее каталог /boot
disk=/dev/md0
# геометрия
bios=0x80
sectors=32
heads=64
cylinders=4095
# подставная строка
partition=/dev/md1
# начало "диска" на устройстве
start=32

boot=/dev/sdb
map=/boot/map
install=/boot/boot.b

image=/boot/bzImage
root=/dev/md0
label=LinuxRaid
read-only

IDE RAID10 с initrd

RAID1 поверх полосатой пары RAID0.... диски на RAID0-массивах не совсем одинаковые, но близки по размерам.
/dev/md0 - это раздел /boot, автоматически запускаемый ядром
/dev/md1 и /dev/md3 - это два RAID0-массива автоматически запускаемые ядром
/dev/md2 - это корневой раздел, запускаемый initrd

df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/md2                118531     76485     35925  68% /
/dev/md0                  1917      1361       457  75% /boot

# ----------------------------

 fdisk -ul /dev/hda

Disk /dev/hda: 4 heads, 46 sectors, 903 cylinders
Units = sectors of 1 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/hda1            46      4231      2093   fd  Linux raid autodetect
/dev/hda2          4232    166151     80960   fd  Linux raid autodetect

# ----------------------------

 fdisk -ul /dev/hdb

Disk /dev/hdb: 5 heads, 17 sectors, 981 cylinders
Units = sectors of 1 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/hdb1            17     83384     41684   fd  Linux raid autodetect

# ----------------------------

 fdisk -ul /dev/hdc

Disk /dev/hdc: 7 heads, 17 sectors, 1024 cylinders
Units = sectors of 1 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/hdc1            17     84013     41998+  fd  Linux raid autodetect
/dev/hdc2         84014    121855     18921   82  Linux swap

# ----------------------------

 fdisk -ul /dev/hdd

Disk /dev/hdd: 4 heads, 46 sectors, 903 cylinders
Units = sectors of 1 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/hdd1            46      4231      2093   fd  Linux raid autodetect
/dev/hdd2          4232    166151     80960   fd  Linux raid autodetect

# ----------------------------

# raidtab
#
raiddev /dev/md0
raid-level      1
nr-raid-disks   2
persistent-superblock   1
chunk-size      8
device          /dev/hda1
raid-disk       0
device          /dev/hdd1
raid-disk       1

raiddev /dev/md1
raid-level      0
nr-raid-disks   2
persistent-superblock   1
chunk-size      8
device          /dev/hdd2
raid-disk       0
device          /dev/hdb1
raid-disk       1

raiddev /dev/md2
raid-level      1
nr-raid-disks   2
persistent-superblock   1
chunk-size      8
device          /dev/md1
raid-disk       0
device          /dev/md3
raid-disk       1

raiddev /dev/md3
raid-level      0
nr-raid-disks   2
persistent-superblock   1
chunk-size      8
device          /dev/hda2
raid-disk       0
device          /dev/hdc1
raid-disk       1

# ----------------------------

Содержимое файла linuxrc

 cat linuxrc
#!/bin/sh
# версия 1.02 2-22-00
#
############# настоящее НАЧАЛО 'linuxrc' ###############
#
# подключаем файловую систему /proc
/bin/mount /proc

# запускаем raid-1, сделанный из raid-0 массивов
/bin/raidstart /dev/md2

# выведем на консоль суть происходящего
/bin/cat /proc/mdstat

# Все нормально, позволяем ядру подключить /dev/md2
# заставляем ядро воспринимать /dev/md2 как корневую файловую систему
# Значение 0x900 - это номер устройства, рассчитанный, как
# 256*главное_число_устройства + зависимое_число_устройства
echo "/dev/md2 mounted on root"
echo 0x902>/proc/sys/kernel/real-root-dev

# отключаем /proc для освобождения памяти, выделенной устройству initrd
/bin/umount /proc
exit

# ----------------------------

Содержимое initrd

./bin/ash
./bin/echo
./bin/raidstart
./bin/mount
./bin/umount
./bin/cat
./bin/sh
./dev/tty1
./dev/md0
./dev/md1
./dev/md2
./dev/md3
./dev/md4
./dev/console
./dev/hda
./dev/hda1
./dev/hda2
./dev/hda3
./dev/hdb
./dev/hdb1
./dev/hdb2
./dev/hdb3
./dev/hdc
./dev/hdc1
./dev/hdc2
./dev/hdc3
./dev/hdd
./dev/hdd1
./dev/hdd2
./dev/hdd3
./dev/initrd
./dev/ram0
./dev/ram1
./dev/ram2
./dev/ram3
./dev/ram4
./dev/ram5
./dev/ram6
./dev/ram7
./etc/raidtab
./etc/fstab
./lib/ld-2.1.2.so
./lib/ld-linux.so.1
./lib/ld-linux.so.1.9.9
./lib/ld-linux.so.2
./lib/ld.so
./lib/libc-2.1.2.so
./lib/libc.so.6
./linuxrc
./proc

IDE RAID1-10 с initrd

Эта система создана из ассортимента старого и нового. Корневое устройство - это RAID1, созданный на основе одного RAID0-массива, из двух дисков разного размера и обычного дискового раздела большего размера. Подробное изучение файлов lilo.conf может вам в полной мере понять суть некоторых параметров.
/dev/md0 - это раздел с каталогом /boot, автоматически запускаемый ядром
/dev/md1 - это первая половина зеркального массива для md2, автоматически запускаемая ядром
/dev/hda3 - это вторая половина зеркального массива для md2
/dev/md2 - это RAID1 /dev/md1 + /dev/hda3, запускаемый initrd

df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/md2                138381     74421     56815  57% /
/dev/md0                  2011      1360       549  71% /boot

# ----------------------------

 fdisk -ul /dev/hda

Disk /dev/hda: 8 heads, 46 sectors, 903 cylinders
Units = sectors of 1 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/hda1            46      4415      2185   fd  Linux raid autodetect
/dev/hda2          4416     43423     19504   82  Linux swap
/dev/hda3         43424    332303    144440   83  Linux native

# ----------------------------

 fdisk -ul /dev/hdc

Disk /dev/hdc: 8 heads, 39 sectors, 762 cylinders
Units = sectors of 1 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/hdc1            39      4367      2164+  fd  Linux raid autodetect
/dev/hdc2          4368     70199     32916   82  Linux swap
/dev/hdc3         70200    237743     83772   fd  Linux raid autodetect

# ----------------------------

 fdisk -ul /dev/hdd

Disk /dev/hdd: 4 heads, 39 sectors, 762 cylinders
Units = sectors of 1 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/hdd1            39    118871     59416+  fd  Linux raid autodetect

# ----------------------------

# raidtab
#
raiddev /dev/md0
raid-level      1
nr-raid-disks   2
persistent-superblock   1
chunk-size      8
device          /dev/hdc1
raid-disk       1
device          /dev/hda1
raid-disk       0

raiddev /dev/md1
raid-level      0
nr-raid-disks   2
persistent-superblock   1
chunk-size      8
device          /dev/hdc3
raid-disk       0
device          /dev/hdd1
raid-disk       1

raiddev /dev/md2
raid-level      1
nr-raid-disks   2
persistent-superblock   1
chunk-size      8
device          /dev/md1
raid-disk       1
device          /dev/hda3
raid-disk       0

# ----------------------------

 cat linuxrc
#!/bin/sh
# версия 1.02 2-22-00
#
############# настоящее НАЧАЛО 'linuxrc' ###############
#
# подключаем файловую систему /proc
/bin/mount /proc

# автозапуск раздела с каталогом /boot и raid0
/bin/raidstart /dev/md2

# выведем на консоль суть происходящего
/bin/cat /proc/mdstat

# Все нормально, позволяем ядру подключить /dev/md2
# заставляем ядро воспринимать /dev/md2 как корневую файловую систему
# Значение 0x900 - это номер устройства, рассчитанный, как
# 256*главное_число_устройства + зависимое_число_устройства
echo "/dev/md2 mounted on root"
echo 0x902>/proc/sys/kernel/real-root-dev

# отключаем /proc для освобождения памяти, выделенной устройству initrd
/bin/umount /proc
exit

# ----------------------------

Содержимое initrd.gz

./bin
./bin/ash
./bin/echo
./bin/raidstart
./bin/mount
./bin/umount
./bin/cat
./bin/sh
./dev/tty1
./dev/md0
./dev/md1
./dev/md2
./dev/md3
./dev/console
./dev/hda
./dev/hda1
./dev/hda2
./dev/hda3
./dev/hdc
./dev/hdc1
./dev/hdc2
./dev/hdc3
./dev/hdd
./dev/hdd1
./dev/hdd2
./dev/hdd3
./dev/initrd
./dev/ram0
./dev/ram1
./dev/ram2
./dev/ram3
./dev/ram4
./dev/ram5
./dev/ram6
./dev/ram7
./etc/raidtab
./etc/fstab
./lib/ld-2.1.2.so
./lib/ld-linux.so.1
./lib/ld-linux.so.1.9.9
./lib/ld-linux.so.2
./lib/ld.so
./lib/libc-2.1.2.so
./lib/libc.so.6
./linuxrc
./proc

# ----------------------------

 cat lilo.conf.hda
# ГЛОБАЛЬНЫЙ РАЗДЕЛ
# устройство содержащее каталог /boot
disk=/dev/md2
# геометрия
bios=0x80
cylinders=903
heads=8
sectors=46
# геометрия 2-го диска
# параметр BIOS будет аналогичный, потому что это все переместится на hda
#  cylinders=762
#  heads=8
#  sectors=39

# подставная строка
partition=/dev/md0
# начало "диска" на устройстве
start=46
# второе устройство
#  start=39

# У ядра 2.2.14, видимо есть кое-какие проблемы с распознаванием правильных IRQ
append = "ide1=0x170,0x376,12 ether=10,0x300,eth0 ether=5,0x320,eth1"

boot=/dev/hda
map=/boot/map
install=/boot/boot.b

initrd=/boot/initrd.gz

image=/boot/zImage
root=/dev/md2
label=LinuxRaid
read-only

# ----------------------------

 cat lilo.conf.hdc
# ГЛОБАЛЬНЫЙ РАЗДЕЛ
# устройство, содержащее каталог /boot
disk=/dev/md2
# геометрия
bios=0x80
#  cylinders=903
#  heads=8
#  sectors=46
# геометрия 2-го диска
# параметр BIOS будет аналогичный, потому что это все переместится на hda
cylinders=762
heads=8
sectors=39

# подставная строка
partition=/dev/md0
# начало "диска" на устройстве
#  start=46
# второе устройство
start=39

# У ядра 2.2.14, видимо есть кое-какие проблемы с распознаванием правильных IRQ
append = "ide1=0x170,0x376,12 ether=10,0x300,eth0 ether=5,0x320,eth1"

boot=/dev/hdc
map=/boot/map
install=/boot/boot.b

initrd=/boot/initrd.gz

image=/boot/zImage
root=/dev/md2
label=LinuxRaid
read-only