【发布时间】:2016-12-22 21:17:00
【问题描述】:
我正在开发具有 3 个不同 Linux 分区的嵌入式 Linux 设备。最终用途选择从哪个分区启动。根文件系统是只读的。有第四个分区以读写方式安装。我需要 Linux 的所有实例来抵抗与 DNS 服务器相同的名称(即使用相同的主机名)。由于每个设备都需要一个唯一的主机名,因此在创建文件系统时主机名是未知的,稍后会分配主机名。我所做的是在读写分区上创建一个文件,该文件将在以后被覆盖。然后我将 /etc/hostname 更改为该文件的符号链接。我知道在安装读写分区之前无法读取该文件,我相信这是我的问题。如果我将 /etc/hostname 设置为普通文件,那么该文件中指定的任何内容都可以正常工作。更改 /etc/hosts 似乎没有任何作用。
想要的结果是控制 WiFi 连接时向 DNS 服务器注册的名称。我发现控制它的唯一方法是通过主机名。 /etc/hosts 文件似乎没有影响它。如果主机名文件不可读或未设置,则 Linux 将其默认为“localhost”,并且不会向 DNS 注册任何有用的内容。
WiFi 由启动后运行的应用程序通过 rfkill 启用。在启用 WiFi 之前在脚本中运行某些内容是一种可能的解决方案。在启用 WiFi 之前,我无法通过在命令行上更改主机名来成功更改向 DNS 注册的内容。我可以更改主机名,但在 DNS 中注册的内容不会更改。
信息:
Linux 内核是 3.14.60,是基于 yocto 的构建。
systemd 在启动时管理服务。
当前的 /etc/hosts
127.0.0.1 ABC123.localdomain ABC123
当前 /etc/主机名
SerialNumberGoesHere
以下是启动后查看主机名的所有方法:
>hostname
localhost
>hostnamectl status
Static hostname: SerialNumberGoesHere
Transient hostname: localhost
Icon name: computer
Machine ID: 4cdac8e5dce348d2bfc133dd393f6172
Boot ID: 9b8c9da934e748fc86606c4a24f57f9e
Operating System: Linux
Kernel: Linux 3.14.60+g02d9429
Architecture: arm
>uname -n
localhost
>echo /proc/sys/kernel/hostname
localhost
>sysctl kernel.hostname
kernel.hostname = localhost
如您所见,“hostnamectl status”选择了正确的静态主机名,但内核没有。
在设备上
>nslookup 192.168.12.238
Server: 192.168.12.6
Address 1: 192.168.12.6 dc1.hq.com
Name: 192.168.12.238
Address 1: 192.168.12.238 linux.local
在另一台计算机上(Ping 192.168.12.238 有效)
>nslookup 192.168.12.238
Server: 127.0.1.1
Address: 127.0.1.1#53
** server can't find 238.12.168.192.in-addr.arpa: NXDOMAIN
如果我将主机名符号链接更改为真实文件,这是期望的结果:
>hostname
SerialNumberGoesHere
>hostnamectl status
Static hostname: SerialNumberGoesHere
Icon name: computer
Machine ID: 4cdac8e5dce348d2bfc133dd393f6172
Boot ID: ed760b42b7ae414881bc2d9352a8bb82
Operating System: ARANZ Sugar-Free Silhouette Star M2 (fido)
Kernel: Linux 3.14.60+g02d9429
Architecture: arm
>uname -n
SerialNumberGoesHere
>echo /proc/sys/kernel/hostname
SerialNumberGoesHere
>sysctl kernel.hostname
kernel.hostname = SerialNumberGoesHere
在设备上
> nslookup 192.168.12.238
Server: 192.168.12.7
Address 1: 192.168.12.7 dc1.hq.com
Name: 192.168.12.238
Address 1: 192.168.12.238 serialnumbergoeshere.hq.com
在另一台计算机上
> nslookup 192.168.12.238
Server: 127.0.1.1
Address: 127.0.1.1#53
238.12.168.192.in-addr.arpa name = serialnumbergoeshere.hq.com.
2017 年 1 月 10 日更新
我找到了答案。您必须在执行 hostname 命令后重新启动网络服务。
systemctl 重启 systemd-networkd.service
【问题讨论】:
-
在挂载 r/w 分区后和初始化 wifi 之前重新读取主机名 (hostname -F /path/to/file iirc) 以及任何其他服务会注意主机名
-
您能否创建一个自定义 systemd 单元,该单元设置为在挂载文件系统之后但在 systemd-networkd.service 之前运行?