Rescue/Launcher: различия между версиями

Материал из ALT Linux Wiki
 
(не показано 15 промежуточных версий этого же участника)
Строка 7: Строка 7:
=Назначение=
=Назначение=


* Автоматизация запуска вашей программы на первом терминале при загрузке с rescue, в том числе, программы, требующей интерактивного взаимодействия с пользователем.
* Автоматизация запуска вашей программы на первом терминале при загрузке с [[Rescue|ALT Rescue]], в том числе, программы, требующей интерактивного взаимодействия с пользователем.
* Создание инструментальных загрузочных носителей с собственной системой диалогов.
* Создание инструментальных [[Usermode-fs-tools/iso2stick|загрузочных носителей]] с собственной системой диалогов.
* Автоматизация сборки систем на голом железе и в виртуальном окружении.
* Автоматизация сборки систем на голом железе и в [[Rescue/Deploy#Чистовая_установка_в_виртуальной_среде|виртуальном окружении]].
* Автоматизация массового развёртывания из готовых образов.
* [[Rescue/Deploy|Автоматизация массового развёртывания]] из [[Rescue/Recovery#Пример_"универсального"_бэкапа_всей_системы|готовых образов]].


=Краткое описание=
=Краткое описание=


Пакет '''rescue-launcher''' разработан с таким расчётом, чтобы можно было автоматически смонтировать <ОТКУДА-ТО> некую директорию, содержащую <ВАШ_СКРИПТ> (или иной исполняемый файл), и запустить его. Параметр загрузки ядра '''autorun''' управляет тем, где и что ищется, каким образом и куда монтируется. Скрипт, входящий в пакет '''rescue-launcher''', запускается на первом терминале ('''/dev/tty1'''), блокируя возможный повторный запуск. В случае возникновения ошибок, выполнение прерывается и вы оказываетесь в штатной командной строке '''ALT Rescue'''. Если что-то пошло не так, смотрите журнал '''/var/log/rescue-launcher.log'''.
Пакет '''rescue-launcher''' разработан с таким расчётом, чтобы можно было автоматически смонтировать <ОТКУДА-ТО> некий каталог, содержащий <ВАШ_СКРИПТ> (или иной исполняемый файл), и запустить его. Параметр загрузки ядра '''autorun''' управляет тем, где и что ищется, каким образом и куда монтируется. Скрипт, входящий в пакет '''rescue-launcher''', запускается на первом терминале ('''/dev/tty1'''), блокируя возможный повторный запуск. В случае возникновения ошибок, выполнение прерывается и вы оказываетесь в штатной командной строке '''ALT Rescue'''. Если что-то пошло не так, смотрите журнал '''/var/log/rescue-launcher.log'''.


В образе носителя [[Rescue]] должен находиться пакет '''rescue-launcher'''. Чтобы работал автозапуск, также важен [http://git.altlinux.org/gears/s/startup-rescue.git?p=startup-rescue.git;a=commitdiff;h=19369c22878f50ffea5f9864bd79f94ec5e77762 этот патч] (входит в '''startup-rescue''' >= 0.31-alt1). Последним важным условием является наличие опции '''autorun'''[=...] в параметрах загрузки ядра. Предполагается, что первые два условия будут реализованы в '''m-p''' профилях '''ALT Rescue''' и во всех бранчах в самое ближайшее время. Если собирается собственный образ rescue, вместо пакета '''rescue-launcher''' ваш исполняемый скрипт можно сложить непосредственно в '''/sbin/rescue-launcher''' корневой системы.
В образе носителя [[Rescue]] должен находиться пакет '''rescue-launcher'''. Чтобы работал автозапуск, также важен [http://git.altlinux.org/gears/s/startup-rescue.git?p=startup-rescue.git;a=commitdiff;h=19369c22878f50ffea5f9864bd79f94ec5e77762 этот патч] (входит в '''startup-rescue''' >= 0.31-alt1). Последним важным условием является наличие опции '''autorun'''[=...] в параметрах загрузки ядра. Предполагается, что первые два условия будут реализованы в '''m-p''' профилях '''ALT Rescue''' и во всех бранчах в самое ближайшее время. Если собирается собственный образ rescue, вместо пакета '''rescue-launcher''' ваш исполняемый скрипт можно сложить непосредственно в '''/sbin/rescue-launcher''' корневой системы.
Строка 24: Строка 24:
==method==
==method==


Определяет один из методов поиска нужной директории с <ВАШИМ_СКРИПТОМ> (см. далее). Значение по умолчанию: '''auto'''.
Определяет один из методов поиска нужного каталога с <ВАШИМ_СКРИПТОМ> (см. далее). Значение по умолчанию: '''auto'''.


==label==
==label==
Строка 44: Строка 44:
==mpoint==
==mpoint==


Директория, в которую будет смонтирован указанный путь и где в конечном итоге окажется автоматически запускаемый скрипт. Значение по умолчанию: '''/mnt/autorun'''.
Каталог, в который будет смонтирован указанный путь, и где в конечном итоге окажется автоматически запускаемый скрипт. Значение по умолчанию: '''/mnt/autorun'''.


==run==
==run==


Название автоматически запускаемого скрипта (<ВАШЕГО_СКРИПТА> или иного исполняемого файла). Значение по умолчанию: '''autorun'''.
Название автоматически запускаемого скрипта (<ВАШЕГО_СКРИПТА> или иного исполняемого файла). Значение по умолчанию: '''autorun'''. Этот файл должен быть доступным для чтения и выполнения. Иначе ничего работать не будет!


==Примеры==
==Примеры==
Строка 70: Строка 70:
==CDROM==
==CDROM==


Директория ('''directory'''=...) должна быть указана. Если нет, используется директория "'''/recovery'''". Эта директория должна находиться либо в корне загрузочной системы ('''squashfs'''), либо в корне ISO-образа ('''iso9660'''). Если задать '''UUID''' и/или '''LABEL''' ISO-диска, эти поля также проверяются. Данная схема пригодна для случаев, когда необходимые файлы могут быть размещены на этапе создания загрузочного образа (squashfs или iso9660), при этом их объём вместе с загрузочной системой не превышают размер типовой ISO-болванки (около 4.5Гб).
Каталог ('''directory'''=...) должен быть указан. Если нет, используется каталог "'''/recovery'''". Этот каталог должен находиться либо в корне загрузочной системы ('''squashfs'''), либо в корне ISO-образа ('''iso9660'''). Если задать '''uuid''' и/или '''label''' ISO-диска, эти аргументы также проверяются. Данная схема пригодна для случаев, когда необходимые файлы могут быть размещены на этапе создания загрузочного образа (squashfs или iso9660), при этом их объём вместе с загрузочной системой не превышают размер типовой ISO-болванки (около 4.5Гб).


==DISK==
==DISK==


Метод '''disk''' ищет локально доступный раздел, указанный в поле '''UUID'''. Если UUID не указан, ищет локально доступный раздел, указанный в поле '''LABEL'''. Если и '''LABEL''' не указан, ищет локально доступный раздел с меткой тома "'''alt-autorun'''".
Метод '''disk''' ищет локально доступный раздел, указанный в поле '''uuid'''. Если '''uuid''' не указан, ищет локально доступный раздел, указанный в поле '''label'''. Если и '''label''' не указан, ищет локально доступный раздел с меткой тома "'''alt-autorun'''".


==NFS==
==NFS==


Метод '''nfs''' требует указания аргументов '''server''' и '''directory''': директория монтируется по сети с указанного сервера, используется протокол NFSv3.
Метод '''nfs''' требует указания аргументов '''server''' и '''directory''': указанный каталог монтируется по сети с указанного сервера, при этом используется протокол NFSv3.


==HTTP==
==HTTP==


Метод '''http''' немного отличается от остальных: <ВАШ_СКРИПТ> скачивается во временный файл с адреса, указанного в параметрах '''server''' и '''directory''', делается выполняемым, а перед его запуском экспортируется переменная среды '''AUTORUN_HTTPBASE''', содержащая "подсказку" <ВАШЕМУ_СКРИПТУ>, где можно скачать остальные файлы, если это потребуется.
Метод '''http''' немного отличается от остальных: <ВАШ_СКРИПТ> скачивается во временный файл с адреса, указанного в параметрах '''server''' и '''directory''', делается выполняемым, а перед его запуском экспортируется переменная среды '''AUTORUN_HTTPBASE''', содержащая "подсказку" <ВАШЕМУ_СКРИПТУ>, где можно скачать остальные файлы, если это потребуется.
==PLAN9==
Метод '''plan9''' позволяет связать с гостевой системой каталог хост-системы через тэг '''alt-autorun''' или иной, указанный в аргументе '''label'''. Запустив на хост-системе команду, создающую и запускающую виртуальную машину QEMU, вы передаёте в ней нужный тэг так называемой [https://wiki.qemu.org/Documentation/9psetup 9p-шары]. Гостевая система, запустившись с опцией '''autorun=method:plan9,label=...''' данный каталог монтирует на чтение локально и запускает в нём <ВАШ_СКРИПТ>. Получается что-то подобное '''guestfs''', только ваши правила и возможности закладываются в загрузочный образ.
==VBOX==
Метод '''vbox''' подобен методу '''plan9''', только связывает "общую папку VirtualBox" между гостевой и хостовой системами.


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


Собираем усечённую rescue на основе репозитория c8
Собираем усечённую rescue на основе репозитория c8:
<pre>
<pre>
git clone git://git.altlinux.org/people/klark/packages/alt-c8-deploy.git
git clone git://git.altlinux.org/people/klark/packages/alt-c8-deploy.git
Строка 95: Строка 103:
</pre>
</pre>


Создаём "ответную" часть типа "Hello, world!"
Создаём "ответную" часть типа "Hello, world!":
<pre>
<pre>
cd $TMPDIR
cd $TMPDIR
Строка 110: Строка 118:
</pre>
</pre>


Тестируем полученный образ в QEMU (надо выбрать второй пункт в загрузочном меню)
Тестируем полученный образ в QEMU (надо будет выбрать второй пункт в загрузочном меню):
<pre>
<pre>
qemu-kvm -cpu host -m 1024 -balloon virtio \
qemu-kvm -cpu host -m 1024 -balloon virtio \
Строка 118: Строка 126:
</pre>
</pre>


Заменяем "ответную" часть на что-то более осмысленное
Заменяем "ответную" часть на что-то более осмысленное:
<pre>
<pre>
cat >test-deploy/autorun <<-EOF
cat >test-deploy/autorun <<-EOF
Строка 137: Строка 145:
</pre>
</pre>


После повторного запуска виртуалки с теми же аргументами в $TMPDIR/test-deploy/hybrid.iso появится гибридный образ. Запишем его на настоящую флэшку...
После повторного запуска виртуалки с теми же аргументами в $TMPDIR/test-deploy/hybrid.iso появится гибридный образ. Запишем его на настоящую флэшку:
<pre>
<pre>
su-
su -
umount /dev/sdb1
umount /dev/sdb1
dd if=/tmp/.private/<USERNAME>/test-deploy/hybrid.iso \
dd if=/tmp/.private/<USERNAME>/test-deploy/hybrid.iso \

Текущая версия от 00:19, 9 ноября 2022

Автоматический запуск программы в ALT Rescue

Заставшим MS-DOS это напомнит C:\autoexec.bat. Ну да, что-то очень похожее, только "на стероидах"! :) В отличие от rc.local, процесс запускается интерактивно, а не в фоновом режиме, причём на конкретном терминале сразу после запуска всех служб. По завершении этого процесса пользователь попадает в обычную командную строку.

Restore.jpg

Назначение

Краткое описание

Пакет rescue-launcher разработан с таким расчётом, чтобы можно было автоматически смонтировать <ОТКУДА-ТО> некий каталог, содержащий <ВАШ_СКРИПТ> (или иной исполняемый файл), и запустить его. Параметр загрузки ядра autorun управляет тем, где и что ищется, каким образом и куда монтируется. Скрипт, входящий в пакет rescue-launcher, запускается на первом терминале (/dev/tty1), блокируя возможный повторный запуск. В случае возникновения ошибок, выполнение прерывается и вы оказываетесь в штатной командной строке ALT Rescue. Если что-то пошло не так, смотрите журнал /var/log/rescue-launcher.log.

В образе носителя Rescue должен находиться пакет rescue-launcher. Чтобы работал автозапуск, также важен этот патч (входит в startup-rescue >= 0.31-alt1). Последним важным условием является наличие опции autorun[=...] в параметрах загрузки ядра. Предполагается, что первые два условия будут реализованы в m-p профилях ALT Rescue и во всех бранчах в самое ближайшее время. Если собирается собственный образ rescue, вместо пакета rescue-launcher ваш исполняемый скрипт можно сложить непосредственно в /sbin/rescue-launcher корневой системы.

Параметр autorun

Параметр загрузки ядра autorun (сам по себе или autorun=1) позволяет включить механизм автозапуска с заданными умолчаниями, которые можно переопределить, сложив в rescue-образ собственный файл конфигурации /etc/rescue-launcher/rescue-launcher.conf. Имеющаяся в пакете конфигурация детально описывает назначение каждого аргумента и все заданные умолчания. Все те же аргументы могут быть переопределены параметром загрузки ядра autorun=..., например:

method

Определяет один из методов поиска нужного каталога с <ВАШИМ_СКРИПТОМ> (см. далее). Значение по умолчанию: auto.

label

Метка тома или тэг для монтирования локальных носителей. Значение по умолчанию: alt-autorun. rescue-launcher может брать это значение также из параметра automatic (см. Propagator). В /proc/cmdline внутри меток тома вместо пробелов следует использовать последовательность символов "%20".

uuid

UUID локально подключенного раздела. Значение по умолчанию не определено. rescue-launcher может брать это значение также из параметра automatic (см. Propagator).

server

IP-адрес или DNS-имя сервера (http, nfs). Значение по умолчанию не определено. rescue-launcher может брать это значение также из параметра automatic (см. Propagator).

directory

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

mpoint

Каталог, в который будет смонтирован указанный путь, и где в конечном итоге окажется автоматически запускаемый скрипт. Значение по умолчанию: /mnt/autorun.

run

Название автоматически запускаемого скрипта (<ВАШЕГО_СКРИПТА> или иного исполняемого файла). Значение по умолчанию: autorun. Этот файл должен быть доступным для чтения и выполнения. Иначе ничего работать не будет!

Примеры

autorun=method:http,server:example.org,directory:/pub/start
autorun=method:nfs,server:192.168.15.2,directory:/srv/deploy
autorun=method:disk,uuid:82d5d0e2-d51d-4508-bd82-f9aade802427
autorun=method:cdrom,label:ALT%20Education%209.3beta2
autorun=method:plan9,label:host-guest-exchange

Методы

Метод поиска нужного каталога с <ВАШИМ_СКРИПТОМ> определяется аргументом method. Например, если указать autorun=method:disk,label:deploy в /proc/cmdline, rescue-launcher попытается смонтировать любой подключенный диск с меткой тома "deploy" и будет искать запускаемый скрипт на нём. Первая версия rescue-launcher поддерживает следующие методы: auto, cdrom, disk, nfs, http, plan9, vbox. Методы nfs и http требуют предварительного поднятия сетевого интерфейса. На данный момент используется довольно примитивный механизм получения настроек по протоколу DHCP. Методы cdrom и disk относятся к классу "локально подключаемых дисков", тогда как методы plan9 и vbox относятся к классу "виртуальных ФС" для обмена данными между хостовой и гостевой системами.

AUTO

Метод auto используется по умолчанию и обеспечивает поиск всеми доступными способами, но порядок и конкретные методы можно переопределить в собственном rescue-образе через файлы /etc/rescue-launcher/*.list. Можно написать собственный метод (к примеру, samba или ssh) и сложить по аналогии в /usr/libexec/rescue-launcher/methods/. Метод auto опасен тем, что если на пути поиска может возникнуть не одно местоположение, будет выбрано какое-то одно и не то, на которое вы рассчитывали. Поэтому лучше всегда выбирать не его, а другой конкретный метод. Важно понимать: сначала перебираются все локальные методы, затем сетевые и в самом конце виртуальные. Порядок внутри класса также определяется содержимым файлов /etc/rescue-launcher/*.list.

CDROM

Каталог (directory=...) должен быть указан. Если нет, используется каталог "/recovery". Этот каталог должен находиться либо в корне загрузочной системы (squashfs), либо в корне ISO-образа (iso9660). Если задать uuid и/или label ISO-диска, эти аргументы также проверяются. Данная схема пригодна для случаев, когда необходимые файлы могут быть размещены на этапе создания загрузочного образа (squashfs или iso9660), при этом их объём вместе с загрузочной системой не превышают размер типовой ISO-болванки (около 4.5Гб).

DISK

Метод disk ищет локально доступный раздел, указанный в поле uuid. Если uuid не указан, ищет локально доступный раздел, указанный в поле label. Если и label не указан, ищет локально доступный раздел с меткой тома "alt-autorun".

NFS

Метод nfs требует указания аргументов server и directory: указанный каталог монтируется по сети с указанного сервера, при этом используется протокол NFSv3.

HTTP

Метод http немного отличается от остальных: <ВАШ_СКРИПТ> скачивается во временный файл с адреса, указанного в параметрах server и directory, делается выполняемым, а перед его запуском экспортируется переменная среды AUTORUN_HTTPBASE, содержащая "подсказку" <ВАШЕМУ_СКРИПТУ>, где можно скачать остальные файлы, если это потребуется.

PLAN9

Метод plan9 позволяет связать с гостевой системой каталог хост-системы через тэг alt-autorun или иной, указанный в аргументе label. Запустив на хост-системе команду, создающую и запускающую виртуальную машину QEMU, вы передаёте в ней нужный тэг так называемой 9p-шары. Гостевая система, запустившись с опцией autorun=method:plan9,label=... данный каталог монтирует на чтение локально и запускает в нём <ВАШ_СКРИПТ>. Получается что-то подобное guestfs, только ваши правила и возможности закладываются в загрузочный образ.

VBOX

Метод vbox подобен методу plan9, только связывает "общую папку VirtualBox" между гостевой и хостовой системами.

Примеры использования

Собираем усечённую rescue на основе репозитория c8:

git clone git://git.altlinux.org/people/klark/packages/alt-c8-deploy.git
cd alt-c8-deploy
$EDITOR sources.list
export GLOBAL_NET_ETH=eth0
make && make distclean

Создаём "ответную" часть типа "Hello, world!":

cd $TMPDIR
mkdir test-deploy
cat >test-deploy/autorun <<-EOF
#!/bin/sh -efu

export LANG="ru_RU.utf8"
export LC_ALL="ru_RU.utf8"
echo "Да здравствует автоматизация!"
sleep 30
EOF
chmod +x test-deploy/autorun

Тестируем полученный образ в QEMU (надо будет выбрать второй пункт в загрузочном меню):

qemu-kvm -cpu host -m 1024 -balloon virtio \
    -fsdev local,security_model=passthrough,id=fsdev0,path="$TMPDIR/test-deploy" \
    -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=alt-autorun \
    -cdrom alt-c8-deploy-*.iso

Заменяем "ответную" часть на что-то более осмысленное:

cat >test-deploy/autorun <<-EOF
#!/bin/sh -efu

export LANG="ru_RU.utf8"
export LC_ALL="ru_RU.utf8"

# Полезная нагрузка
mount -o remount,rw "$(pwd)"
dd if=/dev/sr0 bs=2M of=hybrid.iso status=progress
isohybrid hybrid.iso
sync
poweroff
EOF
chmod +x test-deploy/autorun
> test-deploy/hybrid.iso

После повторного запуска виртуалки с теми же аргументами в $TMPDIR/test-deploy/hybrid.iso появится гибридный образ. Запишем его на настоящую флэшку:

su -
umount /dev/sdb1
dd if=/tmp/.private/<USERNAME>/test-deploy/hybrid.iso \
    of=/dev/sdb bs=2M oflag=direct status=progress; sync
fdisk /dev/sdb # здесь добавляем второй раздел типа Linux
wipefs -a /dev/sdb2
mkfs.ext2 -q -L alt-autorun /dev/sdb2
mount -t ext2 /dev/sdb2 /mnt

Кладём в /mnt нужные файлы (например, образы настроенных систем), и сюда же кладём <ВАШ_СКРИПТ> (под именем autorun), делаем его исполняемым, размонтируем флэшку и идём с ней на компьютер, на который будем этот образ накатывать.