Можно ли добавить переменную через приглашение загрузки в установщик Debian, чтобы эту переменную можно было использовать в файле preseed?
В частности, я пытаюсь решить следующую проблему:
У нас есть довольно обширный сценарий после установки, который обычно загружается с сервера. Но теперь я хочу создать образы Packer и сохранить сценарий после установки в системе управления версиями вместе с другими файлами Packer. Для доступа к preseed я могу ввести "preseed / url = http: // {{.HTTPIP}}: {{.HTTPPort}} / preseed.cfg" в команде загрузки. Но теперь я хочу, чтобы установщик загрузил сценарий после установки из того же места.
В настоящее время хук после установки выглядит так:
d-i preseed/late_command string wget -q -O /tmp/postinstall.sh http://our.public.server/postinstall.jessie.sh ; sh /tmp/postinstall.sh
В идеале я бы хотел сделать что-то вроде:
d-i preseed/late_command string wget -q -O /tmp/postinstall.sh http://{{ .HTTPIP }}:{{ .HTTPPort }}/postinstall.jessie.sh ; sh /tmp/postinstall.sh
Но, конечно, установщик Debian не заменит те, которые имеют требуемые значения. Итак, я подумал, что можно передать установщику переменные, подобные переменным среды, которые мы можем использовать в файле preseed.
Любые подсказки и подсказки приветствуются!
РЕДАКТИРОВАТЬ: попытался добавить late_command в команду загрузки, но это не получилось.
РЕДАКТИРОВАТЬ: пробовал preseed / run, но он работает в другой среде, которая не позволяет использовать команду in-target.
РЕДАКТИРОВАТЬ: это может быть обходным путем: Как связать команды вместе в файле preseed debian? Но я бы предпочел, чтобы сценарий был в отдельном файле. Если это невозможно, то это невозможно.
Это зависит от того, какую ОС вы используете, но ядро Linux позволяет вам указывать переменные среды в качестве параметров ядра. Ядро Linux документация содержит полезную информацию (важный абзац выделен жирным шрифтом):
Список аргументов
Командная строка ядра разбирается на список строк (аргументов загрузки), разделенных пробелами. Большинство аргументов загрузки имеют форму:
name[=value_1][,value_2]...[,value_10]
где 'name' - уникальное ключевое слово, которое используется для определения, какой части ядра должны быть присвоены связанные значения (если таковые имеются). Обратите внимание, что ограничение в 10 реально, так как настоящий код обрабатывает только 10 параметров, разделенных запятыми, на ключевое слово. (Однако вы можете повторно использовать одно и то же ключевое слово с дополнительными 10 параметрами в необычно сложных ситуациях,> при условии, что функция настройки поддерживает его.)
Большая часть сортировки закодирована в исходном файле ядра init / main.c. Во-первых, ядро проверяет, является ли аргумент каким-либо из специальных аргументов root =, nfsroot =, nfsaddrs =, ro, rw, debug или init. Смысл этих специальных аргументов описан ниже.
Затем он просматривает список функций настройки, чтобы увидеть, связана ли указанная строка аргумента (например, 'foo') с функцией настройки ('foo_setup ()') для определенного устройства или части ядра. Если вы передали ядру строку foo = 3,4,5,6, тогда ядро будет искать в массиве bootsetups, чтобы увидеть, было ли зарегистрировано 'foo'. Если бы это было так, то он вызвал бы функцию настройки, связанную с 'foo' (foo_setup ()), и передал бы ей аргументы 3, 4, 5 и 6, как указано в командной строке ядра.
Все, что имеет форму 'foo = bar', которая не принимается в качестве функции настройки, как описано выше, затем интерпретируется как устанавливаемая переменная среды.
Пример (бесполезный?) - использовать «TERM = vt100» в качестве аргумента загрузки.Любые оставшиеся аргументы, которые не были приняты ядром и не были интерпретированы как переменные среды, затем передаются в PID 1, которым обычно является программа init (1). Самым распространенным аргументом, который передается процессу инициализации, является слово «single», которое указывает ему загружать компьютер в однопользовательском режиме, а не запускать все обычные демоны. Проверьте страницу руководства для версии init (1), установленной в вашей системе, чтобы узнать, какие аргументы она принимает.
Вот мой boot_command
раздел в моем virtualbox-iso
Builder (для Ubuntu 18.04):
boot_command:
- '<esc><esc><enter><wait>'
- '/install/vmlinuz noapic fb=false '
- 'auto=true '
- 'hostname={{.Name}} '
- 'url=http://{{.HTTPIP}}:{{.HTTPPort}}/ubuntu.seed '
- 'initrd=/install/initrd.gz '
- 'http_proxy={{user `http_proxy`}} '
- 'packer_host={{.HTTPIP}} '
- 'packer_port={{.HTTPPort}} '
- 'hello=world '
- 'quiet --- <enter>'
В http_proxy
, packer_host
, packer_port
, и hello
параметры являются необязательными и будут преобразованы ядром в переменные среды.
В моем ubuntu.seed
файл, у меня есть следующая строка, чтобы распечатать hello
переменная среды в файл:
d-i preseed/late_command string echo $hello > /target/home/packer/hello
Когда я импортирую и запускаю OVA, этот файл будет в моем домашнем каталоге с world
как его содержимое.
Хорошо, я решил это сам (с некоторой помощью @lieter_). Не особо горжусь этим, но работает:
d-i preseed/late_command string wget -q -O /tmp/postinstall.sh http://`cat /proc/cmdline | sed 's/.*url=\([^ ]\+\).*/\1/'`/d-i/jessie/postinstall.sh ; sh /tmp/postinstall.sh
Это делает то, что мне нужно, поскольку мы всегда добавляем url = в нашу командную строку при установке.
Пытаясь решить ту же проблему, я узнал о некоторой магии, заложенной в debian-installer
. Ты можешь использовать preseed_fetch
извлекать из URL-адреса, если вы добавляете /./
в точке URL-адреса, который вы хотите установить как rootpath
для других команд, чтобы выполнять их относительную выборку.
Учитывая сервер с папкой preseed и папкой сценариев с другими файлами, которые вы хотите использовать, если вы пройдете url=http://{{.HTTPIP}}:{{.HTTPPort}}/http/./preseed/ubuntu.seed
затем вы можете ссылаться на другие файлы относительно корневого пути, например preseed_fetch /scripts/somescript.sh /tmp/somescript.sh
.
d-i preseed/late_command string preseed_fetch /scripts/late_script /tmp/late_script; \
log-output -t late_script sh /tmp/late_script
Более подробную информацию можно найти на сайте https://hands.com/d-i/lenny/start.cfg и https://hands.com/d-i/ под заголовком "url = magic".