(N.B. В этом вопросе ведущий #
указывает на корневую подсказку, а не на комментарий. Кроме того, я заменил фактическое имя хоста на <myhostname>
.)
Как debconf (7)
состояния man-страницы, dpkg-reconfigure
может быть вызван с помощью любого из нескольких интерфейсов, включая значение по умолчанию ("диалог") интерактивный интерфейс, а"не интерактивный" внешний интерфейс.
Прав ли я, думая, что бег
# dpkg-reconfigure postfix
призвать диалог front-end и нажатие Войти в ответ на каждый вопрос должно быть эквивалентно выполнение следующего?
# dpkg-reconfigure -f noninteractive postfix
Если так, то я не понимаю следующего несоответствия.
На VPS, недавно заполненном Debian 9 "Stretch" из образа моего веб-хоста (на котором уже установлен постфикс), я использовал debconf-set-selections
:
# debconf-set-selections <<< "postfix postfix/destinations string <myhostname>"
# debconf-set-selections <<< "postfix postfix/mailbox_limit string 51200000"
# debconf-set-selections <<< "postfix postfix/mailname string <myhostname>"
# debconf-set-selections <<< "postfix postfix/main_mailer_type select Internet Site"
# debconf-set-selections <<< "postfix postfix/protocols select ipv4"
# debconf-set-selections <<< "postfix postfix/root_address string root"
Если я тогда бегу dpkg-reconfigure
интерактивно и нажмите Войти на каждый вопрос я получаю:
# dpkg-reconfigure postfix
dpkg-reconfigure postfix
Removing sqlite map entry from /etc/postfix/dynamicmaps.cf
setting synchronous mail queue updates: false
Adding sqlite map entry to /etc/postfix/dynamicmaps.cf
changing /etc/mailname to <myhostname>
setting myorigin
setting destinations: localhost
setting relayhost:
setting mynetworks: 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
setting mailbox_size_limit: 51200000
setting recipient_delimiter: +
setting inet_interfaces: all
setting default_transport: smtp
setting relay_transport: smtp
setting inet_protocols: ipv4
WARNING: /etc/aliases exists, but does not have a root alias.
Postfix (main.cf) is now set up with the changes above. If you need to make
changes, edit /etc/postfix/main.cf (and others) as needed. To view Postfix
configuration values, see postconf(1).
After modifying main.cf, be sure to run 'service postfix reload'.
Running newaliases
Обратите внимание, что это довольно много, включая настройку /etc/mailname
. На этом этапе postfix готов к отправке почты.
Напротив, если я использую тот же VPS, начиная снова со свежего образа, и запускаю те же команды, за исключением вызова dpkg-reconfigure
в неинтерактивном режиме я получаю:
# dpkg-reconfigure --frontend noninteractive postfix
Removing sqlite map entry from /etc/postfix/dynamicmaps.cf
Adding sqlite map entry to /etc/postfix/dynamicmaps.cf
Postfix (main.cf) configuration was not changed. If you need to make changes,
edit /etc/postfix/main.cf (and others) as needed. To view Postfix
configuration values, see postconf(1).
After modifying main.cf, be sure to run 'service postfix reload'.
Running newaliases
Обратите внимание, что на этот раз /etc/mailname
не было установлено. Более того, на данный момент postfix не готов к отправке почты, и любые попытки сделать это приводят к появлению отказов в /var/log/mail.log
.
Если я сбегу rm /etc/postfix/main.cf
перед запуском dpkg-reconfigure --frontend noninteractive postfix
, затем /etc/mailname
и /etc/postfix/main.cf
оба в конечном итоге создаются, и postfix готов к отправке почты. Это кажется жизнеспособным обходным путем для вышеуказанного сбоя, но, безусловно, нарушает Правило наименьшего сюрприза и кажется, что это может быть неопределенное поведение, на которое нельзя полагаться.
Файлы конфигурации постфикса, включая /etc/mailname
НЕЛЬЗЯ изменить с помощью debconf-set-selections
и dpkg-reconfigure
после того, как файлы конфигурации постфикса были записаны. Я потратил слишком много часов, пытаясь понять, почему ...
Зачем?
dpkg-reconfigure -f noninteractive
возвращает значение 30 вопрос пропущен для всех вопросов (и использует debconf-set-selections
пресеты), код в /var/lib/dpkg/info/postfix.config
затем не устанавливает измененные настройки debconf и /var/lib/dpkg/info/postfix.postinst
то постфиксный конфиг не пишет.
Обходные пути?
Как вы обнаружили, обходной путь - удалить /etc/postfix/main.cf
что заставляет /var/lib/dpkg/info/postfix.postinst
написать новый конфиг для постфикса, который будет включать новый debconf-set-selections
параметры.
Альтернативное использование dpkg-reconfigure
в интерактивном режиме и подтвердите вопросы, в этом случае /var/lib/dpkg/info/postfix.config
отмечает параметры как измененные и /var/lib/dpkg/info/postfix.postinst
записывает изменения.
Альтернативный переход к управлению /etc/postfix/main.cf
и т. д. с использованием postconf. (Вероятно, хорошая идея иметь echo "postfix postfix/main_mailer_type select No configuration" | debconf-set-selections
защитная сетка)