Построение образа файловой системы
mkifs [-a суффикс] [-l строка_ввода] [-n[n]] [-r корневой_каталог] [-s раздел] [-v] [файл_построения_образа [файл_образа]]
0
(обнулить) ряд атрибутов для файлов, включаемых в образ. Обнуление атрибутов позволяет устранить влияние инструментальной системы на процесс создания образа и обеспечить воспроизводимость (идентичность) образов при одинаковых входных данных, в т.ч. при использовании утилиты mkifs
на разных инструментальных системах (Windows/Linux). Перечень атрибутов, подлежащих обнулению (зависит от формата использования данного параметра): -n
: метки времени (mtime
) только для inline-файлов (по умолчанию эти метки генерируются в процессе создания образа на основании текущего системного времени инструментальной системы) -nn
: метки времени (mtime
) для всех файлов, а также идентификаторы владельца (uid
) и группы (gid
). Для обеспечения воспроизводимости контрольной суммы образа без использования опции -nn рекомендуется явно задавать идентификаторы владельца и группы для файлов, включаемых в состав образа. Для этого необходимо задать атрибуты uid и gid с помощью опции -l "[uid=<знач> gid=<знач>]" (т.е. для всех файлов, входящих в состав загрузочного образа), либо явно в самом файле построения загрузочного образа (для всех файлов, для групп файлов или индивидуально). Пример: или Использование опции '-nn' приводит к игнорированию любых значений атрибутов uid и gid - как передаваемых с помощью опции -l , так и явно заданных в файле построения. |
MKIFS_PATH
, описание которой приведено далее в этом разделе. Если установлена опция -r, то утилита mkifs сначала выполняет поиск путей, в начале которых в качестве префикса вместо QNX_TARGET
указана переменная корневой_каталог, как в следующих случаях: все другие пути по умолчанию, также с префиксом корневой_каталогкорневой_каталог/${PROCESSOR}/sbin
все другие стандартные пути по умолчанию с префиксом${QNX_TARGET}/${PROCESSOR}/sbin
QNX_TARGET
. Структура путей по каталогам в корневом_каталоге должна в точности совпадать со структурой путей по умолчанию в QNX_TARGET
, но сам корневой_каталог может находиться по любому выбранному пути. Например, при необходимости добавления файла /dev/ppcbe/sbin/pci-ppc405
опцию следует указать следующим образом: Обратите внимание, что-r /dev
PROCESSOR
не добавляется в корневой_каталог. Если установлен параметр MKIFS_PATH , то утилита mkifs игнорирует опцию -r. |
GNU/Linux, Microsoft Windows
arm, armv7, aarch64, e2k, mips, ppc, x86
Утилита mkifs используется для создания файловой системы образа ОС на основе спецификаций файла построения образа.
Не следует путать эту команду с утилитой mkefs, которая создает встраиваемую файловую систему, или с утилитой mketfs, которая создает встраиваемую транзакционную файловую систему (ETFS). |
Синтаксис файла построения загрузочного образа детально рассмотрен в соответствующем разделе.
Файловая система данного типа поддерживает все основные атрибуты файла построения загрузочного образа:
а также ряд специальных атрибутов:
По умолчанию утилита mkifs удаляет отладочную информацию из исполняемых файлов, добавляемых в образ. Это позволяет уменьшить размер образа. Для сохранения этой информации укажите атрибут +raw. |
Как было упомянуто ранее, атрибут [+script] означает для утилиты mkifs, что указанный файл является файлом сценария, т.е. последовательностью команд, которые необходимо выполнить, когда запустится менеджер процессов.
Для запуска команды на момент выполнения сценария должен быть доступен соответствующий исполняемый файл. Исполняемый файл можно добавить в образ или получить его из файловой системы, запущенной до того момента, когда потребовался исполняемый файл. Второй подход позволяет получить образ меньшего размера. |
По большей части файлы сценариев выглядят как обычные сценарии командного интерпретатора за несколькими исключениями:
Файл сценария состоит из одной или нескольких строк, к каждой из которых применяется следующий синтаксис:
[модификаторы] [командная_строка [&]]
Модификаторы – это список элементов, разделенных пробелами и заключенных в квадратные скобки, которые изменяют способ запуска указанной командной_строки. Если после модификаторов указана командная строка, то они влияют только на эту командную строку. Если командная строка не указана, то модификаторы применяются ко всем последующим командным строкам.
Если указать после командной строки знак амперсанда (&), то программа запускается в фоновом режиме, при этом ОС не ожидает завершения программы до перехода к следующей строке сценария. |
Далее описаны модификаторы. Если модификаторы описаны как “булевы”, то для их установки или отмены используется знак плюс (+
) или минус (-
). Для остальных модификаторов используются параметры.
[argv0=uncompress] compress filename.Z
[cpu=0] my_program
Значение *
обеспечивает запуск процессов на всех процессорах:
[cpu=*] my_program
Если во время загрузки процессор с данным номером не обнаружен, то выводится предупреждающее сообщение и команда запускается без ограничения, определяемого процессорной маской.
В силу ограничений в записях загрузочного образа этот синтаксис позволяет указать только один ЦП, а не более общую процессорную маску. Для порождения процесса в пределах полностью заданной процессорной маски используется утилита on. |
display_msg сообщение
Вывод сообщения, следующего непосредственно после команды display_msg
. Эту команду целесообразно использовать при выполнении диагностики запуска системы. Часто применяется в качестве контрольной точки.
procmgr_symlink
Аналогична команде ln
-P, за тем исключением, что можно не указывать ln
.
reopen [имя_файла]
Перенаправление стандартных потоков ввода, вывода и ошибок в указанный файл. Временная приостановка интерпретации файла сценария до успешного выполнения stat() по указанному путевому имени. Имя файла по умолчанию: /dev/console
.
waitfor путевое_имя [время_ожидания]
Временная приостановка файла сценария до успешного выполнения stat() по указанному путевому имени. Часто используется для синхронизации, чтобы разрешить менеджеру ресурсов выполнить инициализацию, а затем перейти к дальнейшей интерпретации файла сценария. Дополнительный параметр время_ожидания задает максимальное время ожидания в секундах до появления файла. Это значение может иметь один знак после запятой, задающий десятые доли секунды. Значение по умолчанию – 5,0
секунд.
Модификатор +external дает утилите mkifs инструкцию искать указанную команду в файловой системе хоста, не используя внутреннее значение команды. Значение по умолчанию: -external.
Польза от использования модификатора +external сомнительна. Модификатор external будет лишним для команд, которые не являются внутренними. |
devc-con
с приоритетом 20
с диспетчеризацией FIFO укажите: [pri=20f] devc-con -n9 &
Значение по умолчанию для этого модификатора совпадает со значением по умолчанию для procnto
.
[+session] esh
При построении загружаемой файловой системы необходимо указать загрузочный файл с использованием атрибута physical или virtual. Следует помнить, что спецификация загрузочного файла должна располагаться в начале файла построения образа. Если первым символом загрузочного файла является открывающая квадратная скобка "[", то приводится список атрибутов конфигурации с тем же синтаксисом, что и для файла построения образа. Список атрибутов завершается закрывающей квадратной скобкой "]". Допустимые атрибуты и их форматы:
attr=атрибут_образа
Указать атрибут для добавления к образу. Эти атрибуты обрабатываются после опции командной строки -l («эль») и файла построения образа, но для атрибута_образа обычно используется префикс "?", чтобы предотвратить переопределение свойст, явно заданных опцией -l или файлом построения образа.
default_image=спецификация_адресного_пространства
Установить значение по умолчанию для атрибута файла image (см. выше).
default_ram=спецификация_адресного_пространства
Установить значение по умолчанию для атрибута файла ram (см. выше).
filter=спецификация_фильтра_образа
Запустить спецификацию_фильтра_образа после создания образа. Следующие коды форматирования расширены:
0x
. len=длина_загрузочной_записи
Параметр длина_загрузочной_записи определяет объем пространства, которое необходимо оставить перед файлом образа (перед фактической файловой системой образа) для сохранения сведений системного заголовка или кода префикса начальной загрузки. Это минимальный резервируемый объем пространства. Если код префикса начальной записи, следующий за атрибутами загрузочного файла, превышает заданное здесь значение, вместо него используется размер кода префикса начальной загрузки. Значение по умолчанию – 0
.
notloaded=длина
В некоторых системах (например, IBM OpenBIOS) сведения системного заголовка не загружаются в память и не добавляют смещение памяти, где хранится информация (базовый адрес образа устанавливается атрибутом image в файле построения образа). Этот атрибут определяет объем информации, незагружаемой в память. Значение по умолчанию – 0
.
paddr_bias=число
В некоторых ЦП (например, MIPS) аппаратное обеспечение резервирует диапазон виртуальных адресов, однозначно соответствующих физическим адресам. Этот атрибут информирует утилиту mkifs о способе преобразования виртуального адреса в соответствующий физический адрес в памяти по формуле:
phys_addr = виртуальный_адрес + число
Значение по умолчанию – 0
.
pagesize=размер
Установить размер страницы в файловой системе образа. Утилита mkifs выравнивает разные структуры до величины, кратной этому значению. Значение по умолчанию – 4
KB.
vboot=адрес
Иногда, при построении виртуальной системы, инициализация устройства подкачки страниц памяти осуществляется программой начальной инициализации startup
(например, в архитектуре x86), а не в ядре procnto
(как например, в архитектуре MIPS). В первом случае эта опция сообщает утилите mkifs, какой базовый виртуальный адрес следует использовать для исполняемых файлов во время начальной загрузки. Эта опция не влияет на построение физической системы. Адрес по умолчанию отсутствует.
Достигнув символа закрывающей квадратной скобки "]" после списка атрибутов загрузочного файла, утилита mkifs выполняет поиск строки boot. Если такая строка найдена, то утилита mkifs считает, что все данные, непосредственно следующие после нее и до конца файла, являются кодом префикса начальной загрузки. Эти данные помещаются в начало файла образа. Если был задан атрибут len и его величина превышает размер кода префикса начальной загрузки, размер файла образа дополняется до указанного размера.
В файле построения загрузочного образа можно задать фильтр образов и дополнительно указать для него макрорасширения. Сведения об этих макрорасширениях приведены выше в описании атрибута filter.
В настоящее время доступны следующие фильтры образов:
Спецификация компоновщика позволяет управлять формированием командной строки компоновщика, когда утилите mkifs необходимо преобразовать перемещаемый объект в исполняемый файл, запускаемый по определенному адресу. Во многом она используется аналогично строке формата printf(), при этом символы копируются из формата в командную строку, пока не будет найден символ процента (%). Поддерживаются следующие коды форматирования после символа процента:
Переменная | Значение |
---|---|
e | 0 — прямой порядок байт, 1 — обратный порядок байт |
d | 0 — прямой порядок байт |
f | 0 — файл запуска, 1 — файл начальной загрузки, 2 — обычный файл |
h | Адрес заголовка исполняемого файла |
m | Номер машины из заголовка ELF |
v | 0 — файл с физической связью, 1 — файл с виртуальной связью |
V | 0 — физическая система, 1 — виртуальная система |
Рассмотрим спецификацию команды компоновщика по умолчанию для mkifs:
static char default_linker[] = {"qcc"" -bootstrap -nostdlib -Wl,--no-keep-memory -Vgcc_nto""%(m==3,x86%)%(m==6,x86%)""%(m==8,mips%)""%(m==20,ppc%)""%(m==40,arm%)""%(m==42,sh%)""%(m!=3,%(m!=6,%(e==0, -EL%)%(e==1, -EB%)%)%)""%(h!=0, -Wl,-Ttext -Wl,0x%t%)%(d!=0, -Wl,-Tdata -Wl,0x%d%)"" -o%o %i""%[M -L%^i -Wl,-uinit_%n -lmod_%n%]"};
Значение указанных параметров приведено в описании gcc.
Образ, созданный утилитой mkifs, имеет следующую структуру:
startup
) и завершитель секции запуска присутствуют только в загружаемом образе.
startup
). Данная секция содержит код, который исправляет эту ситуацию. Если используется собственный код начальной загрузки (IPL), обеспечивающий перевод процессора в соответствующее состояние, необходимость в секции начальной загрузки отпадает. Хорошим примером, подтверждающим необходимость добавления сюда кода, является начальная загрузка на стандартном ПК x86. При загрузке ПК, этот код передает управление в 16
-битовом реальном режиме. Программа начальной инициализации (startup
) предполагает, что процессор работает в 32
-битовом защищенном режиме. Поэтому образ с загрузкой из BIOS ПК содержит код, переключающий процессор в 32
-битный защищенный режим. Этот код также выполняет серию вызовов BIOS для сбора информации из BIOS, поскольку программа запуска в защищенном режиме сама не может выполнять вызовы BIOS. startup
. Эти данные представляют собой набор структур (для получения дополнительной информации см. главу «Настройка начальных загрузчиков» в документе «Создание встраиваемых систем»). Если образ не является самозагружаемым, эта секция опускается. startup
. Этот код должен быть выполнен из ОЗУ. Если образ содержится в ПЗУ/флэш-памяти, то стандартный код начальной загрузки (стандартный IPL) использует информацию из заголовка секции запуска, чтобы скопировать программу начальной инициализации startup
в ОЗУ и передать ей управление. Если образ не является самозагружаемым, эта секция опускается. startup
. Если образ не является самозагружаемым, эта секция опускается. К исполняемым файлам в образе можно применить атрибуты code=copy|uip и data=copy|uip.
В настоящее время к разделяемым объектам применяются атрибуты code=uip и data=copy. Для обеспечения результата применения атрибута code=copy вручную скопируйте разделяемый объект в папку /dev/shmem и соответствующим образом задайте переменную LD_LIBRARY_PATH . Для экономии места в ПЗУ/флэш- памяти выполните сжатие разделяемых объектов в файловой системе образа и распакуйте его в каталог /dev/shmem . |
При запуске исполняемого файла эти атрибуты определяют необходимость выполнения кода или данных для этой исполняемой программы «на месте» или их копирования в ОЗУ. Файловая система образа может существовать либо в ОЗУ, либо в ПЗУ/флэш-памяти с линейной адресацией. Образы в ОЗУ обычно загружаются с устройства, на котором не поддерживается линейная адресация. К ним относятся начальная загрузка с диска, начальная загрузка по сети и начальная загрузка с устройств ПЗУ/флэш-памяти с коммутацией блоков памяти. К ним также относятся все сжатые образы.
Например, сжатый образ может находиться во флэш-памяти с линейной адресацией, но его невозможно использовать, пока он не будет распакован в ОЗУ. Для любого образа в ОЗУ существуют следующие комбинации:
Код | Данные | Комментарии |
---|---|---|
uip | uip | Однократное выполнение (по умолчанию) |
uip | copy | Многократное выполнение |
copy | uip | Однократное выполнение, неэффективное использование ресурсов |
copy | copy | Многократное выполнение, неэффективное использование ресурсов |
Значение по умолчанию предполагает, что требуется выполнить «на месте» и код, и данные. Такой способ подходит для исполняемых файлов, содержащих большое количество статических данных, которые необходимо выполнить только один раз (например, для менеджера ресурсов или драйвера, запускаемых при начальной загрузке системы). При выполнении данных «на месте» изменяется единственная копия данных программы, поэтому запустить программу повторно невозможно.
В этом случае sticky-бит файла не устанавливается. Это указывает менеджеру процессов на исполняемые файлы, менеджер процессов предотвращает повторный запуск программы и устраняет возможность запуска программы с поврежденными статическими данными. |
Поэтому для многократного запуска исполняемого файла необходимо задать атрибут data=copy.
Два случая, помеченные как «неэффективное использование ресурсов», не описаны в комбинациях, но они не предоставляют дополнительные возможности и неэффективно используют память, копируя в нее код без необходимости. Поскольку код доступен только для чтения и изменить его невозможно, то его в любом случае можно выполнить «на месте».
При создании образа в ПЗУ/флэш-памяти существуют следующие комбинации:
Код | Данные | Комментарии |
---|---|---|
uip | uip | Однократное выполнение |
uip | copy | Многократное выполнение (по умолчанию) |
copy | uip | Однократное выполнение |
copy | copy | Многократное выполнение (медленный доступ к ПЗУ/флэш-памяти) |
Для создания образа в ROM/FLASH необходимо указать значения для обоих атрибутов файла image и ram. В противном случае менеджер процессов считает, что образ находится в ОЗУ. Для образа в ПЗУ/флэш-памяти предполагается атрибут data=copy. |
Случаи, когда код копируется, могут показаться неэффективным использованием ресурсов (как в примере с образом в ОЗУ), но это может оказаться целесообразным для систем с медленным доступом к ПЗУ/флэш-памяти (например, при наличии 8
-битового интерфейса или при необходимости дополнительных состояний ожидания для доступа к этим устройствам). В этом случае может потребоваться скопировать код в ОЗУ для более быстрого его выполнения.
Рассмотрим простой файл построения образа, в котором указан драйвер консоли и командный интерпретатор:
[virtual=x86,bios] .bootstrap = {startup-biosPATH=/proc/boot procnto}[+script] .script = {devc-con -n9 &reopen /dev/con1[+session] esh &}libc.so[data=copy]devc-conesh[type=link] /usr/lib/ldqnx.so.2=/proc/boot/libc.so
Ожидается, что компоновщик среды выполнения, находится в файле ldqnx.so.2 , но в настоящее время компоновщик среды выполнения находится в файле libc.so , поэтому необходимо создать символьную ссылку на него для менеджера процессов. |
Теперь можно построить образ с помощью описанных выше команд следующим образом (предположим, что файл построения образа называется simple.bld
и что образ будет называться simple.ifs
):
mkifs simple.bld simple.ifs
Ниже приведен пример файла построения образа с поддержкой диска EIDE:
[virtual=x86,bios +compress] .bootstrap = {startup-biosPATH=/proc/boot procnto}[+script] .script = {devc-con -e &devb-eide &reopen /dev/con1[+session] PATH=/proc/boot esh &}libc.solibcam.socam-disk.soio-blk.sofs-qnx4.so[data=copy]devc-coneshlsdevb-eide[type=link] /usr/lib/ldqnx.so.2=/proc/boot/libc.so.3
В следующий пример добавлен inline-файл /etc/hosts
для разрешения адресов, которые используются во время начальной загрузки такими программами, как fs-nfs3
. В нем также демонстрируются способы передачи переменных среды разным командам:
В реальном файле построения образа не допускается разбиение длинных строк на более короткие с помощью символа обратной косой черты (\), однако в данном примере этот прием используется для упрощения восприятия. |
[image=0x1f0000][virtual=ppcbe,raw] .bootstrap = {startup-mtx604-smp -v -Nmtx604-5 -D0x800003f8^0.9600PATH=/proc/boot:/bin:/usr/bin:/sbin:/usr/sbin \LD_LIBRARY_PATH=/proc/boot:/lib:/usr/lib:/lib/dll \procnto-600-smp -v}[+script] startup-script = {# Для экономии памяти все процессы используют libc из загрузочного# образа! Для повышения скорости (меньше разыменований символических ссылок)# указываем на libc.so.3 вместо libc.so.procmgr_symlink ../../proc/boot/libc.so.3 /usr/lib/ldqnx.so.2pci-raven &waitfor /dev/pciio-pkt-v4 -dtulip irq=2,media=9,vid=0x1011,did=0x9 -ptcpip &if_up -p en0ifconfig en0 mtx604-5 upif_up en0fs-nfs3 -ru ra:/my_system /my_system &waitfor /my_system/target/qnx6/ppcbe/usr/sbin/slogger 360# установка переменных средыTZ=est05edt04procmgr_symlink /my_system/target/qnx6/ppcbe/bin /binprocmgr_symlink /my_system/target/qnx6/ppcbe/lib /libprocmgr_symlink /my_system/target/qnx6/ppcbe/sbin /sbinprocmgr_symlink /my_system/target/qnx6/ppcbe/usr/bin /usr/binprocmgr_symlink /my_system/target/qnx6/ppcbe/usr/sbin /usr/sbinprocmgr_symlink /my_system/target/qnx6/ppcbe/usr/lib /usr/libprocmgr_symlink /my_system/target/qnx6/etc /etcslogger &waitfor /dev/slogdevc-ser8250 -e -c1846200 -b 9600 0x800003f8,104 0x800002f8,103 &waitfor /dev/ser1pipe &waitfor /dev/pipedevc-pty &waitfor /dev/ptyp0mqueue &inetd &tinit}[type=link] /tmp = /dev/shmem[type=link] /dev/con1 = /dev/ser1# Создание файлов данных в указанном каталоге/etc/hosts = {127.0.0.1 localhost192.168.1.1 ra192.168.1.111 mtx604-5}# Добавить текущую библиотеку libc.so. Она создается как реальный файл# с использованием соответствующего внутреннего SONAME, а libc.so устанавливается как# символьная ссылка на нее. Символьная ссылка указывает на последнюю версию libc.so.*,# поэтому если требуется использовать более раннюю версию libc (например, libc.so.2),# ее следует добавить перед libc.so.libc.so.2libc.sodevn-tulip.solibsocket.so[data=uip]pci-ravenio-pkt-v4[data=copy]if_upifconfigfs-nfs3
Дополнительные примеры см. в каталоге ${QNX_TARGET}/${PROCESSOR}/build
.
${QNX_TARGET}/${PROCESSOR}/sbin
${QNX_TARGET}/${PROCESSOR}/usr/sbin
${QNX_TARGET}/${PROCESSOR}/boot/sys
${QNX_TARGET}/${PROCESSOR}/bin
${QNX_TARGET}/${PROCESSOR}/usr/bin
${QNX_TARGET}/${PROCESSOR}/lib
${QNX_TARGET}/${PROCESSOR}/lib/dll
${QNX_TARGET}/${PROCESSOR}/usr/lib
${QNX_TARGET}/${PROCESSOR}/usr/photon/bin
Инструментальные средства ЗОСРВ «Нейтрино»
dumpifs, gcc, mkxfs, mketfs, mkefs, mkqnx6fsimg2
Предыдущий раздел: Справочник по утилитам