Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #134, ФЕВРАЛЬ 2010 г.

Магия загрузки. Умный Gujin, новаторский netboot.me и ванильный boot.kernel.org

Максим «hatchet» Полевой, maks.hatchet@yandex.ru


Скажи, как ты относишься к тому, чтобы обзавестись бутлоадером, который не требует настройки и умеет самостоятельно искать ОС на твоем жестком диске? А как тебе идея загрузки всегда свежей версии ОС через интернет, без необходимости ее установки, обновления и восстановления в случае сбоя? Заманчиво? Тогда читай дальше, твоему вниманию будет представлен умный загрузчик Gujin, а также онлайновые сервисы netboot.me и boot.kernel.org.

Gujin. Умный зверь

LiLo дал Linux возможность быть загруженным, Grub позволил избавиться от необходимости перезаписи загрузчика после изменения конфигурационного файла, а Gujin (http://gujin.sourceforge.net) не требует ни перезаписи загрузчика, ни конфигурационного файла. Ключевая особенность этого загрузчика - автоматический анализ разделов и файловых систем в поисках Linux-ядер, образов загрузочных дисков (*.bdi) и ISO-образов без необходимости ручной настройки.

Фактически Gujin вообще не имеет конфигурационного файла. Все, что нужно сделать для добавления нового ядра в загрузочное меню - просто скопировать его в каталог /boot. Всю остальную работу загрузчик сделает во время своей инициализации. При этом, если помимо Linux в твоей системе есть и другие ОС - они также будут добавлены в меню.

Кроме жесткого диска, Gujin может быть установлен на самые разные накопители, такие как флоппи-диски, USB-брелки, CD-ROM, SD-карты. Особая версия загрузчика существует для операционной системы DOS. Gujin умеет напрямую загружать файлы ELF32 и ELF64, сжатые gzip, понимает такие файловые системы, как FAT12, FAT16, FAT32, ext2, ext3, ext4 (с постоянным размером inode) и ISO 9660. Он способен загрузить операционную систему практически с любого накопителя, даже будучи неустановленным на нем (например, загрузить ОС с USB-накопителя после загрузки с жесткого диска).

Автор загрузчика прикладывает все усилия, чтобы его детище оставалось максимально совместимым с самыми разными операционными системами. Во-первых, Gujin почти все время работает в реальном режиме процессора, благодаря чему не теряет возможности передавать управление другим загрузчикам, которые ожидают точку вхождения в реальном режиме, а также передавать управление загружаемым CD/DVDROM-образам и отвечать на неизвестные прерывания BIOS. Во-вторых, Gujin не пытается установить страничный режим памяти, так как это работа ядра: 64-битные ELF-файлы должны поддерживать трансляцию с 32-х на 64 бита собственными силами. В-третьих, даже после перехода в защищенный режим Gujin не активирует прерывания: это опять-таки должно делать ядро.

Gujin распространяется в виде исходных текстов и собранных пакетов почти для всех дистрибутивов Linux; получить их можно на страничке http://sourceforge.net/projects/gujin/files. Дистрибутивные пакеты предварительно упакованы в tar.gz-архивы, поэтому перед установкой их придется извлечь:

$ tar -xzf debian32.tar.gz
$ sudo dpkg -i gujin_2.7_i386.deb

После окончания установки в каталоге /sbin появится исполняемый файл gujin, с помощью которого производятся все манипуляции с загрузчиком, каталог /usr/share/doc/gujin/ с документацией, man-страница и «вторая голова» загрузчика /boot/gujin.ebios. Уже на этом этапе работоспособность Gujin можно проверить, просто перезагрузив машину. Если желания перезагружать машину нет, просто установи qemu и выполни команду:

$ sudo qemu /dev/sda

На экране ты должен увидеть меню загрузчика и список операционных систем на выбор. Клавиши <F1-F12> предназначены для выбора вариантов загрузки, клавиши «+» и «-» позволяют изменить разрешение экрана, клавиша «точка» переводит загрузчик в текстовый режим и обратно, клавиши «/» и «*» изменяют количество цветов, пробел открывает меню настроек. В идеале должна работать еще и мышь, но в qemu она почему-то отказывается фурычить.

Меню настроек позволяет контролировать многие аспекты поведения и внешнего вида загрузчика. Такие как информация, отображаемая в меню выбора ОС, опции графического режима (например, активация режима VESA), области поиска ядер и загрузочных дисков (например, ISO-образы, CD-ROM, флоппи-диски, скрытые разделы), активация джойстика (!) и многое другое. Включая и такой пункт, как удаление Gujin и восстановление прежнего загрузчика. Изменения будут сохранены.

Командный интерфейс Gujin достаточно прост и включает в себя:

1. Установку загрузчика на выбранное устройство:

$ sudo gujin /dev/sda

Устройством может быть и USB-брелок, и простой файл.

2. Получение информации о наличии загрузчика на выбранном устройстве:

$ sudo gujin --report /dev/sda

Кроме имени установленного загрузчика, на экран будет выведена масса другой диагностической информации.

3. Удаление gujin и восстановление предыдущего загрузчика:

$ sudo gujin --remove /dev/sda

С помощью Gujin легко создавать весьма нестандартные конфигурации для загрузки ОС с самых разных носителей. Например, ты можешь разместить «вторую голову» загрузчика в нужном тебе каталоге, просто выполнив команду:

$ sudo gujin /каталог/gujin.ebios

Или расположить первую и вторую головы gujin на разных жестких дисках:

$ sudo gujin --mbr-device=/dev/sda /mnt/sdb/boot/gujin.ebios

Причем расширение .ebios указывает на метод, который будет использовать первая голова gujin для загрузки второй. Возможные варианты: bios, ebios, idechs, idelba, and idel48.
Gujin даже может проверить твой флоппи-диск на битые сектора и пересоздать файловую систему в случае их наличия:

$ sudo gujin --full /dev/fd0

После этого на флоппи-диске останется поместить дистрибутив и/или ядро и образ initrd в каталог /boot. Чтобы Gujin не выводил почем зря меню, используй флаг '-t' во время установки загрузчика.
Для установки Gujin на USB-брелок достаточно выполнить:

$ sudo gujin --mbr /dev/sdc

На устройстве будет создан один раздел с файловой системой FAT12/16/32 в зависимости от размера. В случае наличия таблицы разделов команда вернет ошибку, а флешку придется очистить с помощью команды dd:

$ sudo dd bs=512 count=64 if=/dev/zero of=/dev/sdc

Не каждый BIOS сможет использовать USB-накопитель с таблицей разделов для загрузки операционной системы. Поэтому предпочтительнее отформатировать флешку в так называемом формате superfloppy, при котором она будет представлять собой один большой раздел (без таблицы разделов):

$ sudo gujin --disk=BIOS:0x00,auto /dev/sdc

Gujin можно использовать для создания загрузочных CD (расширение El-Torito). Для этого подготовь с помощью mkiso или другой программы ISO-образ с нужным тебе дистрибутивом (конечно, его придется немного допилить) и выполни команду:

$ gujin image.iso

Команда изменит первые 512 байт файла и допишет в его конец небольшой FAT-раздел, содержащий вторую голову загрузчика. После файл можно записать на диск или USB-флешку. Опция '-t' сработает и в этом случае.
С помощью не менее простой команды ты легко превратиim Gujin в DOS-программу, которую сможешь использовать для загрузки Linux из DOS:

$ gujin boot.exe

Gujin. Выводы

На моей машине Gujin отработал идеально. Все, что понадобилось сделать - установить пакет и перезагрузить машину. Меню содержало все найденные ядра, а сам загрузчик благополучно отдавал управление ОС. Учитывая, что Gujin способен искать не только ядра, но и MBR-записи, ISO-образы, другие ОС на жестких дисках, USB-брелках, флоппи-дисках, и при этом сам благополучно загружается со всех этих устройств, осмелюсь предположить, что на сегодня это самый продвинутый и простой в использовании бутлоадер. Поэтому я буду вспоминать о нем каждый раз, когда мне понадобится организовать нестандартную схему загрузки чего-либо.

Сетевой загрузчик

Хотел бы иметь флешку, содержащую множество самых разных Linux-дистрибутивов и различных диагностических утилит, которые находились бы в актуальном состоянии в любой момент времени? Скажешь, это невозможно? Отнюдь нет, создатели проекта netboot.me предлагают скачать образ такой флешки весом меньше одного мегабайта.

Все просто: образ всего-навсего содержит сетевой загрузчик, который позволяет загрузить (и установить) ОС прямо из интернета, предлагая на выбор несколько вариантов дистрибутивов. Да, это очень медленный и «трафико-затратный» способ, но он имеет массу достоинств:

  1. Возможность экспериментировать с несколькими ОС и установить понравившуюся без дополнительных телодвижений (так или иначе тебе все равно придется выкачивать образы ОС из интернета).
  2. Сервис позволяет загрузить массу независящих от ОС утилит (вроде memtest86). Они всегда будут под рукой, а их загрузка займет секунды.
  3. Возможность организации массовой установки на множество машин. Можно установить собственный приватный сервер загрузки (об этом ниже).
  4. Сервис может быть использован для загрузки бездисковых рабочих станций. Загрузчик можно записать прямо в BIOS, благодаря чему бездисковые терминалы, не имеющие возможности загружать ОС с носителей, смогут загрузить ОС прямо из интернета.

В основе netboot.me лежит загрузчик gPXE (http://etherboot.org/wiki), созданный для обеспечения возможности сетевой загрузки машин, не имеющих поддержки PXE. В отличие от PXE, располагающегося в памяти сетевого адаптера, загрузчик gPXE может быть записан на жесткий диск, флоппи-диск, USB-флешку и поддерживает дополнительный набор сетевых протоколов, таких как FTP, HTTP и NFS. После загрузки gPXE запрашивает меню операционных систем у сайта netboot.me и отдает управление пользователю.

Кроме всего прочего, netboot.me позволяет добавлять в меню загрузчика собственные пункты. Для этого необходимо оставить на сайте пути к собственным kernel и initrd и прописать необходимые опции. Если конфигурация понравится администраторам сервиса, она будет добавлена в меню.

На данный момент netboot.me предлагает три образа gPXE-загрузчика: для записи на USB-брелок, флоппи-диск и CD. Чтобы воспользоваться его возможностями, достаточно выполнить ряд простых действий:

1. Скачать gPXE-загрузчик.

2. Записать его на носитель:

$ sudo dd if=netbootme.dsk of=/dev/fd0 // Флоппи-диск
$ sudo dd if=netbootme.usb of=/dev/sdf // USB-брелок

3. Загрузиться с носителя.

В случае статической настройки сети тебе придется указать свои сетевые реквизиты, но если сетью управляет DHCP-сервер, все заработает «из коробки».

4. Выбрать операционную систему для загрузки/установки. Сейчас поддерживается установка следующих ОС:

  • Debian Lenny (5.0).
  • Debian Testing.
  • Fedora 11.
  • OpenSUSE 11.1.
  • Ubuntu Jaunty (9.04).
  • Ubuntu Karmic (9.10).
  • FreeBSD 7.2.
  • MirOS bsd4me current (создана на базе Open и NetBSD, www.mirbsd.org).

В виде загружаемых по Сети LiveCD доступны:

  • Tiny Core Linux 2.2.
  • Micro Core Linux 2.2.
  • MirOS bsd4me current.

Также доступны следующие инструменты:

  • Тестеры памяти Memtest 86 и Memtest 86+.
  • Утилита для показа информации о железе HDT 0.3.4.
  • Мини-дистрибутивы для работы с накопителями GParted Live 0.4.5-2 и Parted Magic 4.5.
  • Спасательные образы Ubuntu Jaunty (9.04) x86 rescue и Ubuntu Karmic (9.10) x86 rescue.
  • Загрузчик Smart Boot Manager.

Кроме всего перечисленного, в наличии имеется игра nethack и система меню сервиса boot.kernel.org. Сервис boot.kernel.org (или сокращенно BKO) представляет абсолютно идентичную netboot.me функциональность. Он использует тот же gPXE и предлагает собственный вариант загрузочного меню, содержащий дистрибутивы:

  • Debian live.
  • Ubuntu 9.04.
  • Damn Small Linux.
  • Knoppix 5.0.1.
  • Fedora 11 Live CD.

Цель проекта: распространение загрузочных образов систем диагностики, инсталляторов дистрибутивов и LiveCD, тестирование экспериментальных версий ядра.

Собственная конфигурация и сервер сетевой загрузки

Выше я уже упоминал о том, что netboot.me позволяет добавлять в сервис собственную конфигурацию для загрузки. Для этого необходимо залить ядро и образ initrd (дистрибутив должен быть в нем) на какую-нибудь сетевую машину с белым адресом, войти на сайт netboot.me (регистрация не требуется, сервис использует аккаунты google для управления пользователями), перейти по ссылке «MY CONFIGS», нажать на ссылку «new». В появившемся поле ввести имя новой конфигурации, описание, указать адрес ядра в поле «Kernel/Image», адрес initrd-образа в поле «Initrd» и необходимые аргументы ядра в поле «Args».

После того, как конфигурация будет создана, в поле «Chainload URL» появится ее адрес, последним элементом которого будет ID конфигурации, — его необходимо запомнить. При следующей загрузке с помощью netboot.me нажми любую клавишу после появления строки «Press any key for options or wait n seconds». Выбери опцию «Boot a configuration directly» и введи ID своей конфигурации.

В отличие от netboot.me, сервис boot.kernel.org не позволяет создавать собственные конфигурации, зато он полностью открыт. А это значит, что всю используемую ими платформу сетевой загрузки можно скачать и установить на свой сервер. Попробуем так и сделать.

Для начала установим инструменты сборки, систему управления версиями git и ассемблер nasm:

$ sudo apt-get install build-essential git-core nasm

Затем получим исходные тексты системы BKO:

$ git clone git://git.etherboot.org/scm/people/pravin/BKO.git
$ cd BKO
$ git submodule init
$ git submodule update

Отредактируем конфигурационный файл config так, чтобы опция BASE_URL содержала URL, по которому будет доступен BKO (он будет вшит в gpxe), а опция ISO_LOCATION_LOCAL - URL ISO-образов дистрибутивов (сделаем его равным BASE_URL/ISO).

Теперь запускаем процесс сборки gpxe и всех остальных компонентов BKO:

$ make
$ cd install_help
$ ./configure_BKO.sh

Скачаем модифицированные образы initramfs поддерживаемых дистрибутивов и их ISO-образы:

$ ./download_initramfs_images_http.sh
$ ./download_ISO.sh

Все, осталось только перенести содержимое каталога BKO в корень веб-сервера (например, /var/www) и выставить на файлы корректные права доступа.

Полезные опции командной строки Gujin

  • --bootdir=каталог - дополнительный каталог для поиска ядер и загрузочных образов.
  • --cmdline="" - опции Linux-ядра.
  • -f, --full - проверка на сбойные сектора перед запуском операций с накопителем.
  • --mbr-device=устройство - записать MBR на указанное устройство.
  • --quickboot=число - количество секунд, по прошествии которых начинает загружаться ОС (в случае, если найдена только одна ОС).
  • --default_ide_password=пароль - пароль для доступа к залоченному IDE-диску.
  • --default_video_mode=номер - дефолтовый VESA-режим для меню (номера режимов можно посмотреть, нажав <Tab> в меню загрузчика).
  • -d=, --disk=DOS|BCD|PIC|FLOPPY|IDE|BIOS|EBIOS ... - метод доступа к диску во время поиска второй головы загрузчика (полезно для устаревших материнок или сбойных BIOS'ов).
  • -COM[1-4][,<9600>[,<n>[,<8>[,<1>]]]]], --serial=COM[1-4]... - последовательный порт для доступа к меню загрузчика вместо экрана.

Ограничения Gujin

  • 15 ISO-образов на раздел.
  • Каждый образ ISO должен состоять максимум из 127 фрагментов.
  • Медленная загрузка ISO на ext2/ext3.
  • Большинство LiveCD не поддерживается из-за того, что образы ядра имеют нестандартные названия и расположены не в каталогах / и /boot.
  • Нередко Gujin не может определить параметры загрузки ядра для большинства LiveCD, потому что они заданы не при сборке, а в опциях собственного загрузчика.

Проблема загрузки netboot.me и BKO

На некоторых машинах загрузочные диски netboot.me и boot.kernel.org могут отработать неправильно, в результате чего ты не увидишь загрузочное меню и не сможешь произвести выбор ОС. Причина в установке загрузчиком неподдерживаемого видеоадаптером режима. Исправить ситуацию пока нельзя, но ты можешь воспользоваться режимом командной строки (комбинация <Ctrl+B>) для ручной загрузки нужной конфигурации.

WARNING

По умолчанию Gujin ищет ядра, образы загрузочных дискет (*.bdi) и ISO-образы в каталогах / и /boot. Чтобы научить загрузчик искать файлы и в других каталогах, необходимо использовать опцию «--bootdir=/путь/до/каталога» во время установки загрузчика.

Содержание