Содержание


Обнаружение загрузочных ISO-образов для сервера IBM Powers

Comments

Серия контента:

Этот контент является частью # из серии # статей:

Следите за выходом новых статей этой серии.

Этот контент является частью серии:

Следите за выходом новых статей этой серии.

Потребность в начальной загрузке с CD-ROM (компакт-диск) возникла в середине 1990-х годов, когда операционные системы (в частности, Microsoft® Windows®) стали слишком большими, чтобы помещаться на дискетах. Стандарт ISO 9660, ISO 9660, в основе которого лежит спецификация 1994 года от компаний Phoenix Technologies и IBM, описывает, каким образом система BIOS может прочитать CD-ROM и выполнить процедуру начальной загрузки. Расширение стандарта ISO 9660 под названием El Torito является одним из широко используемых способов для описания формата данных информации начальной загрузки. Большая часть микропрограммного обеспечения Intel® соответствует спецификации El Torito.

Однако системы IBM® Power Systems™ не соблюдают рекомендаций стандарта ISO 9660 относительно этой процедуры начальной загрузки. Чтобы на сервере IBM Power® можно было загрузить ISO-образ, на носителе должен присутствовать файл с именем bootinfo.txt в каталоге с именем ppc. Этот файл содержит инструкции, которые микропрограммное обеспечение использует для загрузки образа.

Это различие может усложнить программные компоненты, которым приходится иметь дело с образами для нескольких архитектур, такие как диспетчеры виртуальных машин (например, Kimchi). В этой ситуации начальная загрузка образа методом проб и ошибок не является практически осуществимым вариантом. Монтирование образа может дать нам информацию о существовании файла /ppc/bootinfo.txt, однако процесс монтирования требует как минимум дискового пространства, равного по объему ISO-образу, и специальных полномочий, а также занимает заметное время. Одно из альтернативных решений состоит в том, чтобы прочитать ISO-образ "как есть", байт за байтом, и попытаться найти вышеупомянутый файл. Это вполне возможно, поскольку все ISO-файлы должны представлять собой реализацию файловой системы ISO9660, которая является стандартным способом для описания файлов на носителях. Это альтернативное решение рассматривается в оставшейся части этой статьи с примерами программного кода.

В следующем разделе описывается стандарт ISO 9660, который используется в любом ISO-файле вне зависимости от архитектуры. В последующих разделах рассказывается о том, каким образом можно обратиться к любому файлу в ISO-файле, следуя рекомендациям стандарта ISO 9660. Кроме того, в статье приведен пример программного кода на языке Python, а также проанализированы другие возможные варианты программного кода. В последнем разделе рассмотрены полученные результаты и изложено заключение.

Стандарт ISO 9660

Этот стандарт широко используется не только для дисков CD-ROM, но и для дисков DVD, дисков Blu-Ray и даже для флеш-накопителей. Хотя с точки зрения сегодняшних потребностей данный стандарт имеет серьезные ограничения (которые устраняются с помощью соответствующих расширений), в нем описывается довольно простой способ хранения данных на носителях и чтения данных с этих носителей.

Первые 32 килобайта ISO-файла, начиная с самого первого байта, помечаются как системная область (system area) и не используются. После системной области имеется несколько секторов (длиной по 2048 байтов), также называемых логическими блоками (logical block), которые описывают тома, представленные в образе. Каждый том имеет свой собственный тип и контент, однако все тома имеют одинаковую структуру.

Рисунок 1. Формат дескриптора стандартного тома согласно стандарту ISO 9660
Figure 1. Generic volume descriptor format in ISO 9660

Самыми важными дескрипторами тома являются дескриптор Primary Volume и дескриптор Boot Record Volume. Дескриптор Primary Volume содержит информацию о том, как читать остальную часть файловой системы, в том числе местоположение каталогов, количество секторов и т. д. Дескриптор Boot Record Volume сообщает системе BIOS о том, как следует запускать ISO-образ. В стандарте El Torito дескриптор Boot Record Volume содержит местонахождение загрузочного каталога Boot Catalog, который представляет собой индекс доступных загрузочных образов (образов начальной загрузки). Обратите внимание на возможность существования нескольких загрузочных образов на одном носителе, что и обуславливает необходимость такого индекса. Set Terminator Volume – это метка конца списка записей тома для ISO-файла.

Рисунок 2. Тома и загрузочный каталог согласно стандарту ISO 9660
Figure 2. ISO 9660 volumes and boot catalog

Нахождение файла в файловой системе ISO 9660

Как говорилось в предыдущем разделе, запись Primary Volume содержит информацию о файлах в данном ISO-образе, в частности, о размере и местоположении таблицы Path Table (таблица маршрутов). Эта таблица содержит список всех записей, существующих на данном носителе. Данные в этой таблице имеют следующий формат.

Рисунок 3. Модель Path Table
Figure 3. Path table Model
Figure 3. Path table Model

Поле "длина идентификатора каталога" (length of directory identifier) – это размер поля "идентификатор каталога" (directory identifier), которое в большинстве случаев представляет собой имя каталога. Второе поле содержит дополнительную информацию о каталоге и используется в некоторых расширениях стандарта ISO 9660. Поле "местоположение расширения" (location of extend) – это логический блок Directory Record, представляющий этот элемент. Поле "номер каталога для родительского каталога" (directory number of parent directory) – это указатель на логический адрес, который представляет родительский каталог. Поле "заполнитель" (padding) присутствует (и имеет значение "0"), если длина идентификатора каталога имеет нечетное значение. В противном случае оно отсутствует. Это гарантирует, что каждый элемент начинается с четного номера байта.

Элемента Path Table вполне достаточно, чтобы найти каталог в файловой системе ISO 9660, однако для того, чтобы найти определенный файл, нам нужно искать соответствующую запись каталога. Эта запись содержит всю информацию о каждом файле и подкаталогах в каталоге.

Рисунок 4. Модель Directory Record
Figure 4. Directory Record model
Figure 4. Directory Record model

В соответствии с задачами этой статьи нам нужно проанализировать следующие поля.

  • Поле "длина записи каталога" (length of directory record) – это размер данного элемента
  • Поле "флаги файла" (file flags) – этот байт представляет тип регистра (каталог sub, файл или скрытый файл). Обратите внимание, что один элемент может иметь более одного флага.
  • Поле "длина идентификатора файла" (length of file identifier) и поле "идентификатор файла" (file identifier) – позволяют прочитать имя файла/подкаталога
  • Поле "заполнитель" (padding) – присутствует, если длина записи представляет собой четное число

При наличии этой информации мы можем сформировать алгоритм для поиска файла /ppc/bootinfo.txt и установить, является ли данный ISO-образ загрузочным образом для сервера Power Systems.

Рисунок 5. Алгоритм поиска файла /ppc/bootinfo.txt
Figure 5. Algorithm that looks for the '/ppc/bootinfo.txt' file
Figure 5. Algorithm that looks for the '/ppc/bootinfo.txt' file

Обратите внимание, что этот алгоритм можно настроить на поиск любого файла – для этого следует осуществлять поиск файла в обратном порядке прохождения маршрута, просматривая все каталоги до тех пор, пока не будет достигнут каталог, содержащий искомый файл.

В следующем разделе эту концепцию можно увидеть в действии в примере программного кода, в котором мы открываем ISO-файл сервера IBM Power, чтобы проверить – является ли этот файл загрузочным.

Реализация на языке Python

Следующий код представляет собой работающий пример рассмотренных выше концепций. Этот Python-скрипт загружает ISO-файл, переданный в качестве параметра, и оценивает, является ли этот образ загрузочным для микропрограммного обеспечения Power Systems. Прочтите встроенные комментарии, чтобы понять поток операций. Этот пример представляет собой адаптацию патча, который я представил в проект Kimchi.

Сохраните содержимое в файле с именем detect_ppc_iso.py, а затем запустите этот файл на исполнение с помощью следующей команды..

$ python detect_ppc_iso.py <pc_iso>

В разделе Загрузка приведена ссылка на файл detect_ppc_iso.py.

Другие альтернативные варианты

Реализация, представленная в предыдущем разделе, открывает ISO-файл-образа и читает его содержимое байт за байтом, используя стандарт ISO 9660, чтобы найти загрузочный файл /ppc/bootinfo.txt для сервера Power Systems.

Альтернативным вариантом, дающим равносильный результат, являются библиотеки с открытым исходным кодом, способные читать ISO-файлы. В некоторых дистрибутивах Linux® с установленной утилитой cdrkit можно воспользоваться командой isoinfo для извлечения из ISO-файла соответствующей информации, в том числе информации о наличии файла начальной загрузки для микропрограммного обеспечения Power Systems.

Листинг 1. Отыскание файла /ppc/bootinfo.txt в ISO-образе с помощью команды isoinfo
$ isoinfo -i RHEL-7.0-20140507.0-Server-ppc64-dvd1.iso -d CD-ROM is in ISO 9660 format System id: PPC Volume id: RHEL-7.0 Server.ppc64 Volume set id: Publisher id: Data preparer id: Application id: GENISOIMAGE ISO 9660/HFS FILESYSTEM CREATOR (C) 1993 E.YOUNGDALE (C) 1997-2006 J.PEARSON/J.SCHILLING (C) 2006-2007 CDRKIT TEAM Copyright File id: Abstract File id: Bibliographic File id: Volume set size is: 1 Volume set sequence number is: 1 Logical block size is: 2048 Volume size is: 1512366 Joliet with UCS level 3 found Rock Ridge signatures version 1 found $ isoinfo -i /var/lib/libvirt/images/RHEL-7.0-20140507.0-Server-ppc64-dvd1.iso -x /ppc/bootinfo.txt <chrp-boot> <description>Linux</description> <os-name>Linux</os-name> <boot-script>boot &device;:\ppc\chrp\yaboot</boot-script> (...)

Первая команда читает дескриптор Primary Volume ISO-образа и извлекает содержащуюся в нем информацию. Вторая команда ищет файл /ppc/bootinfo.txt и выводит дамп его содержимого на стандартное устройство вывода.

Хотя использование команды isoinfo или любого другого альтернативного варианта может оказаться более простым вариантом, этот вариант требует обязательной установки дополнительных пакетов в операционной системе и порождает будущую зависимость от этих пакетов. Если ваше программное обеспечение не использует в широких масштабах возможности манипулирования ISO-образами, которые предлагают эти библиотеки, то задачу проверки ISO-файла на возможность загрузки на сервере Power Systems вполне может выполнять программный код из предыдущего раздела. Этот код работает во многих операционных средах и на многих платформах и зависит лишь от базовых библиотек языка Python.

Заключение

В статье были описаны различия в процессе начальной загрузки ISO-образов для платформ Intel® и IBM POWER® и кратко объяснено, как найти соответствующий файл в файловой системе ISO 9660. Кроме того, в статье был представлен работающий программный код для демонстрации этих концепций. И, наконец, было представлено потенциально возможное альтернативное решение, однако этому решению требуются библиотеки и ресурсы, которые могут оказаться недоступными.

Из приведенного рассмотрения можно сделать следующий вывод: для программного обеспечения, которое широко использует ISO-образы в исходных данных, рекомендуется применение сторонней библиотеки или стороннего программного обеспечения. Для других задач (таких как проверка ISO-образа на пригодность для загрузки) вполне можно обойтись минималистической реализацией протокола ISO 9660, преимуществом которой является отсутствие зависимостей от сторонних библиотек. Такая возможность реализована в проекте Kimchi.


Ресурсы для скачивания


Комментарии

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux
ArticleID=1024628
ArticleTitle=Обнаружение загрузочных ISO-образов для сервера IBM Powers
publish-date=10202014