我想配置一台 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
根据man
hostnamectl 页面,临时主机名是从网络配置中读取的,如果静态主机名已配置且有效,则不会使用临时主机名。
这表明可能存在一些缓存的网络配置,其中包含以前的主机名,这些配置会将您的临时主机名设置为旧主机名。进一步的调查将取决于您用于连接网络的方法和服务。
或者,如果您想绝对确定您的运行时主机名设置正确,您可以通过包/bin/hostname
提供的命令hostname
或手动插入新名称来让 Linux 内核知道/proc/sys/kernel/hostname
,例如:
echo myhost > /proc/sys/kernel/hostname
执行此操作后,任何新打开的登录 shell 都将显示更新的主机名。