Назад | Перейти на главную страницу

Передача переменных для использования в файле preseed для установки Debian Jessie

Можно ли добавить переменную через приглашение загрузки в установщик 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".