Вопрос или проблема
Мне хотелось бы узнать, как использовать результаты debconf-show
с debconf-set-selections
для предварительной настройки deb-пакетов через командную строку или внутри скрипта оболочки.
Например, если я использую
sudo debconf-get-selections | grep java7 > result; cat result
я получаю следующее:
oracle-java7-installer shared/present-oracle-license-v1-1 note
oracle-java7-installer oracle-java7-installer/local string
oracle-java7-installer shared/accepted-oracle-license-v1-1 boolean true
oracle-java7-installer shared/error-oracle-license-v1-1 error
oracle-java7-installer oracle-java7-installer/not_exist error
Как будет выглядеть правильная команда debconf-set-selections
, чтобы настроить два диалога, которые появляются во время установки?
В общем, какова правильная синтаксическая структура debconf-set-selections
? Я предполагаю, что существуют не только логические значения, такие как true или false, да и yes или no.
Я думаю, что есть много других примеров, как например, как выбрать менеджер рабочего стола по умолчанию, если lightdm
и gdm
установлены через bash-скрипт.
Существует ли общий проверенный подход для определения правильных значений для пакета debconf и написания корректного bash-скрипта, который устанавливает, например, пакет java webupt8
и предварительно выбирает значения, которые пользователь обычно должен вводить?
Вам нужно использовать предварительную настройку. Команда debconf-set-selections
задает заранее ответы на вопросы, которые задает debconf перед установкой пакета.
Например:
sudo debconf-set-selections <<< "shared/accepted-oracle-license-v1-1 boolean true"
Затем установите пакет.
sudo apt-get install -y oracle-java7-installer
Вот как это сделать пошагово:
apt update
как всегда.apt install debconf-utils
, чтобы получить доступ кdebconf-get-selections
- При установленном пакете
foo
,debconf-get-selections | grep foo
не покажет вам то, что нужно. apt install foo
и пройдите процесс вручную.debconf-get-selections | grep foo
, чтобы увидеть точные строки, которые вам нужны. Например:debconf-get-selections | grep postfix
postfix postfix/mailbox_limit string 0 postfix postfix/chattr boolean false postfix postfix/root_address string postfix postfix/bad_recipient_delimiter error postfix postfix/protocols select postfix postfix/recipient_delim string + postfix postfix/mailname string /etc/mailname postfix postfix/main_mailer_type select No configuration postfix postfix/mynetworks string 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 postfix postfix/rfc1035_violation boolean false postfix postfix/not_configured error postfix postfix/relayhost string postfix postfix/main_cf_conversion_warning boolean true postfix postfix/newaliases boolean false postfix postfix/dynamicmaps_conversion_warning boolean postfix postfix/destinations string postfix postfix/compat_conversion_warning boolean true postfix postfix/procmail boolean
- Скопируйте нужные строки и измените их. Это может потребовать некоторых проб и ошибок, чтобы выяснить, какие из них актуальны, а какие не используются в вашей конкретной ситуации. Например, мне понадобились эти две строки, чтобы полностью пропустить конфигурацию
postfix
:postfix postfix/mailname string /etc/mailname postfix postfix/main_mailer_type select No configuration
Я собрал из проб и ошибок, что:
- Неверные параметры игнорируются без ошибок. Это очень привередливо.
- Табуляцию можно заменить пробелами.
- Значение идет последним. Не заключайте его в кавычки. Я обернул ‘No configuration’ в одинарные кавычки, и это не сработало, пока я не убрал кавычки.
- Удалите пакет и его конфигурацию:
apt purge foo
. - Теперь используйте
debconf-set-selections
и передайте строки, которые вы скопировали на шаге 6. Например:debconf-set-selections <<< "postfix postfix/mailname string $(hostname)" debconf-set-selections <<< "postfix postfix/main_mailer_type select No configuration"
- Используйте
debconf-get-selections
, чтобы проверить, что вы сделали. apt install -y foo
. На этот раз вы не должны увидеть интерактивный запрос. Однако, если потребуется опция, которую вы не установили с помощьюdebconf-set-selections
, или если ей не понравится опция, установленная с помощьюdebconf-set-selections
, она все равно запросит её. Здесь и возникает процесс проб и ошибок. Повторяйте с 5 шага, пока не получите правильный результат.- Напишите свой скрипт установки.
Debconf принимает только ограниченный набор возможных значений типов, например boolean
, string
, note
, select
и другие, и к этому у него очень строгие требования.
В вашем вопросе я предполагаю, что вы хотите автоматизировать значение лицензии Java в debconf, поэтому вы можете запустить что-то вроде этого:
echo "oracle-java7-installer shared/accepted-oracle-license-v1-1 boolean true" | sudo debconf-set-selections
Если вам нужно добавить строковое значение, выполните что-то вроде этого:
echo "oracle-java7-installer oracle-java7-installer/local string java" | sudo debconf-set-selections
Если вам нужно значение выбора, вы можете выполнить:
echo "oracle-java7-installer oracle-java7-installer/legacy select true" | sudo debconf-set-selections
ПРИМЕЧАНИЕ: после выполнения этих команд убедитесь, что установлены правильные значения, с помощью чего-то вроде
sudo debconf-show oracle-java7-installer
, и затем, конечно, протестируйте это на реальной установке сервера.
Совет: Вместо
> result;cat result
вы можете использовать| tee result
, это работает очень похоже, но не ждет завершения первой команды, чтобы показать вам содержимое.
Ответ или решение
Для того чтобы использовать вывод команды debconf-show
с командой debconf-set-selections
для предварительной настройки пакетов Debian, необходимо воспользоваться механизмом предварительного заполнения (pre-seeding). Эта техника позволяет заранее задать ответы на вопросы, которые обычно задаются в процессе установки пакета.
Пример использования
Рассмотрим сценарий, когда вы хотите установить пакет oracle-java7-installer
. Следуйте этим шагам:
-
Обновите списки пакетов:
sudo apt update
-
Установите
debconf-utils
, если он еще не установлен:sudo apt install debconf-utils
-
Установите пакет вручную, чтобы пройти процесс настройки:
sudo apt install oracle-java7-installer
-
Получите список настроек со значениями, которые нужны:
sudo debconf-get-selections | grep oracle-java7-installer
Результат может выглядеть следующим образом:
oracle-java7-installer shared/present-oracle-license-v1-1 note oracle-java7-installer oracle-java7-installer/local string oracle-java7-installer shared/accepted-oracle-license-v1-1 boolean true
-
Скопируйте необходимые строки и формируйте их для
debconf-set-selections
. Например:echo "oracle-java7-installer shared/accepted-oracle-license-v1-1 boolean true" | sudo debconf-set-selections echo "oracle-java7-installer oracle-java7-installer/local string" | sudo debconf-set-selections
-
Установите пакет без интерактивного ввода:
sudo apt install -y oracle-java7-installer
Общая структура команды debconf-set-selections
Команда debconf-set-selections
принимает строки в следующем формате:
<package> <question> <type> <value>
Где:
<package>
— имя пакета,<question>
— идентификатор параметра,<type>
— тип значения (например,boolean
,string
,select
и т.д.),<value>
— значение.
Например:
- Для установки boolean значения:
echo "postfix postfix/main_mailer_type select No configuration" | sudo debconf-set-selections
- Для строки:
echo "postfix postfix/mailname string $(hostname)" | sudo debconf-set-selections
Выбор менеджера десктопа
Если у вас установлены несколько менеджеров десктопа, и вы хотите выбрать один из них, вы можете сделать это следующим образом:
echo "your-package your-package/selected-manager select lightdm" | sudo debconf-set-selections
Подход к получению корректных значений
- Первоначально установите нужный пакет вручную.
- Используйте
debconf-get-selections
для получения настроек. - Попробуйте определять необходимые значения через
echo
и выполнятьdebconf-set-selections
. - Тестируйте установку пакет. Может потребоваться несколько попыток для достижения оптимального результата.
Заключение
Используя описанные методы, вы сможете автоматизировать установку пакетов с предварительно заданными значениями конфигурации, что ускорит рабочий процесс. Не забывайте проверять установленные значения с помощью debconf-show
после настройки.