进一步阅读

进一步阅读

嘿嘿!我目前正在从头开始开发一个非 lfs 系统,以 busybox 为明星。现在,我的登录信息显示:

(none) login:

因此,我的主机名已损坏。也hostname带我来(none)

我遵循的指南告诉我将主机名扔到/etc/HOSTNAME.我也尝试过/etc/hostname。无论我做什么,hostname都会返回(none)- 除非我运行hostname <thename>hostname -F /etc/hostname.现在显然,我不希望每次有人新安装发行版时都执行此操作 - 那么真正的默认文件是什么,如果不是的话/etc/hostname

提前致谢!

答案1

hostname(包括 BusyBox)在查询主机名时不会回退到文件。它们仅报告内核从系统调用中作为主机名返回给它们的内容,内核将其初始化为诸如“(none)”之类的字符串,可以通过重新配置和重建内核来更改。 (在 systemd 术语中,这是动态主机名,又名临时主机名; Linux 内核实际报告的那个。)没有“默认文件”。

通常有一个单次服务在系统启动时运行,相当早,它会查找这些不同的文件,提取主机名,并用它初始化内核主机名。 (在 systemd 术语中,此配置字符串是静态主机名。) 例如:

  • 在我的工具集中,我提供了一个“早期”hostname服务,该服务在本地文件系统安装之后和用户登录服务之前运行工具集的set-dynamic-hostname命令。这项工作分为(仅)在更改配置时完成的工作和(每次)系统引导时完成的工作:
    • 外部配置导入机制读取/etc/hostname和 以及/etc/HOSTNAME其他源(因为不同的操作系统以不同的方式配置它),并生成一个合并的rc.conf.
    • 外部配置导入机制使用合并rc.conf来配置该服务的hostname环境变量。
    • 当服务运行时,set-dynamic-hostname不需要关心所有配置源的可能性,只需从为服务配置的环境中获取环境变量,并从中设置动态主机名。
  • 在 systemd 中,这是一个硬连线到其自身代码中的初始化操作systemd,它在服务管理启动之前运行。程序systemd本身会读取/etc/hostname(并且也/proc/cmdline,但是不是 /etc/HOSTNAME 也不 /etc/default/hostname 也不 /etc/sysconfig/network)并将其传递给内核。
  • 在Void Linux中有启动 shell 脚本(仅)从 读取静态主机名/etc/hostname,并回退到从 读取的 shell 变量rc.conf,并从其值设置动态主机名。

如果您“从头开始”构建一个系统,那么您必须创建一个具有同等功能的服务。用于从文件设置主机名的 BusyBox 和 ToyBox 工具是hostname -F "${filename}",因此您必须创建一个针对/etc/hostname某个文件运行该命令的服务。

BusyBox 附带了 runit 的服务管理工具集,一个简单的 runit 服务将类似于:

#!/bin/sh -e
执行2>&1
执行主机名 -F /etc/主机名

进一步阅读

答案2

所以您正在从头开始构建这个系统,并且您想知道主机名是在哪里配置的?

简单的答案是事实并非如此。当前主机名存储在内核内部,与内核的大多数内容一样,默认情况下它不读取任何文件。

某物在系统启动时必须读取配置文件(您选择的)并设置内核的主机名。每次启动都必须发生这种情况。

答案3

make menuconfig您可以在构建内核时更改它。

相关内容