这是一次盲目的尝试……
我正在使用一项名为 Strato-Server-Cloud 的服务,它基本上是 AWS 或 Google-Compute 的初级版本。他们最近更改了界面和/或引擎。从那时起,我创建的所有新 Ubuntu 16 实例都存在其主机名在重启时被恢复的问题。
这是我通常做的事情:
/etc/主机名
www.example.com
/etc/hosts
127.0.0.1 www.example.com www
[...]
在 Ubuntu 16 上另外:
hostnamectl set-hostname www
完成上述步骤后:
hostname -> www
hostname -f -> www.example.com
主机名控制
Static hostname: www
Icon name: computer-vm
Chassis: vm
Machine ID: [ID]
Boot ID: [ID]
Virtualization: microsoft
Operating System: Ubuntu 16.04.1 LTS
Kernel: Linux 4.4.0-59-generic
Architecture: x86-64
重启后重启
hostname -> XXX
hostname -f -> XXX.strato.net
主机名控制
Static hostname: www
Transient hostname: XXX
Icon name: computer-vm
Chassis: vm
Machine ID: [ID]
Boot ID: [ID]
Virtualization: microsoft
Operating System: Ubuntu 16.04.1 LTS
Kernel: Linux 4.4.0-59-generic
Architecture: x86-64
记下临时主机名
奇怪的是,主机和主机名文件是完整的。
我还尝试将 /etc/init/hostname.conf 更改为以下内容
description "set system hostname"
start on startup
task
exec hostname -b -F /etc/hostname.mod; full=$(cat /etc/hostname.mod);short=(${full//./ }); hostnamectl set-hostname $short
我还将主机名放入 /etc/hostname.mod 中,以确保不会发生覆盖。手动执行上述 exec 语句可以修复所有问题,但在启动过程中似乎不起作用...
不幸的是,我在这里很迷茫……我假设 /etc/init/hostname.conf 在启动期间执行,但主机名被另一个脚本覆盖?有没有人遇到过这样的问题并知道如何解决?我想我可以研究一下某个 Linux 版本的文件间谍,记录哪些进程接触了哪些文件,然后通过这种方式找到有问题的脚本……然而,这听起来确实需要做很多工作……
如果有人至少可以指出主机名的生命周期,即如何确定它的步骤以及在哪里可以挂钩它,这将对我有很大帮助。
提前感谢您的时间和精力
编辑
我想这也有助于解释为什么这很糟糕 :-) 如果主机名配置不正确,OpenLDAP 会拒绝在 STARTTLS 模式下正常工作。由于我从未遇到过无法更改主机名的问题,所以我不知道其他哪些服务也可能出现故障。因此,在启动 OpenLDAP 等服务之前,必须先对该问题进行最小限度的解决方案。
答案1
对于通过 dchp 获取其 IP 地址的计算机,默认客户端文件/etc/dhcp/dhclient.conf
包括询问host-name
请求中应包含的内容:
request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, domain-search, host-name,
dhcp6.name-servers, dhcp6.domain-search, dhcp6.fqdn, dhcp6.sntp-servers,
netbios-name-servers, netbios-scope, interface-mtu,
rfc3442-classless-static-routes, ntp-servers;
您可以从请求中删除它:
request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, domain-search,
dhcp6.name-servers, dhcp6.domain-search, dhcp6.fqdn, dhcp6.sntp-servers,
netbios-name-servers, netbios-scope, interface-mtu,
rfc3442-classless-static-routes, ntp-servers;
我不确定:是否可能会产生意想不到的副作用;域名也应该从请求中删除。
答案2
我知道这是旧帖子,但这篇文章帮助我解决了同样的问题。我正在更新这篇文章,以便将来遇到同样问题的搜索引擎用户能够使用。
这次不是 hostnamectl 的错。
如果您尝试更改 VPS 服务器上的主机名但它不想更改 - 您的 VM 可能正在从主机/虚拟机管理程序获取其主机名。
就我而言,我必须登录 VPS 提供商仪表板并在那里更改主机名。
答案3
这个答案可能会对那些试图制作 liveCD 的人有所帮助。
如果您要制作由 isolinux+casper 启动的 liveCD,则需要小心。在您的 liveCD 上安装 casper 将更改 initrd 的内容。因此,当系统启动时,它将主要使用 casper 的配置来生成主机名(或其他内容),而不是读取 /etc/hostname。
我参考了 Casper 的源代码,发现以下几行
# Allow to override USERNAME and HOST based on media information
# make it skipable by setting FLAVOUR= in casper.conf
if [ -f /cdrom/.disk/info ] && [ -z "$FLAVOUR" ]; then
FLAVOUR="$(cut -d' ' -f1 "/cdrom/.disk/info" 2>/dev/null | tr '[A-Z]' '[a-z]')" || FLAVOUR=
if [ -n "$FLAVOUR" ]; then
HOST=$FLAVOUR
USERNAME=$FLAVOUR
export HOST USERNAME
sed -i "s,USERNAME=.*,USERNAME=\"$FLAVOUR\",g; s,HOST=.*,HOST=\"$FLAVOUR\",g" /etc/casper.conf
fi
fi
因此,您可以创建一个“ .disk”文件夹或直接更改 /etc/casper.conf 来更改主机名。
vim gen-image.sh
================
#!/bin/bash
cd IMAGE_DIR
rm -rf .disk
mkdir .disk
touch base_installable
echo "full_cd/single" >cd_type
echo "YOUR_CUSTOM_HOST_NAME" >info
echo "YOUR_CUSTOM_URL" >release_nots_url
cd ..
# GENERATE IMAGE HERE