В основном этот документ относится к ОС linux, причем желательно
использовать дистрибутив не менее RedHat 7.3 (там хорошо реализована работа USB).
Желательно уметь пересобирать ядро системы, хотя это не обязательно.
Чтобы успешно решить поставленную задачу, необходимо чётко представлять процесс загрузки системы:
- стартует загрузчик прописаный в MBR flash
- далее грузится ядро системы
- загрузчик, исходя из геометрии диска находит и загружает образ корневой файловой системы (initrd). Образ размещается в /dev/ram1, это устройство прописывается как корень и управление передаётся в файл /linuxrc. Именно из этого файла осуществляется подгрузка необходимых драйверов scsi или raid. Сами драйверы в виде модулей так же распологаются в initrd.
По структуре initrd это запакованный образ дискеты ёмкостью 2.8 MB, файловая система fat12 или ext2. - файл загрузки linuxrc после подгрузки модулей передают в систему параметры реальной файловой системы и меняет на неё корень посредством команды pivoot_root.
- Дальнейшая загрузка продолжается стандартным образом с вашей реальной файловой системы.
#mkinitrd <файл назначения> <версия ядра>
Эта команда создаст для вас стандартный загрузочный образ. Обычно он расположен в /boot/initrd-<версия ядра>.img . Образ содержит минимальную root FS (file system), модули прописанные в /etc/modules.conf , а так же стартовый скрипт загрузки /linuxrc . Модули берутся из каталога /lib/modules/<версия ядра>.
#lilo -v
Установка загрузчика LILO согласно его конфиг файлу /lilo.conf
вот пример моего lilo.conf:
Код: Выделить всё
nowarn
lock
verbose=0
timeout=0
default=snap
disk=/dev/sda
bios=0x80
sectors=63
heads=255
cylinders=16
boot=/dev/sda
install=/boot/boot.b
message=/boot/message
map=/boot/map
linear
image=/boot/bzImage
label=snap
initrd=/boot/initrd
read-only
root=/dev/ram0
и пару скриптов для облегчения процесса создания и модификации файла initrd:
распаковываем содержимое образа /boot/initrd.img в каталог /initrd
Код: Выделить всё
cd /
umount /initrd
zcat /boot/initrd.img > /dev/ram1
mount -t ext2 /dev/ram1 /initrd
Код: Выделить всё
cd /
umount /initrd
mv /boot/initrd.img /boot/initrd.old
dd if=/dev/ram1 bs=1k count=2880 | gzip -9 > /boot/initrd.img
- проверяем наличие поддержки модулей в ядре
- проверяем наличие необходимых модулей поддержки USB, RAID, SCSI в /lib/modules/<версия_ядра> и их подключение из /etc/modules.conf
- создаём новый файл initrd
- распаковываем и контролируем скрипт загрузки, наличие модулей в initrd, вносим поправки по своему разумению. Мне потребовалось внести в загрузку паузу в 1 сек для нормальной инициализации USB flash. Для контроля посреди загрузки как точку останова можно поставить shell (/bin/sh). При добавлении команд в linuxrc не забудте проверить наличие соответствующих библиотек в том же образе (проверяется как #ldd <имя_файла>).
- пакуем подкорректированный initrd
По ней рекомендую почитать
http://www.linuxfromscratch.org/
http://www.damnsmalllinux.org/