Установка Linux на устройство, которое не поддерживается дистрибутивом

Автор: (C) Зване Мвайкамбо [Zwane Mwaikambo]
Перевод: (C) С. Скороходов


Я уверен, что подавляющему большинству системных администраторов время от времени приходиться сталкиваться с новым серверным оборудованием, которое не поддерживается последней версией их дистрибутива Linux. Обычно это не проблема, поскольку, если вы можете установить основу системы, то все остальное можно "прикрутить" после, когда система заработает. Единственным исключением является ситуация, когда не поддерживается устройство, на котором должен быть создан корневой раздел -- здесь и начинается настоящее веселье.

Ключевая проблема в том, что аппаратура не поддерживается дистрибутивом. В большинстве случаев выясняется, что самое свежее ядро поддерживает новое "железо" и, таким образом, апгрейд до нового ядра решает проблему. Но это сказка про курицу и яйцо, поскольку у вас еще нет работающей системы. В этой статье я, надеюсь, смогу уменьшить "головную боль", присущую подобным "проблемным" установкам, так что вы сможете быстрее справиться с возложенными на вас обязанностями. Дистрибутив, который я буду использовать в качестве примера -- Red Hat 7.1 (далее называемый RH7.1), а устройство, на котором предполагается создать корневой раздел -- хост-адаптер RAID-массива Adaptec 2100. Естественно, я попытаюсь так обобщить предлагаемые советы, что их будет можно приспособить практически для любого "неподдерживаемого" устройства (например, для контроллеров IDE RAID или других SCSI HBA) и других дистрибутивов.

С RH7.1 поставляется ядро 2.4.2-2: оно основано на kernel-2.4.2-ac с дополнительными "пачами" от Red Hat. Для работы на Adaptec 2100 требуется ядро 2.4.10-ac1. Я рекомендую ядра "-ac", поскольку Алан Кокс (с целью тестирования) включает в свои ядра множество экспериментальных драйверов и, таким образом, они поддерживают всевозможные новые "железки" задолго до "основного" ядра от Линуса, в которое эти обновления включаются позже. Для сборки ядер вам потребуется вспомогательная Linux-система, на которой будет выполняться компиляция (вам, возможно, захочется снять с мозгов накопившуюся ржавчину с помощью чтения kernel-HOWTO:) и будут создаваться загрузочные диски. Сообщения от "ядерного кольца" в dmesg могут оказаться полезной подсказкой при подготовке образа ядра для загрузочного диска. Как говорится, размер имеет значение, поскольку наша задача -- суметь вставить образ нового ядра в то самое место, которое занимает старое, "люфт" невелик, так что выбирать нужно "тщательнее". Ниже приводится грубая прикидочная конфигурация с моими пояснениями (некоторые фрагменты для простоты опущены).

CONFIG_X86=y
CONFIG_ISA=y
CONFIG_UID16=y

# Необходимо для включения новых драйверов
CONFIG_EXPERIMENTAL=y
CONFIG_MODULES=y
CONFIG_MODVERSIONS=y
CONFIG_KMOD=y

# Выбор целевого CPU, SMP опускается,
# поскольку требует слишком много места
CONFIG_MPENTIUMIII=y

# Даже если у вас более 1G RAM,
# для установки всегда отключаем highmem
CONFIG_NOHIGHMEM=y

CONFIG_NET=y
CONFIG_PCI=y
CONFIG_PCI_GOANY=y
CONFIG_PCI_BIOS=y
CONFIG_PCI_DIRECT=y

# Данная опция просто раздувает ядро,
# при установке она не нужна
# CONFIG_PCI_NAMES is not set
CONFIG_SYSVIPC=y
CONFIG_SYSCTL=y
CONFIG_KCORE_ELF=y
CONFIG_BINFMT_ELF=y
CONFIG_BINFMT_MISC=y

# ACPI и APM не требуются даже для нормальной работы
# настольной системы и, соответственно, опускаются.
# CONFIG_PM is not set
# CONFIG_ACPI is not set
# CONFIG_APM is not set

# И параллельные порты пока тоже побоку...
# CONFIG_PARPORT is not set

CONFIG_BLK_DEV_FD=y
# Некоторым дистрибутивам при установке
# требуются loop-устройства
CONFIG_BLK_DEV_LOOP=y

# При установке почти всегда используются Initrd
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=4096
CONFIG_BLK_DEV_INITRD=y

CONFIG_PACKET=y
# CONFIG_PACKET_MMAP is not set
# CONFIG_NETLINK is not set
# CONFIG_NETFILTER is not set
# CONFIG_FILTER is not set
CONFIG_UNIX=y
CONFIG_INET=y

# У вас есть устройства IDE? У меня обычно таковые имеются.
# IDE cdroms
CONFIG_IDE=y
CONFIG_BLK_DEV_IDE=y
CONFIG_BLK_DEV_IDEDISK=y

# Добавим скорости, считывая по
# несколько секторов за раз
CONFIG_IDEDISK_MULTI_MODE=y
CONFIG_BLK_DEV_IDECD=y
CONFIG_BLK_DEV_IDEPCI=y
CONFIG_IDEPCI_SHARE_IRQ=y
CONFIG_BLK_DEV_IDEDMA_PCI=y
CONFIG_BLK_DEV_ADMA=y

# Это может понадобиться,
# если вы ставитесь на дополнительный контроллер
# CONFIG_BLK_DEV_OFFBOARD is not set

# DMA хорошо "срезает" время установки
# и "неспецифическую" проверку ошибок
CONFIG_IDEDMA_PCI_AUTO=y
CONFIG_BLK_DEV_IDEDMA=y
CONFIG_IDEDMA_AUTO=y

# Если у вас один из контроллеров IDE-RAID
# то эти опции нужно будет включить.
# CONFIG_BLK_DEV_ATARAID is not set
# CONFIG_BLK_DEV_ATARAID_PDC is not set
# CONFIG_BLK_DEV_ATARAID_HPT is not set

CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y
CONFIG_SD_EXTRA_DEVS=40
CONFIG_SCSI_MULTI_LUN=y

# Выбираем только те драйверы нижнего уровня,
# которые требуются для установки.
# Например, я не включаю мою карту aic7xxx,
# поскольку к ней подключен только стример.
CONFIG_SCSI_DPT_I2O=y

# Не будем увеличивать размер ядра
# CONFIG_SCSI_DEBUG is not set

# требуется для нашего RAID-контроллера
# основанного на i2o
CONFIG_I2O=y
CONFIG_I2O_PCI=y
CONFIG_I2O_BLOCK=y
CONFIG_I2O_SCSI=y

# Драйверы сетевых карт нам пока ни к чему.
CONFIG_NETDEVICES=y

# Нам же нужно вводить куда-нибудь текст ;)
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
CONFIG_UNIX98_PTYS=y
CONFIG_UNIX98_PTY_COUNT=256

# Ограничиваемся установкой в текстовом режиме.
# CONFIG_MOUSE is not set
# CONFIG_PSMOUSE is not set
# CONFIG_82C710_MOUSE is not set
# CONFIG_PC110_PAD is not set

# Это подождет ;)
# CONFIG_QUOTA is not set

# Дистрибутивы, ставящиеся на ext3, могут потребовать
# эту опцию (относится и к Reiser), но старайтесь
# ограничиться небольшим числом файловых систем
# CONFIG_EXT3_FS is not set

# Некоторым дистрибутивам требуется msdos fs
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y

# Для доступа к CD-ROM с дистрибутивом
CONFIG_ISO9660_FS=y

# А это вообще-то нужно?
CONFIG_JOLIET=y

CONFIG_PROC_FS=y
CONFIG_DEVPTS_FS=y
CONFIG_EXT2_FS=y

# Обычные разделы на PC
CONFIG_MSDOS_PARTITION=y

# Возможно, это лишнее, но лучше не рисковать
CONFIG_NLS_DEFAULT="iso8859-1"

# Консольные драйверы
#
CONFIG_VGA_CONSOLE=y

# Пока без симпатяг-пингвинов :)
# CONFIG_FB is not set

# Если нет клавиатуры или мыши USB -- опускаем эту секцию
# CONFIG_USB is not set

По завершению компиляции ядра наступает время вставить новое ядро на место предыдущего, делается путем монтирования загрузочной дискеты установщика. Для этого требуется поддержка loopback устройств.

# cd /tmp
# cp /cdrom/boot/boot.img .
# mkdir bootdisk
# mount -t msdos boot.img bootdisk -o loop
# cp /usr/src/linux-2.4.10-ac11/arch/i386/boot/bzImage bootdisk/vmlinuz

rdev не требуется, поскольку syslinux передает нужное корневое устройство (например, initrd).

# umount bootdisk
# dd if=boot.img of=/dev/fd0

Сравниваем размеры ядер.

Исходное установочное ядро : 652k
Кастомизированное установочное ядро : 632k
Кастомизированное "нормальное" ядро : 951k

Понятно, что у нас не вышло бы втиснуть полнофункциональное ядро на загрузочную дискету.

Теперь у нас имеется новый инсталляционный диск с поддержкой нашего root-устройства. Используем его для запуска процедуры установки. Я рекомендую проводить установку в текстовом режиме, поскольку мы удалили поддержку фреймбуфера и мыши для минимизации размера ядра. По завершении система будет установлена на корневое устройство, но она не сможет с него загрузиться. Причина -- инсталлятор установил "ядерные" пакеты из дистрибутива, а не то ядро, которое использовалось во время установки. Возвращаемся на вспомогательную машину и создаем загрузочную дискету.

# rdev bzImage /dev/sda1
# dd if=bzImage of=/dev/fd0

(Вместо /dev/sda1 укажите ваше корневое устройство).

По готовности загружаемся в консоль, распаковываем тарбол с новым ядром на целевой компьютер (или сервер) и конфигурируем по необходимости. Можно взять конфиг из дистрибутива и построить новое ядро на его основе:

# cd /usr/src/linux-2.4.10-ac11
# cp /home/zwane/config-2.4.2-2 .config
# make oldconfig

Отвечайте на задаваемые вопросы, а затем пройдитесь по menuconfig для проверки конфигурации перед компиляцией:

# make menuconfig
# make dep bzImage modules modules_install

Копируем полученный образ ядра туда, куда требуется (например, в /boot/vmlinuz) и правим конфигурацию lilo (шаг пропускается, если вы пользуетесь grub'ом ;). Вам придется выполнить последний rdev на ваше новое ядро, поскольку сборочный процесс ядра "определяет" текущее корневое устройство во время компиляции и "прописывает" его во все ядра, собираемые в данной сессии. Альтернатива: изменить Makefile верхнего уровня (например, /usr/src/linux-2.4.10-ac11/Makefile) и изменить ROOT_DEVICE в соответствии с моментом.

# rdev /boot/vmlinuz /dev/sda1

Теперь должно получиться перезагрузиться и насладиться плодами своих трудов!


Зване Мвайкамбо [Zwane Mwaikambo]

Пока не началась учеба в университете (где-то в 2002 году), Зване работает сетевым и системным администратором у одного из швейцарских ISP (Realnet). Дни на пролет он скачет от одного маршрутизатора к другому, а по ночам "хачит" Свободно Распространяемое Программное Обеспечение. И еще он, кажется, кто-то там в швейцарском LUG'е(?).


Copyright (C) 2001, Zwane Mwaikambo.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 73 of Linux Gazette, December 2001

Команда переводчиков:

Владимир Меренков, Александр Михайлов, Иван Песин, Сергей Скороходов, Александр Саввин, Роман Шумихин