Usermode-fs-tools/iso2stick: различия между версиями

Материал из ALT Linux Wiki
 
(не показано 50 промежуточных версий 3 участников)
Строка 1: Строка 1:
'''iso2stick''' -- достаточно мощный конвертер, у которого много разных возможностей. Он перепаковывает официальные образы дистрибутивов ALT (в формате ISO-9660) в загрузочные образы USB-стиков (HDD-дисков). Для использования данной утилиты не требуется полномочий root, необходим только один пакет: [[usermode-fs-tools]] (в первую очередь пакет создавался ради этого скрипта-конвертера на POSIX shell размером более 1200 строк).
'''iso2stick''' -- достаточно мощный конвертер, у которого много разных возможностей. Он перепаковывает официальные образы дистрибутивов ALT (в формате ISO-9660) в загрузочные образы USB-стиков (HDD-дисков). Для использования данной утилиты не требуется полномочий root, необходим только один пакет: [[usermode-fs-tools]] (в первую очередь пакет создавался ради этого скрипта-конвертера на POSIX shell размером более 1200 строк; task для p10: '''apt-repo test 294374'''; task для p9: '''apt-repo test 262460'''; task для p8: '''apt-repo test 262462'''; task для c9f2: '''apt repo 294377'''; task для c8.1: '''apt-repo test 262461''').


== Формальное описание ==
== Формальное описание ==
Строка 8: Строка 8:


Options:
Options:
  -B, --keep-boot        Use existings /boot directory.
   -b, --bios-only        Make BIOS-only boottable system on x86.
   -b, --bios-only        Make BIOS-only boottable system on x86.
   -D, --datadir=<PATH>  Add specified files to the boot disk.
   -D, --datadir=<PATH>  Add specified files to the boot disk.
Строка 15: Строка 16:
   -e, --excludes=<FILE>  Set list for exclude files from ISO-9660.
   -e, --excludes=<FILE>  Set list for exclude files from ISO-9660.
   -f, --files=<FILE>    Set list for include files from ISO-9660.
   -f, --files=<FILE>    Set list for include files from ISO-9660.
  -G, --keep-grub        Use existings /boot/grub/grub.cfg config.
   -g, --guid-gpt        Use GUID/GPT disk label instead BIOS/MBR.
   -g, --guid-gpt        Use GUID/GPT disk label instead BIOS/MBR.
   -m, --mode=<MODE>      One of the followed repack modes: rescue,
   -m, --mode=<MODE>      One of the followed repack modes: rescue,
Строка 31: Строка 33:
   -T, --timeout=<SECS>  Specify boot menu timeout, in seconds.
   -T, --timeout=<SECS>  Specify boot menu timeout, in seconds.
   -t, --target=<ARCH>    Use specified target architecture: i586,
   -t, --target=<ARCH>    Use specified target architecture: i586,
                         x86_64, aarch64, armh, ppc64le or e2k/v4.
                         x86_64, aarch64, armh, ppc64le or e2k/v4/v5.
   -U, --uuid=<UUID>      Specify UUID of the ROOT filesystem.
   -U, --uuid=<UUID>      Specify UUID of the ROOT filesystem.
   -u, --uefi-only        Make UEFI-only boottable system on x86.
   -u, --uefi-only        Make UEFI-only boottable system on x86.
Строка 62: Строка 64:
* Поддержка '''gfxterm''', локалей и графических тем '''grub''' для тех платформ, где это работает.
* Поддержка '''gfxterm''', локалей и графических тем '''grub''' для тех платформ, где это работает.


== РОДНОЙ режим установки загрузчика ('native') ==
== Режимы установки загрузчика ==


Режим установки загрузчика "'''родной'''"/"'''чужой'''" определяется автоматически в процессе работы программы. В "'''родном'''" режиме (например, когда мы сидим на '''ppc64le''' и конвертируем ISO-образ для того же '''ppc64le''') основные требования определяются утилитой '''grub2dirs'''. Конвертирование образов для '''i586''' на '''x86_64''' также считается "'''родным'''".
Режим установки загрузчика "'''родной'''"/"'''чужой'''" определяется автоматически в процессе работы программы.  


== ЧУЖОЙ режим установки загрузчика ('foreign') ==
=== РОДНОЙ ('native') ===


Интересной особенностью утилиты является возможность конвертирования образов на одной аппаратной платформе для другой аппаратной платформы. Например, операцию можно выполнить, сидя за компьютером '''x86_64''', конвертируя диск для платформы '''aarch64'''. Данная возможность доступна с оговорками: в хостовой системе (на которой запущена утилита) должен быть установлен '''grub''' и на исходном диске ISO-9660 в репозитории '''/ALTLinux/RPMS.main''' должны находиться требуемые RPM-пакеты, в основном, связанные с загрузчиком '''grub'''. Это ограничение действует для любых целевых носителей, кроме '''e2k'''/'''e2kv4'''. Другими словами: для конвертирования образов '''e2k'''/'''e2kv4''' на другой платформе никаких особых требований нет, но использовать Эльбрус в качестве хостовой системы для других архитектур без установленного '''grub''' не выйдет, для остальных аппаратных платформ исходный ISO-диск должен быть установочным дистрибутивом ALT. См. детали в соответствующей таблице (ниже).
В "'''родном'''" режиме (это когда мы сидим на '''ppc64le''' и конвертируем ISO-образ для того же '''ppc64le''') основные требования определяются утилитой '''grub2dirs'''. Конвертирование образов для '''i586''' на '''x86_64''' также считается "'''родным'''".
 
=== ЧУЖОЙ ('foreign') ===
 
Интересной особенностью утилиты является возможность конвертирования образов на одной аппаратной платформе для другой аппаратной платформы. Например, операцию можно выполнить, сидя за компьютером '''x86_64''', конвертируя диск для платформы '''aarch64'''. Данная возможность доступна с оговорками: в хостовой системе (на которой запущена утилита) должен быть установлен '''grub''' и на исходном диске ISO-9660 в репозитории '''/ALTLinux/RPMS.main''' должны находиться требуемые RPM-пакеты, в основном, связанные с загрузчиком '''grub'''. Это ограничение действует для любых целевых носителей, кроме '''e2k'''/'''e2kv4'''/'''e2kv5'''. Другими словами: для конвертирования образов '''e2k'''/'''e2kv4'''/'''e2kv5''' на другой платформе никаких особых требований нет, но использовать Эльбрус в качестве хостовой системы для других архитектур без установленного '''grub''' не выйдет, для остальных аппаратных платформ исходный ISO-диск должен быть установочным дистрибутивом ALT. См. детали в соответствующей таблице (ниже).


== Командная строка ==
== Командная строка ==
Строка 121: Строка 127:
{| class="wikitable"
{| class="wikitable"
|-
|-
! Хостовая      !! i586 !! x86_64 !! aarch64 !! armh !! ppc64le !! e2k !! e2kv4
! Хостовая      !! i586 !! x86_64 !! aarch64 !! armh !! ppc64le !! e2k !! e2kv4 !! e2kv5
|-
|-
| '''i586'''    ||  N  ||  F    ||    F    ||  F  ||    F    ||  F  || F
| '''i586'''    ||  N  ||  F    ||    F    ||  F  ||    F    ||  F  ||   F  ||  F
|-
|-
| '''x86_64'''  ||  N  ||  N    ||    F    ||  F  ||    F    ||  F  || F
| '''x86_64'''  ||  N  ||  N    ||    F    ||  F  ||    F    ||  F  ||   F  ||  F
|-
|-
| '''aarch64''' ||  F  ||  F    ||    N    ||  F  ||    F    ||  F  || F
| '''aarch64''' ||  F  ||  F    ||    N    ||  F  ||    F    ||  F  ||   F  ||  F
|-
|-
| '''armh'''    ||  x  ||  x    ||    x    ||  N  ||    x    ||  F  || F
| '''armh'''    ||  x  ||  x    ||    x    ||  N  ||    x    ||  F  ||   F  ||  F
|-
|-
| '''ppc64le''' ||  F  ||  F    ||    F    ||  F  ||    N    ||  F  || F
| '''ppc64le''' ||  F  ||  F    ||    F    ||  F  ||    N    ||  F  ||   F  ||  F
|-
|-
| '''e2k'''    ||  x  ||  x    ||    x    ||  x  ||    x    ||  N  || F
| '''e2k'''    ||  x  ||  x    ||    x    ||  x  ||    x    ||  N  ||   F   ||  N
|-
|-
| '''e2kv4'''  ||  x  ||  x    ||    x    ||  x  ||    x    ||  F  || N
| '''e2kv4'''  ||  x  ||  x    ||    x    ||  x  ||    x    ||  F  ||   N  ||  N
|-
| '''e2kv5'''  ||  x  ||  x    ||    x    ||  x  ||    x    ||  F  ||  N  ||  N
|}
|}


Каждая строка таблицы определяет возможности '''хостовой''' системы (на которой запущена утилита). В столбцах указана '''целевая''' архитектура (конвертируемого образа). Обратите внимание, что пока в Альте '''grub''' не собран для '''armh''', поддерживаются лишь две "'''чужие'''" платформы: '''e2k''' и '''e2kv4'''. В пересечениях ячеек используются следующие обозначения:
Каждая строка таблицы определяет возможности '''хостовой''' системы (на которой запущена утилита). В столбцах указана '''целевая''' архитектура (конвертируемого образа). Обратите внимание, что пока в Альте '''grub''' не собран для '''armh''', поддерживаются лишь три "'''чужие'''" платформы: '''e2k''', '''e2kv4''' и '''e2kv5'''. В пересечениях ячеек используются следующие обозначения:
* '''N''' -- загрузчик ставится в "'''родном'''" режиме, указывать '''целевую''' архитектуру необязательно.
* '''N''' -- загрузчик ставится в "'''родном'''" режиме, указывать '''целевую''' архитектуру необязательно.
* '''F''' -- загрузчик может быть установлен в "'''чужом'''" режиме, '''--target=''' обязателен и определяет архитектуру конвертируемого образа.
* '''F''' -- загрузчик может быть установлен в "'''чужом'''" режиме, '''--target=''' обязателен и определяет архитектуру конвертируемого образа.
Строка 148: Строка 156:
* Политика "включения нужного" ('''INCLUDES''') -- применяется по умолчанию.
* Политика "включения нужного" ('''INCLUDES''') -- применяется по умолчанию.
* Политика "исключения не нужного" ('''EXCLUDES''') -- применяется только когда указан соответствующий ключ.
* Политика "исключения не нужного" ('''EXCLUDES''') -- применяется только когда указан соответствующий ключ.
Применить одновременно обе политики нельзя, соответственно, можно указать либо файл с исключения, либо файл с перечислением необходимых объектов файловой системы. Ядро Linux и файл первой стадии загрузки (initrd) всегда копируются, независимо от выбранной политики.
Применить одновременно обе политики нельзя, соответственно, можно указать либо файл с исключениями, либо файл с перечислением необходимых объектов файловой системы. Ядро Linux и файл первой стадии загрузки (initrd) всегда копируются, независимо от выбранной политики.


=== -e, --excludes= ===
=== -e, --excludes= ===
Строка 204: Строка 212:
=== -l, --initlang= ===
=== -l, --initlang= ===


Код языка (например, "'''ru_RU'''"), изначально выбираемый по умолчанию для пунктов меню, связанных с "установщиком ОС" и "живой системой". Также используется в меню '''e2k'''/'''e2kv4''' и не используется для пунктов меню '''ALT Rescue'''.
Код языка (например, "'''ru_RU'''"), изначально выбираемый по умолчанию для пунктов меню, связанных с "установщиком ОС" и "живой системой". Также используется в меню '''e2k'''/'''e2kv4'''/'''e2kv5''' и не используется для пунктов меню '''ALT Rescue'''.


=== -L, --lang= ===
=== -L, --lang= ===


Позволяет переопределить список поддерживаемых языков графической системы ("установщик ОС" и "живая система") в формате ''"код_языка=язык_в_меню"''. Позиции разделяются пробелом и закавычиваются. Языки будут выводиться в под-меню '''grub''' и выбирать соответствующий языку код. Не используется в меню '''e2k'''/'''e2kv4'''. На остальных платформах под-меню с выбором языков создаётся только при наличии в списке более одного варианта.
Позволяет переопределить список поддерживаемых языков графической системы ("установщик ОС" и "живая система") в формате ''"код_языка=язык_в_меню"''. Позиции разделяются пробелом и закавычиваются. Языки будут выводиться в под-меню '''grub''' и выбирать соответствующий языку код. Не используется в меню '''e2k'''/'''e2kv4'''/'''e2kv5'''. На остальных платформах под-меню с выбором языков создаётся только при наличии в списке более одного варианта.


== Особенности создаваемого образа ==
== Особенности создаваемого образа ==
Строка 258: Строка 266:
Чтобы вносить "на лету" какие-либо изменения в создаваемый образ, нужно указать путь к каталогу с данными пользователя:
Чтобы вносить "на лету" какие-либо изменения в создаваемый образ, нужно указать путь к каталогу с данными пользователя:
<pre>$ iso2stick -D ~/deploy/data -- ~/iso/alt-workstation-9.1-i586.iso .</pre>
<pre>$ iso2stick -D ~/deploy/data -- ~/iso/alt-workstation-9.1-i586.iso .</pre>
Здесь каталог "'''~/deploy/data'''" должен содержать файлы, которые будут записаны в создаваемый образ после того, так он будет сформирован из исходного носителя на основании выбранных '''политики''' и '''режима копирования'''.
Здесь каталог "'''~/deploy/data'''" должен содержать файлы, которые будут записаны в создаваемый образ после того, как он будет сформирован из исходного носителя на основании выбранных '''политики''' и '''режима копирования'''.


Обычно указывать каталог с данными пользователя необязательно. Но есть одно исключение: когда в командной строке принудительно задаётся режим ('''D''') "'''deploy'''", данный параметр должен быть определён, а в указанном каталоге должен находиться файл или симлинк '''autorun'''. С другой стороны, когда на исходном носителе нет иных файлов второй стадии загрузки, кроме "'''rescue'''", но указан параметр '''--datadir='''''<path>'', и в каталоге имеется файл или симлинк '''autorun''', автоматически выбирается режим копирования/перепаковки ('''D''') "'''deploy'''".
Обычно указывать каталог с данными пользователя необязательно. Но есть одно исключение: когда в командной строке принудительно задаётся режим ('''D''') "'''deploy'''", данный параметр должен быть определён, а в указанном каталоге должен находиться файл или симлинк '''autorun'''. С другой стороны, когда на исходном носителе нет иных файлов второй стадии загрузки, кроме "'''rescue'''", но указан параметр '''--datadir='''''<path>'', и в каталоге имеется файл или симлинк '''autorun''', автоматически выбирается режим копирования/перепаковки ('''D''') "'''deploy'''".
Строка 274: Строка 282:
=== Подкаталог efi-part ===
=== Подкаталог efi-part ===


Все данные в указанном подкаталоге рассматриваются как данные, подлежащие копированию на VFAT-раздел EFI System Partion ('''ESP''') будущего образа с перезаписью уже имеющихся там файлов. Эти данные записываются только при создании стиков с загрузкой в режиме UEFI. В противном случае они остаются невостребованными.
Все данные в указанном подкаталоге рассматриваются как данные, подлежащие копированию на VFAT-раздел EFI System Partition ('''ESP''') будущего образа с перезаписью уже имеющихся там файлов. Эти данные записываются только при создании USB-стиков с загрузкой в режиме UEFI. В противном случае они остаются невостребованными.


=== Подкаталог e2k-part ===
=== Подкаталог e2k-part ===


Все данные в указанном подкаталоге рассматриваются как данные, подлежащие копированию на загрузочный ext2-раздел Эльбрусов ('''e2k'''/'''e2kv4''') будущего образа с перезаписью уже имеющихся там файлов. Эти данные записываются только при создании стиков с ext2-разделом '''/boot''' на Эльбрусах. В противном случае они остаются невостребованными.
Все данные в указанном подкаталоге рассматриваются как данные, подлежащие копированию на загрузочный ext2-раздел Эльбрусов ('''e2k'''/'''e2kv4'''/'''e2kv5''') будущего образа с перезаписью уже имеющихся там файлов. Эти данные записываются только при создании USB-стиков с ext2-разделом '''/boot''' на Эльбрусах. В противном случае они остаются невостребованными.


=== Подкаталог sys-part ===
=== Подкаталог sys-part ===


Все данные в указанном подкаталоге рассматриваются как данные, подлежащие копированию на корневой раздел будущего образа с перезаписью уже имеющихся там файлов.
Все данные в указанном подкаталоге рассматриваются как данные, подлежащие копированию на корневой раздел будущего образа с перезаписью уже имеющихся там файлов. Здесь может не быть ни одного файла, это ожидаемая ситуация.


=== Файл SWP.img ===
=== Файл SWP.img ===
Строка 321: Строка 329:
search --no-floppy --fs-uuid --set=root {SYSTEM_UUID}
search --no-floppy --fs-uuid --set=root {SYSTEM_UUID}
echo 'Loading Linux kernel...'
echo 'Loading Linux kernel...'
linux /boot/vmlinuz initrd=/boot/full.cz fastboot live automatic=method:disk,uuid:{SYSTEM_UUID} ramdisksize={RAMDISKSIZE} stagename=rescue splash=0 showopts autorun=method:disk,label:{SYSTEM_LABEL}  
linux /boot/vmlinuz initrd=/boot/full.cz fastboot live root=bootchain bootchain=fg,altboot automatic=method:disk,uuid:{SYSTEM_UUID} ramdisk_size={RAMDISKSIZE} stagename=rescue splash=0 showopts quiet autorun=method:disk,label:{SYSTEM_LABEL}  
echo 'Loading initial RAM-disk...'
echo 'Loading initial RAM-disk...'
initrd /boot/full.cz
initrd /boot/full.cz
Строка 343: Строка 351:


== Практика использования ==
== Практика использования ==
=== Несколько простых примеров ===


Сконвертируем ISO-образ сервера '''aarch64''' с ошибочным конфигом '''grub''' в формат USB-HDD на хосте '''x86_64''':
Сконвертируем ISO-образ сервера '''aarch64''' с ошибочным конфигом '''grub''' в формат USB-HDD на хосте '''x86_64''':
Строка 356: Строка 362:


Можем его тут же проверить, если установлен пакет '''qemu-kvm''':
Можем его тут же проверить, если установлен пакет '''qemu-kvm''':
<pre>$ qemu-kvm -m 4G -hdd usbstick.img -netdev user,id=eth0</pre>
<pre>$ qemu-system-x86_64 -m 4G -hdd usbstick.img -netdev user,id=net0 -device virtio-net,netdev=net0,id=eth0</pre>


=== Создание деплойного USB-стика ===
== Создание деплойного USB-стика ==


Здесь описана '''технология массового развёртывания''' дистрибутивов Альт в промышленных масштабах и типовая процедура подготовки локального носителя (деплойной системы). Вообще любой пользователь ОС Альт может сделать резервную копию своей системы для последующего восстановления всего двумя командами: '''system-backup''' -- для снятия бэкапов и '''iso2stick''' -- для создания загрузочного носителя с этими образами.
Раздел перенесён в [[Rescue/Deploy|отдельную статью]].
 
==== Системные требования ====
 
* Целевой компьютер "заказчика", для которого делается деплойная система.
* Мощный компьютер с достаточным местом на диске и аппаратной виртуализацией.
* Желательно иметь большой объём памяти, чтобы работать с образами на TMPFS.
* Бранч '''p8''', но лучше '''p9''' или '''Сизиф''' на хостовой системе, на котором делаем стик.
* Установленные пакеты '''usermode-fs-tools''', '''qemu-system-x86-core''' или '''qemu-kvm'''.
* Для работы с UEFI-загрузкой нужно заранее установить пакет '''edk2-ovmf'''.
* Заранее скаченный образ спасательной системы '''ALT Rescue''' / x86_64.
* Пакеты проприетарного ПО, которые мы собираемся включить в образ.
* Триальные лицензии к проприетарному ПО, если таковые требуются.
* "Боевые" лицензии к проприетарному ПО, если таковые требуются.
 
==== Общий план действий ====
 
* Произвести ручную установку ОС Альт и другого ПО на '''целевой компьютер''' "заказчика".
* Настроить в виртуальной среде '''эталонный компьютер''' с учётом выявленных на "железе" нюансов.
* Загрузиться с '''ALT Rescue''' и снять с виртуалки образы файловых систем.
* Переместить каталог с этими образами на свой компьютер, если это ещё не сделано.
* Подготовить '''деплойный скрипт''' -- есть масса готовых примеров и ожидается альтернатива.
* Объединить спасательную систему '''ALT Rescue''' с образами '''эталонного компьютера''' и '''деплойным скриптом'''.
* Записать получившийся '''образ USB-стика''' на физический носитель (HDD или флэшку USB 3.0).
* Проверить контрольные суммы методом обратного считывания с внешнего HDD или флэшки.
* Проверить работу '''деплойной системы''' и '''целевого компьютера''' после процедуры развёртывания.
* При наличии ошибок в системе развёртывания вернуться к шагу подготовки '''деплойного скрипта'''.
 
==== Предварительные условия ====
 
Необходимо заранее определить, с какими параметрами должна устанавливаться ОС Альт: логины и пароли пользователей, пароль root, ключи '''ssh''', пожелания по разметке диска, требуется ли автоматический вход в графическую систему, пароль на загрузчик '''grub''' (если нужен), выбор компонентов ПО, в т.ч. из репозитория после установки, возможно какие-то другие требования.
 
Важно заранее выяснить у производителя проприетарного ПО, как оно переносит "переезд" на другое "железо" в уже установленном состоянии, насколько оно привязывается к конкретной инсталляции, поскольку есть программы, требующие активации. Их либо нельзя поставлять в уже установленном виде, а надо инсталлировать после процедуры развёртывания на целевом "железе", либо нужно в процессе развёртывания привязывать к такому ПО новую "боевую" лицензию. Лучше заранее выяснить у производителя ПО все подобные рекомендации по массовому развёртыванию. Например:
 
* '''ОС Альт''' допускает массовое развёртывание, не требует активации, при переносе на другое "железо" можно привязать ОС к этому новому железу.
* '''Антивирус Касперского''' с агентом 10 и 11 версии допускает массовое развёртывание: в эталонном образе следует использовать файл ответов, триальную лицензию, подключение к Интернет, а на этапе развёртывания необходимо привязывать "боевую" лицензию к целевому "железу". Другая альтернатива: после установки пакетов вообще не выполнять донастройку, просто отключить службы Касперского и агента. В первом случае в целевую систему попадёт полностью готовый к работе антивирус, во втором случае в образ не попадёт база антивирусных сигнатур, требуется обратное включение служб, донастройка и активация (ручная либо централизованная с Kaspersky Security Center).
* '''ViPNet PKI Client''' версий 1.3 и 1.4 допускает массовое развёртывание: в эталонном образе следует использовать триальную лицензию и подключение к Интернет, а на этапе развёртывания необходимо привязывать "боевую" лицензию к целевому "железу".
* '''Dallas Lock Linux''' версии 2.0 не допускает массовое развёртывание: в эталонный образ можно поместить инсталлятор со скриптом установки и лицензией, а устанавливать продукт следует после развёртывания на целевом "железе".
* '''TrueConf клиент для Linux''' версий 7.x допускает массовое развёртывание, не требует активации, в настройках эталонного компьютера следует учитывать веб-камеру целевого "железа".
* Настольные продукты '''МойОфис Стандартный''' допускают массовое развёртывание, не требуют активации, к "железу" не привязываются.
 
==== Черновая установка на целевой компьютер ====
 
Цель этой '''ручной''' установки: выяснить на "голом железе" все нюансы инсталляции и настройки ОС, прикладного ПО, определиться с более подходящими режимом загрузки ('''Legacy'''/'''UEFI''') и видео-модулем '''xorg''', работой "спящего" и "ждущего" режимов, проверить устанавливаемость и работу проприетарных программ с триальными лицензиями. При такой проверке можно дать себе волю порезвиться с домашним каталогом пользователя, запускать и тестировать тут можно любые приложения. Обратите внимание на название проводного сетевого интерфейса в '''/etc/net/ifaces''' -- вероятно, в виртуалке название интерфейса будет иным, так что это придётся учитывать.
 
==== Чистовая установка в виртуальной среде ====
 
Чистовая инсталляция '''ОС Альт''' и другого ПО может быть как '''ручной''', так и полностью '''автоматической''', скриптами можно автоматизировать все или часть операций. При такой установке нужно минимизировать запуск программ, выход в Интернет, если что-то тестируем, то не здесь и не сейчас. Почему лучше делать это в виртуальной среде, а не на физическом хосте?
 
* Можно и на физическом хосте, но нужна гарантия, что образы '''эталонного компьютера''' не привязаны к нему.
* Значительная экономия времени, если образы из виртуалки сохраняются прямо в оперативку хоста оператора.
* Можно быстро создавать точки состояния системы (снэпшоты) и быстро к ним возвращаться, в случае необходимости.
* Так будет намного проще автоматизировать очень многие процессы создания эталонных образов, некоторые операции приходится выполнять неоднократно (нужна воспроизводимость), у оператора может быть своя библиотека готовых наработок, которые можно повторно использовать.
 
Если в качестве среды виртуализации выступает '''PVE''' или что-то подобное, снятые с виртуалки образы потом придётся "перегонять" на машину оператора по сети. Если же использовать '''qemu''' локально, образы можно сохранять сразу на диск или в TMPFS хостовой системы. Устанавливать ОС в виртуалку лучше в том режиме загрузки, который будет использоваться на целевом "железе" при развёртывании. Если '''деплойная система''' должна быть универсальной, предпочтение следует отдавать режиму загрузки '''UEFI'''. В процессе установки нужно будет указать имя компьютера -- укажите тут "'''computername'''''.нужный.вам.домен''".
 
Подготовка среды для локальной установки ОС в '''qemu''', режим загрузки '''BIOS''':
<pre>
$ GUEST="WS91bios"
$ MEDIA="$HOME/iso/alt-workstation-9.1-x86_64.iso"
$ RESCUE="$HOME/iso/regualar-rescue-latest-x86_64.iso"
 
$ cd ~/path/to/workdir/
$ qemu-img create -f qcow2 -o size=30G "$GUEST.img"
</pre>
Разовый запуск инсталлятора '''ОС Альт''' в режиме загрузки '''BIOS''':
<pre>
$ qemu-system-x86_64 -name "$GUEST" \
    -machine type=q35,accel=kvm -enable-kvm -cpu kvm64 \
    -smp sockets=1,cores=2 -m 4G -device ahci,id=ahci \
    -drive if=none,id=drive0,format=qcow2,file="$GUEST.img" \
    -device ide-drive,drive=drive0,bus=ahci.0 \
    -netdev user,id=net0,restrict=no,hostfwd=tcp::5555-:22 \
    -device virtio-net,netdev=net0,id=eth0 \
    -vga virtio -show-cursor -sdl -ctrl-grab \
    -usb -device qemu-xhci -device usb-ehci -no-fd-bootchk \
    -rtc base=localtime,clock=host,driftfix=slew \
    -cdrom "$MEDIA" -boot d -no-reboot
</pre>
Сразу после инсталляции виртуальная машина выключится. Не все указанные тут опции могут оказаться подходящими к вашей версии '''qemu''', периодически интерфейс меняется, смотрите детали в документации.
 
Последующий запуск ОС в режиме загрузки '''BIOS''':
<pre>
$ qemu-system-x86_64 -name "$GUEST" \
    -machine type=q35,accel=kvm -enable-kvm -cpu kvm64 \
    -smp sockets=1,cores=2 -m 4G -device ahci,id=ahci \
    -drive if=none,id=drive0,format=qcow2,file="$GUEST.img" \
    -device ide-drive,drive=drive0,bus=ahci.0 \
    -netdev user,id=net0,restrict=no,hostfwd=tcp::5555-:22 \
    -device virtio-net,netdev=net0,id=eth0 \
    -vga virtio -show-cursor -sdl -ctrl-grab \
    -fsdev local,security_model=none,id=fsdev1,path="$PWD" \
    -device virtio-9p-pci,id=fs1,fsdev=fsdev1,mount_tag=host \
    -usb -device qemu-xhci -device usb-ehci -no-fd-bootchk \
    -rtc base=localtime,clock=host,driftfix=slew
</pre>
Подготовка среды для локальной установки ОС в '''qemu''', режим загрузки '''UEFI''':
<pre>
$ GUEST="WS91uefi"
$ MEDIA="$HOME/iso/alt-workstation-9.1-x86_64.iso"
$ RESCUE="$HOME/iso/regualar-rescue-latest-x86_64.iso"
 
$ cd ~/path/to/workdir/
$ cp -Lf /usr/share/OVMF/OVMF_CODE.fd bios.bin
$ cp -Lf /usr/share/OVMF/OVMF_VARS.fd efivars.bin
$ qemu-img create -f qcow2 -o size=30G "$GUEST.img"
</pre>
Разовый запуск инсталлятора '''ОС Альт''' в режиме загрузки '''UEFI''':
<pre>
$ qemu-system-x86_64 -name "$GUEST" \
    -machine type=q35,accel=kvm -enable-kvm -smbios type=0,uefi=on \
    -cpu kvm64 -smp sockets=1,cores=2 -m 4G -device ahci,id=ahci \
    -drive if=pflash,format=raw,readonly,file="bios.bin" \
    -drive if=pflash,format=raw,file="efivars.bin" \
    -drive if=none,id=drive0,format=qcow2,file="$GUEST.img" \
    -device ide-drive,drive=drive0,bus=ahci.0 \
    -netdev user,id=net0,restrict=no,hostfwd=tcp::5555-:22 \
    -device virtio-net,netdev=net0,id=eth0 \
    -vga virtio -show-cursor -sdl -ctrl-grab \
    -usb -device qemu-xhci -device usb-ehci -no-fd-bootchk \
    -rtc base=localtime,clock=host,driftfix=slew \
    -cdrom "$MEDIA" -boot menu=on -no-reboot
</pre>
Сразу после инсталляции виртуальная машина выключится. Не все указанные тут опции могут оказаться подходящими к вашей версии '''qemu''', периодически интерфейс меняется, смотрите детали в документации.
 
Последующий запуск ОС в режиме загрузки '''UEFI''':
<pre>
$ qemu-system-x86_64 -name "$GUEST" \
    -machine type=q35,accel=kvm -enable-kvm -smbios type=0,uefi=on \
    -cpu kvm64 -smp sockets=1,cores=2 -m 4G -device ahci,id=ahci \
    -drive if=pflash,format=raw,readonly,file="bios.bin" \
    -drive if=pflash,format=raw,file="efivars.bin" \
    -drive if=none,id=drive0,format=qcow2,file="$GUEST.img" \
    -device ide-drive,drive=drive0,bus=ahci.0 \
    -netdev user,id=net0,restrict=no,hostfwd=tcp::5555-:22 \
    -device virtio-net,netdev=net0,id=eth0 \
    -vga virtio -show-cursor -sdl -ctrl-grab \
    -fsdev local,security_model=none,id=fsdev1,path="$PWD" \
    -device virtio-9p-pci,id=fs1,fsdev=fsdev1,mount_tag=host \
    -usb -device qemu-xhci -device usb-ehci -no-fd-bootchk \
    -rtc base=localtime,clock=host,driftfix=slew
</pre>
При запуске виртуалок с указанными опциями, текущий каталог хоста становится "точкой обмена данными" между хостом и гостевой системой, кроме того, с хостовой системы можно зайти в гостевую по ssh такой командой:
<pre>$ ssh -p 5555 user@localhost</pre>
где '''user''' -- логин обычного пользователя. Это может оказаться полезным и для автоматизаци, и чтобы копировать, а не набирать полностью команды в виртуальной машине. Для монтирования общего каталога выполняем в гостевой системе:
<pre>
$ su-
# mkdir /tmp/host
# mount -t 9p host /tmp/host
</pre>
Теперь в каталоге '''/tmp/host''' гостевой системы будет то же, что и в текущем каталоге хостовой системы.
 
Обычно сразу после установки систему и ядро обновляют до того, как ставить что-то ещё:
<pre>
$ su-
# apt-get update
# apt-get dist-upgarde
# update-kernel
# reboot
 
$ su-
# remove-old-kernels
# apt-get autoremove
# apt-get clean
</pre>
Теперь можно ставить другие пакеты, проприетарное ПО, настраивать систему и среду пользователя. При настройке системы уделите внимание двум файлам: '''/etc/fstab''' и '''/etc/sysconfig/grub2''' -- в виртуалке жёсткий диск называется '''/dev/sda''', а в этих двух файлах прописаны UUID'ы. При развёртывании на целевое "железо" такая система не загрузится, если не восстановить те же UUID'ы, либо если сразу на этапе настройки не поменять эти UUID'ы на имена дисков и разделов, в чём может помочь команда '''lsblk -f'''.
 
Если уже известно, что на целевом "железе" не работает "ждущий" и/или "спящий" режим с имеющимся ядром, ядерным модулем '''drm''' и видео-модулем '''xorg''', если это никак "не лечится", просто отключите кнопки в интерфейсе для соответствующих режимов сна:
<pre>
# Отключаем "ждущий" режим
systemctl mask suspend.target
 
# Отключаем "спящий" режим
systemctl mask hibernate.target
</pre>
Когда машина окончательно настроена, убираем с неё явно лишние файлы и временно записанные дистрибутивы, в последнюю очередь меняем пароли root и пользователя на реальные, под конец выполняем:
<pre>
$ su-
# apt-get autoremove
# apt-get clean
# init 0
</pre>
После этого можно сделать промежуточный снэпшот на случай необходимости в донастройке.
 
==== Снятие образов файловых систем с эталонного компьютера ====
 
Для этой операции потребуется заранее скаченный ISO-образ '''ALT Rescue''' с утилитой '''system-backup''' и поддержкой '''rescue-launcher'''. Он же будет использоваться для создания финального образа USB-стика (следующий раздел). Следует отметить, что не все установочные диски ОС Альт удовлетворяют этим требованиям, даже если содержат файл второй стадии загрузки '''rescue''', но свежие регулярные сборки '''ALT Rescue''' данным требованиям удовлетворяют.
 
Загрузка с '''ALT Rescue''' на виртуалке '''qemu''' в режиме '''BIOS''':
<pre>
$ qemu-system-x86_64 -name "$GUEST" \
    -machine type=q35,accel=kvm -enable-kvm -cpu kvm64 \
    -smp sockets=1,cores=2 -m 4G -device ahci,id=ahci \
    -drive if=none,id=drive0,format=qcow2,file="$GUEST.img" \
    -device ide-drive,drive=drive0,bus=ahci.0 \
    -netdev user,id=net0,restrict=no,hostfwd=tcp::5555-:22 \
    -device virtio-net,netdev=net0,id=eth0 \
    -vga virtio -show-cursor -sdl -ctrl-grab \
    -fsdev local,security_model=none,id=fsdev1,path="$PWD" \
    -device virtio-9p-pci,id=fs1,fsdev=fsdev1,mount_tag=host \
    -usb -device qemu-xhci -device usb-ehci -no-fd-bootchk \
    -rtc base=localtime,clock=host,driftfix=slew \
    -cdrom "$RESCUE" -boot d
</pre>
Загрузка с '''ALT Rescue''' на виртуалке '''qemu''' в режиме '''UEFI''':
<pre>
$ qemu-system-x86_64 -name "$GUEST" \
    -machine type=q35,accel=kvm -enable-kvm -smbios type=0,uefi=on \
    -cpu kvm64 -smp sockets=1,cores=2 -m 4G -device ahci,id=ahci \
    -drive if=pflash,format=raw,readonly,file="bios.bin" \
    -drive if=pflash,format=raw,file="efivars.bin" \
    -drive if=none,id=drive0,format=qcow2,file="$GUEST.img" \
    -device ide-drive,drive=drive0,bus=ahci.0 \
    -netdev user,id=net0,restrict=no,hostfwd=tcp::5555-:22 \
    -device virtio-net,netdev=net0,id=eth0 \
    -vga virtio -show-cursor -sdl -ctrl-grab \
    -fsdev local,security_model=none,id=fsdev1,path="$PWD" \
    -device virtio-9p-pci,id=fs1,fsdev=fsdev1,mount_tag=host \
    -usb -device qemu-xhci -device usb-ehci -no-fd-bootchk \
    -rtc base=localtime,clock=host,driftfix=slew \
    -cdrom "$RESCUE" -boot menu=on
</pre>
Внутри виртуалки выполняем:
<pre>
# mkdir /mnt/backup
# mount -t 9p host /mnt/backup
# system-backup -A sha256 -b /mnt/backup -Rc
# init 0
</pre>
В результате этой долгоиграющей операции в текущем каталоге хоста появится подкаталог с сегодняшней датой, в котором будут находиться образы '''эталонного компьютера''', перед их снятием система будёт жёстко почищена так, что пользоваться ей уже будет невозможно, единственный сетевой интерфейс будет переименован в "'''eth0'''". После этого можно смело удалить из текущего каталога другие файлы, связанные с этой виртуалкой ('''WS91bios.img''' либо '''WS91uefi.img''' + '''bios.img''' + '''efivars.img''').
 
Если вы работаете с '''PVE''' или другой не локальной системой виртуализации, либо если образы снимаются с реального "железа", придётся поступить иначе. К эталонной машине подключается внешний жёсткий диск (в виртуальной среде -- второй виртуальный диск), при необходимости, форматируется. Образы будут сниматься на этот второй диск, а затем копироваться на компьютер оператора. Загружаем '''эталонный компьютер''' с '''ALT Rescue''', затем:
<pre>
# Смотрим, какие диски подключены
lsblk -f
 
# Если нужно, создаём единственный раздел на втором диске и форматируем его
fdisk /dev/sdb
mkfs.ext4 -q -j -L BACKUP /dev/sdb1
 
# Куда будем сохранять образы
mkdir /mnt/backup
mount /dev/sdb1 /mnt/backup
 
# Жёстко "чистим" и бэкапим систему
system-backup -A sha256 -b /mnt/backup -Rc
 
# Поднимаем сеть и ssh
ip l
dhcpcd -i eth0
echo "PermitRootLogin yes" >> /etc/openssh/sshd_config
ssh-keygen -A
service sshd start
ip a
 
# Подключаемся с хоста к этой машине и забираем с неё образы к себе
# $ scp -r root@<IP-ADDRESS>:/mnt/backup/$(date +%Y-%m-%d) ./
 
# Выключаем виртуалку
init 0
</pre>
Будьте внимательны с именами дисков и разделов, в случае отличий. Перегонять образы по сети можно и другими способами. Например, можно сначала поднять сеть в '''ALT Rescue''', смонировать сетевой ресурс '''cifs''', и бэкапить '''эталонный компьютер''' сразу на SAMBA-сервер.


==== Подготовка деплойного скрипта ====
== Известные проблемы после перепаковки ==


Теперь в каталог с образами '''эталонного компьютера''' нужно сложить скрипт '''autorun''', примеры можно найти [[Rescue/Recovery#ПРИМЕРЫ_СКРИПТОВ|здесь]]. Необязательно делать его исполняемым. В этом скрипте следует учесть, что на '''эталонном компьютере''' диск назывался '''/dev/sda''', и если на целевом "железе" диск называется иначе, то сразу после восстановления из образов следует переименовать диск и разделы в соответствующих файлах ('''/etc/fstab''' и '''/etc/sysconfig/grub2'''). В скрипте необходимо восстанавливать UUID'ы при создании разделов, если это не было учтено в настройке '''эталонного компьютера'''. Также в скрипте нужно переименовать проводной интерфейс '''/etc/net/ifaces/eth0''' в то название, что было определено на этапе ручной установки на "голое железо", если имя отличается от "'''eth0'''" и если этот каталог не был переименован в '''эталонном компьютере''' перед снятием с него образов.
* При загрузке в перепакованном '''ALT Rescue''' команда '''mount-system''' не отрабатывает должным образом. Исправление '''find-fstab''' ещё не дошло до Сизифа. Пока можно добавлять параметр '''lowmem''' в строку загрузки, это тоже должно решить проблему. '''UPD''': до Сизифа уже дошло, но не до остальных бранчей!
* Инсталлятор проходит шаг разбивки дисков, а на шаге '''remount''' возникает неисправимая ошибка в скрипте: требуется исправление. Пока исправления нет, не стоит перепаковывать установщик в USB-stick.


==== Создание финального образа деплойной системы ====
== Новое в версии 1.2-alt1 ==


...
В связи с переводом [[Mkimage-profiles|m-p]] на новую схему расположения и наименования файлов ядра и initrd в официальных ISO-образах, добавлена поддержка этой новой схемы наряду со старой. Также добавлена поддержка для архитектуры '''e2kv5''', поддержка стартеркитов на p10, поддержка нового механизма загрузки с '''make-initrd-bootchain''' и поддержка двух ниже перечисленных опций, однако использовать их следует с особой осторожностью.


==== Запись финального образа на физический носитель ====
=== -B, --keep-boot ===


...
Предписывает копировать с исходного ISO-образа целиком каталог '''/boot''' вместе со всеми файлами ядер и initrd. Подкаталог '''/boot/grub''' при этом скопирован не будет, grub всегда ставится заново.


==== Проверка контрольных сумм ====
=== -G, --keep-grub ===


...
Предписывает использовать конфигурацию grub с исходного диска ('''/boot/grub/grub.cfg'''). Следует иметь ввиду, что данная опция практически сводит на нет возможности перепаковщика '''iso2stick''' по генерации данного меню и несовместима со множеством его опций, а, поскольку grub всё равно ставится заново, применять эту опцию следует особенно осторожно. В качестве альтернативы рекомендуется генерировать новую конфигурацию grub на основе шаблона '''loader.tpl''' ([[#Файл_loader.tpl|см. выше]]).





Текущая версия от 21:06, 8 ноября 2022

iso2stick -- достаточно мощный конвертер, у которого много разных возможностей. Он перепаковывает официальные образы дистрибутивов ALT (в формате ISO-9660) в загрузочные образы USB-стиков (HDD-дисков). Для использования данной утилиты не требуется полномочий root, необходим только один пакет: usermode-fs-tools (в первую очередь пакет создавался ради этого скрипта-конвертера на POSIX shell размером более 1200 строк; task для p10: apt-repo test 294374; task для p9: apt-repo test 262460; task для p8: apt-repo test 262462; task для c9f2: apt repo 294377; task для c8.1: apt-repo test 262461).

Формальное описание

$ iso2stick -h
Usage: iso2stick [<options>...] [--] <iso9660> <image> [<size>]

Options:
  -B, --keep-boot        Use existings /boot directory.
  -b, --bios-only        Make BIOS-only boottable system on x86.
  -D, --datadir=<PATH>   Add specified files to the boot disk.
  -d, --dual-boot        Add both 32-bit and 64-bit UEFI firmware
                         boot loaders for 64-bit target system,
                         such as x86_64 or aarch64.
  -e, --excludes=<FILE>  Set list for exclude files from ISO-9660.
  -f, --files=<FILE>     Set list for include files from ISO-9660.
  -G, --keep-grub        Use existings /boot/grub/grub.cfg config.
  -g, --guid-gpt         Use GUID/GPT disk label instead BIOS/MBR.
  -m, --mode=<MODE>      One of the followed repack modes: rescue,
                         deploy, install, live, install+rescue,
                         install+live or install+live+rescue.
  -L, --lang=<LIST>      List of the languages, for example:
                         '"ru_RU=Russian" "en_US=English"'.
  -l, --initlang=<CODE>  Initial/default language code
                         ('ru_RU' used by default).
  -n, --no-clean         Keep temporary files on exit.
  -P, --pad-space        Fill free space on EFI-part by zero's.
  -q, --quiet            Suppress additional diagnostic.
  -r, --reserved=<SIZE>  Reserved space on the boot disk, in MiB.
  -S, --swap=<SIZE>      Specify SWAP partition size, in MiB.
  -s, --secure-boot      Use ALT shim's for UEFI Secure Boot.
  -T, --timeout=<SECS>   Specify boot menu timeout, in seconds.
  -t, --target=<ARCH>    Use specified target architecture: i586,
                         x86_64, aarch64, armh, ppc64le or e2k/v4/v5.
  -U, --uuid=<UUID>      Specify UUID of the ROOT filesystem.
  -u, --uefi-only        Make UEFI-only boottable system on x86.
  -v, --version          Show this program version and exit.
  -h, --help             Show this help message and exit.

Please, report bugs to https://bugzilla.altlinux.org/

Ключевые возможности

  • Для запуска не требуется полномочий root, операция выполняется обычным пользователем.
  • Можно конвертировать образы дисков, предназначенные для другой аппаратной платформы.
  • По умолчанию размер создаваемого образа стремится к минимуму, т.е. на нём не останется свободного места.
  • Но можно указать явно, сколько мегабайт необходимо зарезервировать либо задать требуемый размер образа.
  • Замена конгломерата загрузчиков с графикой только одним без графики: в ряде случаев это увеличивает надёжность.
  • Единое меню при любых вариантах загрузки: генерируется само либо создаётся на основе пользовательского шаблона.
  • Можно "оторвать" неподходящий режим загрузки, препятствующий решению некоторой задачи на "железе".
  • Можно убрать не нужные файлы второй стадии загрузки, сократив размер диска и число пунктов загрузочного меню.
  • Можно добавить указанные файлы на создаваемый образ диска.
  • Можно заменить некоторые файлы в создаваемом образе диска.
  • Можно передать набор своих скриптов-хуков, выполняемых непосредственно перед созданием образа.

Пока не реализованы

  • Возможность углубляться в образы initrd (первая стадия загрузки) и squashfs (вторая стадия загрузки).
  • Возможность замены устаревшего и ненадёжного propagator новыми скриптами make-initrd.
  • Возможность перепаковки initrd другими инструментами в тех случаях, когда make-initrd не подходит.
  • Возможность исправления "на лету" уже известных багов в определённых установочных образах.
  • Поддержка gfxterm, локалей и графических тем grub для тех платформ, где это работает.

Режимы установки загрузчика

Режим установки загрузчика "родной"/"чужой" определяется автоматически в процессе работы программы.

РОДНОЙ ('native')

В "родном" режиме (это когда мы сидим на ppc64le и конвертируем ISO-образ для того же ppc64le) основные требования определяются утилитой grub2dirs. Конвертирование образов для i586 на x86_64 также считается "родным".

ЧУЖОЙ ('foreign')

Интересной особенностью утилиты является возможность конвертирования образов на одной аппаратной платформе для другой аппаратной платформы. Например, операцию можно выполнить, сидя за компьютером x86_64, конвертируя диск для платформы aarch64. Данная возможность доступна с оговорками: в хостовой системе (на которой запущена утилита) должен быть установлен grub и на исходном диске ISO-9660 в репозитории /ALTLinux/RPMS.main должны находиться требуемые RPM-пакеты, в основном, связанные с загрузчиком grub. Это ограничение действует для любых целевых носителей, кроме e2k/e2kv4/e2kv5. Другими словами: для конвертирования образов e2k/e2kv4/e2kv5 на другой платформе никаких особых требований нет, но использовать Эльбрус в качестве хостовой системы для других архитектур без установленного grub не выйдет, для остальных аппаратных платформ исходный ISO-диск должен быть установочным дистрибутивом ALT. См. детали в соответствующей таблице (ниже).

Командная строка

Синтаксис: iso2stick [<опции>...] <что-конвертируем> <во-что-конвертируем> [<размер>], где:

  • <опции> -- изменяют принятые умолчания, необязательны и будут подробно описаны далее;
  • <что-конвертируем> -- файл исходного образа ISO-9660 с дистрибутивом Альт (другие не подойдут) либо смонтированный каталог CD/DVD с файлами, находящимися на исходном диске;
  • <во-что-конвертируем> -- создаваемый IMG-файл либо каталог, в который будет сложен создаваемый образ usbstick.img вместе с файлами контрольных сумм -- SHA256 (checksum.256) и MD5 (checksum.MD5).
  • <размер> -- размер основного (корневого) раздела. Если не указывать, стремится к минимуму. По умолчанию в мегабайтах, но можно использовать буквенные сокращения после цифры: K-килобайты, M-мегабайты, G-гигабайты, T-терабайты.

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

$ iso2stick ~/iso/alt-workstation-9.1-i586.iso .
$ ls -1
checksum.256
checksum.MD5
unpack.log
usbstick.img

TMPDIR

Полученный образ вместе с журналом распаковки и файлами контрольных сумм попадёт в указанный каталог только после успешного окончания операции. До этого программа работает с образами во временном каталоге, ориентируясь на переменную окружения TMPDIR, а если она не определена, то на каталог /tmp. В TMPDIR необходимо иметь столько свободного места, чтобы было достаточно для размещения удвоенного объёма исходных файлов (ISO-9660 плюс ваши файлы) * 2. Если на TMPFS недостаточно свободного места, переопределите TMPDIR перед запуском программы:

$ TMPDIR="$HOME/tmp" iso2stick ~/iso/alt-workstation-9.1-i586.iso .
# либо так:
$ export TMPDIR="$HOME/tmp"
$ iso2stick ~/iso/alt-workstation-9.1-i586.iso .

-n, --no-clean

По умолчанию, когда программа завершается, все файлы из временного каталога удаляются. Чтобы изменить это поведение, например, для детального анализа, в отладочных целях, используйте ключ --no-clean.

-q, --quiet

По умолчанию iso2stick и вызываемые ей утилиты выводят все отладочные сообщения в stderr. Чтобы изменить это поведение и сделать программу менее "говорливой", используйте ключ --quiet. Примеры:

# Тихий запуск:
$ iso2stick -q ~/iso/alt-workstation-9.1-i586.iso .

# Безмолвный, с созданием отчёта (для скриптов):
$ iso2stick ~/iso/alt-workstation-9.1-i586.iso . >mkstick.log 2>&1

# С выводом в консоль и созданием отчёта:
$ iso2stick ~/iso/alt-workstation-9.1-i586.iso . 2>&1 |tee mkstick.log

-t, --target=

По умолчанию загрузчик на целевой образ устанавливается в "родном" режиме (см. выше). Это означает, что если исходный носитель ISO-9660 предназначен для архитектуры x86_64, пользователь запускает конвертер iso2stick, сидя за компьютером с такой же архитектурой. В противном случае программа завершится с ошибкой. Чтобы конвертировать диск для "чужой" архитектуры, необходимо указать её в опции --target=. Поддерживаются такие варианты:

Хостовая i586 x86_64 aarch64 armh ppc64le e2k e2kv4 e2kv5
i586 N F F F F F F F
x86_64 N N F F F F F F
aarch64 F F N F F F F F
armh x x x N x F F F
ppc64le F F F F N F F F
e2k x x x x x N F N
e2kv4 x x x x x F N N
e2kv5 x x x x x F N N

Каждая строка таблицы определяет возможности хостовой системы (на которой запущена утилита). В столбцах указана целевая архитектура (конвертируемого образа). Обратите внимание, что пока в Альте grub не собран для armh, поддерживаются лишь три "чужие" платформы: e2k, e2kv4 и e2kv5. В пересечениях ячеек используются следующие обозначения:

  • N -- загрузчик ставится в "родном" режиме, указывать целевую архитектуру необязательно.
  • F -- загрузчик может быть установлен в "чужом" режиме, --target= обязателен и определяет архитектуру конвертируемого образа.
  • x -- конвертирование невозможно, даже при наличии RPM-пакетов с grub в каталоге /ALTLinux/RPMS.main на исходном носителе.

Политики копирования исходных файлов

При копировании файлов с исходного носителя применяется одна их двух политик:

  • Политика "включения нужного" (INCLUDES) -- применяется по умолчанию.
  • Политика "исключения не нужного" (EXCLUDES) -- применяется только когда указан соответствующий ключ.

Применить одновременно обе политики нельзя, соответственно, можно указать либо файл с исключениями, либо файл с перечислением необходимых объектов файловой системы. Ядро Linux и файл первой стадии загрузки (initrd) всегда копируются, независимо от выбранной политики.

-e, --excludes=

Предписывает применить политику "исключения не нужного". Дополнительно следует указать файл с исключениями. Диск будет скопирован целиком, со всеми файлами стадий, кроме mediacheck, в исключения попадёт всё, что вы перечислите в файле исключений плюс все объекты файловой системы, связанные с загрузкой. Пример:

$ cat >EXCLUDES.lst <<EOF
ALTLinux
altinst
EOF
$ iso2stick -e EXCLUDES.lst ~/iso/alt-workstation-9.1-i586.iso .

Здесь будет скопировано всё содержимое диска за исключением каталога ALTLinux, второй стадии загрузки с инсталлятором altinst и файлов, связанных с загрузкой. Строго говоря именно так делать не стоит, поскольку в данном примере пункты меню, связанные с установщиком ОС, всё равно не исчезнут. Чтобы они не попадали в меню, придётся использовать собственный шаблон меню (см. далее). Другая альтернатива: подменять файл второй стадии загрузки и базу RPM-пакетов своим исправленным вариантом.

-f, --files=

Предписывает применить политику "включения нужного", хотя она и так используется по умолчанию. Дополнительно следует указать файл с перечислением нужных файлов и каталогов, которые должны попасть на целевой носитель. К ним всегда добавляется подкаталог .disk, нужные файлы стадий, которые определяет выбранный режим копирования/перепаковки (см. следующий раздел), а если среди стадий есть установщик, то будет скопирован и каталог ALTLinux с базой RPM-пакетов. Пример:

$ cat >INCLUDES.lst <<EOF
license.all.html
license.ru.html
EOF
$ iso2stick -m intsall -f INCLUDES.lst ~/iso/alt-workstation-9.1-i586.iso .

Здесь наоборот, копируется только squashfs инсталлятора altinst, база RPM-пакетов, два указанных HTML-файла плюс скрытый каталог .disk.

Режимы копирования/перепаковки

Режим копирования/перепаковки определяет, что именно должно попасть из исходного образа, и какие пункты следует добавить в начальное загрузочное меню. Следует отметить, что при выборе политики "исключения не нужного", явный выбор режима копирования/перепаковки оказывает влияние только на формирование начального загрузочного меню.

-m, --mode=

По возможности программа сама пытается определить нужный режим копирования, но можно задать его явно после опции --mode. Поддерживается только семь перечисленных режимов:

  • (R) rescue -- если нужна только спасательная система ALT Rescue.
  • (D) deploy -- как rescue, но с дополнительным пунктом меню Rescue Deploy и файлами пользователя.
  • (I) install -- если нужен только установщик операционной системы.
  • (L) live -- если нужна только графическая "живая" система (LiveCD).
  • (IR) install+rescue -- если нужны только две указанные стадии.
  • (IL) install+live -- если нужны только две указанные стадии.
  • (ILR) install+live+rescue -- если все три указанные стадии обязательны.

Режим указывается либо в нижнем регистре целиком, либо только сокращение (слева в скобках). Пример:

$ iso2stick --mode=rescue ~/iso/alt-workstation-9.1-i586.iso .

Здесь с исходного диска будет скопирован только файл второй стадии со спасательной системой ALT Rescue, в начальное загрузочное меню попадут только те пункты меню, которые относятся к ALT Rescue.

Автоматически формируемое загрузочное меню

При создании целевого образа загрузочное меню по умолчанию формируется автоматически, в соответствии с выбранным режимом копирования (см. предыдущий раздел). Поддерживается три опции, которые могут оказать влияние на автоматически формируемое меню, они описаны далее. Следует отметить, что эти опции не влияют на меню, создаваемое на основе пользовательского шаблона.

-T, --timeout=

По умолчанию таймаут выбора первого пункта меню составляет 60 секунд. Данное значение можно переопределить опцией --timeout.

-l, --initlang=

Код языка (например, "ru_RU"), изначально выбираемый по умолчанию для пунктов меню, связанных с "установщиком ОС" и "живой системой". Также используется в меню e2k/e2kv4/e2kv5 и не используется для пунктов меню ALT Rescue.

-L, --lang=

Позволяет переопределить список поддерживаемых языков графической системы ("установщик ОС" и "живая система") в формате "код_языка=язык_в_меню". Позиции разделяются пробелом и закавычиваются. Языки будут выводиться в под-меню grub и выбирать соответствующий языку код. Не используется в меню e2k/e2kv4/e2kv5. На остальных платформах под-меню с выбором языков создаётся только при наличии в списке более одного варианта.

Особенности создаваемого образа

Переопределить заданные по умолчанию особенности создаваемого образа можно ниже перечисленными опциями. Они передаются дальше таким утилитам, как grub2dirs, dir2extfs, dir2vfat и parts2img.

-b, --bios-only

Применима только для платформы x86_64. Позволяет "оторвать" UEFI-загрузку и сделать образ загружаемым только в режиме Legacy/CSM BIOS. Это может оказаться полезным в очень редких случаях, когда "кривой" BIOS, видя UEFI-загрузчик, пытается запустить только его, а нужна загрузка в унаследованном режиме.

-u, --uefi-only

Применима только для платформы x86_64. Позволяет "оторвать" загрузку в унаследованном режиме Legacy/CSM BIOS.

-d, --dual-boot

Предписывает на 64-бит платформах x86_64 и aarch64 добавлять UEFI-загрузчик для 32-бит прошивок UEFI, т.е. когда необходимо поставить обе цели: x86_64-efi и i386-efi одновременно. На aarch64 данная опция пока неприменима, т.к. в Альте ещё не собран grub для armh.

-s, --secure-boot

Предписывает по возможности использовать для UEFI-загрузки подписанный ALT Shim'ом grub, что аналогично запуску grub-install --uefi-secure-boot ... или без параметров. Для 32-бит цели ALT Shim также используется, при его наличии. Опция доступна только для платформы x86_64, её добавление позволяет загружаться на машинах с включенным Secure Boot.

-g, --guid-gpt

По умолчанию образ диска создаётся с разметкой DOS/MBR. Когда требуется разметка GUID/GPT, следует добавить опцию --guid-gpt.

-S, --swap=

Предписывает создать в образе диска перед основным (корневым) разделом SWAP-раздел указанного размера.

-r, --reserved=

Предписывает зарезервировать на основном (корневом) разделе указанное число мегабайт, это место будет свободным. Данную опцию нельзя использовать одновременно с указанием размера корневого раздела в конце командной строки, может быть только что-то одно.

-P, --pad-space

Предписывает заполнить остаток свободного места на разделе EFI System Partition файлом с нулями -- там может оставаться несколько килобайт. Это может оказаться полезным для предотвращения нежелательной записи в FAT-раздел на Windows-машинах.

-U, --uuid=

Позволяет явно указать UUID основного (корневого) раздела.

Внесение изменений в исходный образ

Конвертер позволяет не только удалять не нужное (или копировать нужное) с исходного диска, он позволяет добавлять свои файлы в формируемый образ, а также перезаписывать ими скопированное с исходного диска. Например, если на исходном диске есть RPM-пакет с известной ошибкой, можно заменить его исправленной версией.

-D, --datadir=

Чтобы вносить "на лету" какие-либо изменения в создаваемый образ, нужно указать путь к каталогу с данными пользователя:

$ iso2stick -D ~/deploy/data -- ~/iso/alt-workstation-9.1-i586.iso .

Здесь каталог "~/deploy/data" должен содержать файлы, которые будут записаны в создаваемый образ после того, как он будет сформирован из исходного носителя на основании выбранных политики и режима копирования.

Обычно указывать каталог с данными пользователя необязательно. Но есть одно исключение: когда в командной строке принудительно задаётся режим (D) "deploy", данный параметр должен быть определён, а в указанном каталоге должен находиться файл или симлинк autorun. С другой стороны, когда на исходном носителе нет иных файлов второй стадии загрузки, кроме "rescue", но указан параметр --datadir=<path>, и в каталоге имеется файл или симлинк autorun, автоматически выбирается режим копирования/перепаковки (D) "deploy".

Поддерживается два формата каталога с данными пользователя: простой и комплексный.

Простой формат каталога

Простой формат определяется отсутствием подкаталога "sys-part" в указанном каталоге с данными пользователя. В этом случае все данные в указанном каталоге рассматриваются как данные, подлежащие копированию на корневой раздел будущего образа с перезаписью уже имеющихся там файлов. Никаких других данных в этом случае переданный каталог содержать не может.

Комплексный формат каталога

Комплексный формат определяется наличием подкаталога "sys-part" в указанном каталоге с данными пользователя. Назначение каждого объекта в каталоге данных пользователя в этом случае описывается в следующих разделах.

Подкаталог efi-part

Все данные в указанном подкаталоге рассматриваются как данные, подлежащие копированию на VFAT-раздел EFI System Partition (ESP) будущего образа с перезаписью уже имеющихся там файлов. Эти данные записываются только при создании USB-стиков с загрузкой в режиме UEFI. В противном случае они остаются невостребованными.

Подкаталог e2k-part

Все данные в указанном подкаталоге рассматриваются как данные, подлежащие копированию на загрузочный ext2-раздел Эльбрусов (e2k/e2kv4/e2kv5) будущего образа с перезаписью уже имеющихся там файлов. Эти данные записываются только при создании USB-стиков с ext2-разделом /boot на Эльбрусах. В противном случае они остаются невостребованными.

Подкаталог sys-part

Все данные в указанном подкаталоге рассматриваются как данные, подлежащие копированию на корневой раздел будущего образа с перезаписью уже имеющихся там файлов. Здесь может не быть ни одного файла, это ожидаемая ситуация.

Файл SWP.img

Образ заранее подготовленного с особыми параметрами раздела SWAP.

Файл loader.tpl

Если требуется, чтобы начальное загрузочное меню не создавалось автоматически, а выглядело определённым образом, данный файл является прототипом будущего /boot/boot.conf (на Эльбрусах) либо /boot/grub/grub.cfg (на остальных архитектурах), в зависимости от целевой системы, для которой создаётся образ. Другими словами, это определённый пользователем шаблон загрузочного меню. Он может быть скопирован "как есть", при этом, осуществляется подстановка некоторых заранее вычисленных значений:

Шаблон Назначение
{SYSTEM_UUID} Заменяется UUID'ом корневого раздела
{SYSTEM_LABEL} Заменяется меткой тома корневого раздела
{RESCUE_HASH} Заменяется хэш-суммой (sha256) squashfs-образа второй стадии загрузки rescue
{RAMDISKSIZE} Заменяется размером RAM-диска для загрузки squashfs-образа второй стадии загрузки rescue

Пример файла ~/deploy/data/loader.tpl:

insmod part_msdos
insmod part_gpt
insmod ext2
insmod gzio

if keystatus --shift; then
  set timeout=-1
else
  set timeout=0
fi

menuentry 'Rescue Deploy (dangerous for you data!)' --class gnu-linux --class gnu --class os --unrestricted {
	search --no-floppy --fs-uuid --set=root {SYSTEM_UUID}
	echo 'Loading Linux kernel...'
	linux /boot/vmlinuz initrd=/boot/full.cz fastboot live root=bootchain bootchain=fg,altboot automatic=method:disk,uuid:{SYSTEM_UUID} ramdisk_size={RAMDISKSIZE} stagename=rescue splash=0 showopts quiet autorun=method:disk,label:{SYSTEM_LABEL} 
	echo 'Loading initial RAM-disk...'
	initrd /boot/full.cz
}

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

Подкаталог hooks.d

Если такой подкаталог существует, он копируется в текущий рабочий каталог программы непосредственно перед созданием финального образа диска, все файлы в нём делаются исполняемыми, после чего они вызываются в произвольном порядке через run-parts.

Пример скриптового хука "~/deploy/data/hooks.d/listing", создающего список всех файлов в корневом разделе стика:

#!/bin/sh -efu

( cd sys-part/
  find . -type f |cut -c3- |sort > ../usbstick.lst
  mv -f ../usbstick.lst ./
)

Практика использования

Сконвертируем ISO-образ сервера aarch64 с ошибочным конфигом grub в формат USB-HDD на хосте x86_64:

$ iso2stick -q -t aarch64 -- ~/iso/alt-server-9.0-aarch64.iso .

Превратим ISO-образ сервера ppc64le в ALT Rescue для USB-стика на хосте x86_64:

$ iso2stick -q -t ppc64le -m rescue -- ~/iso/alt-server-9.1-ppc64le.iso .

Создадим USB-стик с "живой" графической системой Альт Рабочая станция 9.1, "оторвав" загрузку UEFI, чтобы с него можно было загрузится только в режиме Legacy/CSM BIOS:

$ iso2stick -q -b -m live -- ~/iso/alt-workstation-9.1-x86_64.iso .

Можем его тут же проверить, если установлен пакет qemu-kvm:

$ qemu-system-x86_64 -m 4G -hdd usbstick.img -netdev user,id=net0 -device virtio-net,netdev=net0,id=eth0

Создание деплойного USB-стика

Раздел перенесён в отдельную статью.

Известные проблемы после перепаковки

  • При загрузке в перепакованном ALT Rescue команда mount-system не отрабатывает должным образом. Исправление find-fstab ещё не дошло до Сизифа. Пока можно добавлять параметр lowmem в строку загрузки, это тоже должно решить проблему. UPD: до Сизифа уже дошло, но не до остальных бранчей!
  • Инсталлятор проходит шаг разбивки дисков, а на шаге remount возникает неисправимая ошибка в скрипте: требуется исправление. Пока исправления нет, не стоит перепаковывать установщик в USB-stick.

Новое в версии 1.2-alt1

В связи с переводом m-p на новую схему расположения и наименования файлов ядра и initrd в официальных ISO-образах, добавлена поддержка этой новой схемы наряду со старой. Также добавлена поддержка для архитектуры e2kv5, поддержка стартеркитов на p10, поддержка нового механизма загрузки с make-initrd-bootchain и поддержка двух ниже перечисленных опций, однако использовать их следует с особой осторожностью.

-B, --keep-boot

Предписывает копировать с исходного ISO-образа целиком каталог /boot вместе со всеми файлами ядер и initrd. Подкаталог /boot/grub при этом скопирован не будет, grub всегда ставится заново.

-G, --keep-grub

Предписывает использовать конфигурацию grub с исходного диска (/boot/grub/grub.cfg). Следует иметь ввиду, что данная опция практически сводит на нет возможности перепаковщика iso2stick по генерации данного меню и несовместима со множеством его опций, а, поскольку grub всё равно ставится заново, применять эту опцию следует особенно осторожно. В качестве альтернативы рекомендуется генерировать новую конфигурацию grub на основе шаблона loader.tpl (см. выше).


Enjoy! ;-)