3

Я хотел бы настроить машину 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 - это то, что было в этих файлах до перезагрузки.

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

1 ответ1

1

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

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

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

echo myhost > /proc/sys/kernel/hostname

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .