Изменение имени хоста при загрузке в Debian Stretch

1333
user2747949

Я хотел бы настроить машину Debian Stretch таким образом, чтобы она устанавливала имя хоста при загрузке на основе серийного номера машины. Это связано с тем, что ОС на настраиваемой машине будет скопирована на несколько других машин, и они должны иметь возможность автоматически устанавливать свое (уникальное) имя хоста при загрузке.

Я создал сервис systemd для этого. Служба вызывает сценарий, который проверяет серийный номер машины, определяет правильное имя хоста для этой машины, а затем редактирует эти два файла /etc/hostsи /etc/hostnameсоответственно. Я настроил службу для запуска после того, как файловые системы будут готовы и до того, как настроена сеть. Вот:

[Unit] DefaultDependencies=no Requires=local-fs.target After=local-fs.target Before=network-pre.target Wants=network-pre.target  [Service] Type=oneshot ExecStart=/usr/local/bin/set-hostname.sh RemainAfterExit=yes  [Install] WantedBy=network.target 

Когда машина загружается, я вижу, что два файла были отредактированы правильно. Тем не менее в командной строке по-прежнему отображается старое имя хоста (которое было /etc/hostnameдо перезагрузки), и если я запускаю команду, hostnamectlя получаю следующую информацию:

Static hostname: new_correct_hostname Transient hostname: old_hostname 

где new_correct_hostnameтот, который был сгенерирован моим скриптом и записан в /etc/hostnameи /etc/hostsпри загрузке, а old_hostnameтот, который был в этих файлах до перезагрузки.

Почему временное имя хоста не обновляется правильно, когда сеть работает? Есть ли какой-либо другой сервис, который устанавливает его до того, как мой скрипт его изменит?

3

1 ответ на вопрос

1
Marek Rost

В соответствии со manстраницей для hostnamectl временное имя хоста считывается из конфигурации сети и не используется, если статическое имя хоста настроено и допустимо.

Это предполагает, что может быть некоторая конфигурация кэшированной сети с предыдущим именем хоста, которая устанавливает ваше временное имя хоста на старое. Дальнейшее расследование будет зависеть от метода и услуги, которые вы используете для подключения к сети.

В качестве альтернативы, если вы хотите быть абсолютно уверены, что ваше имя хоста во время выполнения задано правильно, вы можете сообщить ядру Linux либо командой, /bin/hostnameпредоставленной hostnameпакетом, либо вручную вставив новое имя в /proc/sys/kernel/hostname, например:

echo myhost > /proc/sys/kernel/hostname 

Любая вновь открытая оболочка входа в систему покажет обновленное имя хоста после того, как это выполнено.

Похожие вопросы