Процесс загрузки QNX делится на два этапа, во время которых отрабатывают, соответственно, первичный загрузчик (который предлагает выбрать раздел) и вторичный, который предлагает выбрать вариант загрузки («Hit Esc for .altboot») – из файла /.boot, либо /.altboot.
Оба загрузчика довольно примитивны и не позволяют себя настроить, в частности, например, настроить моментальную загрузку, без ожидания каких-либо действий пользователя.
После создания загрузочной флэшки логично было бы попытаться свести время ее запуска к минимуму, тем более что в рабочей встроенной системе вряд ли кому понадобится выбирать с какого раздела загружаться или какой использовать образ.
Собственно, нам нужно сделать две вещи:
- Модифицировать или заменить первичный загрузчик, чтобы он не ждал выбора раздела для загрузки.
- Модифицировать вторичный загрузчик, чтобы он не ждал реакции пользователя на приглашение к выбору альтернативного загрузчика «Hit Esc for .altboot»
Первичный загрузчик
Роб Кертен в своей статье рекомендует заняться HEX-отношениями с первичным загрузчиком, т.е. отредактировать время ожидания пользователя. Однако, там же написано, что этот вариант не является лучшим, потому как паузы не получится выставить в 0.
Другим вариантом, который выбрал я, стала установка альтернативного первичного загрузчика, например GRUB, архив скомпилированных под QNX6 бинарников которого давно есть в интернете.
Установка GRUB проходит легко и непринужденно.
Скачиваем архив в корневую, к примеру, папку системы и вводим несколько команд:
# cd /
# tar zxvf grub-0.95-qnx6-bin.tar.gz
Запускаем оболочку GRUB командой:
# /usr/local/sbin/grub
И инсталлируем загрузчик в МБР:
grub> root (hd0,0)
grub> setup (hd0)
Дальше нужно настроить загрузочное меню GRUB’а, которое описано в файле /boot/grub/menu.lst
По умолчанию, там написано следующее:
default=0
timeout=10
title QNX 6
root (hd0,0)
rootnoverify
makeactive
chainloader +1
title QNX 6 IFS image
root (hd0,0)
kernel /boot/grub/loadifs
module /boot/fs/qnxbasedma.ifs
Нам не нужны ни варианты загрузки, ни ожидание, ни вывод самого меню, поэтому приводим файл в такой вид:
default=0
timeout=0
hiddenmenu
title 630
rootnoverify (hd0,0)
chainloader +4
boot
Что все это значит можно прочитать в онлайн-документации.
Теперь можно попробовать загрузить систему и убедиться, что несколько секунд времени сэкономлено.
Переходим ко второй части.
Вторичный загрузчик
Самым простым способом избавиться от паузы вторичного загрузчика мне показался описанный в той же статье Кертена – прямое редактирование времени задержки в хекс-редакторе.
Снимаем дамп флэшки
# dd if=/dev/hd[X] of=/flashdump.bin
И открываем его в любом шестнадцатеричном редакторе.
Нужно найти, где располагается вторичный загрузчик. В моем дампе это был адрес 0х7Е00. Легче всего искать по тексту «Hit Esc for .altboot»
Дальше ищем адрес, указанный Кертеном:
0071 b9 24 00
Т.е., в моем случае, нас интересует последовательность байт b9 24 00 по адресу 0х7Е71.
Правим байт 0х7Е72, прописывая туда минимальное значение (0х01). Я, вдобавок, подправил и надпись «Hit Esc for .altboot», чтобы никто не думал, что здесь есть какое-то ожидание…
Сохраняем файл и переносим дамп обратно на флэшку:
# dd if=/flashdump.bin of=/dev/hd[X]
Проверяем целостность файловой системы:
# chkfsys –m /dev/hd[X]
И смотрим, как QNX грузится без каких-либо задержек и пауз.
В моем случае старт системы занял примерно 5 секунд.
5 секунд долго, а без графики?
Павел Сергеевич написал:
Без графики на секунду-две меньше.
На самом деле, только начальная загрузка платы занимает секунд 5, плюс сама система с момента начала работы загрузчика — так что, если считать с момента подачи питания, проходит где-то секунд 10.