Ключевая проблема в том, что аппаратура не поддерживается дистрибутивом. В большинстве случаев выясняется, что самое свежее ядро поддерживает новое "железо" и, таким образом, апгрейд до нового ядра решает проблему. Но это сказка про курицу и яйцо, поскольку у вас еще нет работающей системы. В этой статье я, надеюсь, смогу уменьшить "головную боль", присущую подобным "проблемным" установкам, так что вы сможете быстрее справиться с возложенными на вас обязанностями. Дистрибутив, который я буду использовать в качестве примера -- 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
Теперь должно получиться перезагрузиться и насладиться плодами своих трудов!