除了内核本身之外,文件系统层次结构标准也许是所有 Linux 系统唯一共有的主要功能。一些不起眼的发行版仅对其进行了轻微修改:例如,stali 使用简化版本,而 nixos 也添加了它(使 /etc 和 /bin 不可见且无法直接控制)。然而,两者都有一个“/etc”。你可以更换你的 init 系统,改变你的 PATH,用 musl 替换 glibc,选择不同的窗口管理器,桌面环境,显示服务器,合成器等等......但是如果你坐在一台正在运行的 Linux 机器上,“/etc “ 将在那里。你可以确定这一点。
这就引出了一个问题。如果你想把它放在其他地方怎么办...
在多少个地方、多少个层次上,做了“/etc”的假设。
内核是否假设它存在?
GLibc 在源代码中肯定有“/etc/hosts”硬编码。 glibc 中有多少条这样的路径?某处有一个列表吗?如果改变它们有多难?
嵌入式 Linux 镜像上的软件有多少是在其中查找的?我们怎样才能知道呢?我们可以在不重新编译的情况下更改它吗?然后,例如 Ubuntu 中还有多少需要更改的地方?
顺便说一句,我记得 10 年前,当我第一次安装 Ubuntu 时,我想做的第一件事就是将 /etc 移动到 /conf,但我很快发现它不起作用。但如果 Linux 生态系统的建立是为了让这样的事情变得可行,那会是什么样子呢?
这是一个普遍的好奇心,我问这个问题是为了更好地了解 Linux 生态系统的细节。当然,我并不期待完整的答案,但我认为有人可能有一些有用的信息或者可以为我指出正确的方向。
答案1
内核是否假设它存在?
不;内核对其所使用的文件系统的内容几乎没有假设。内核将/etc/init
在某些情况下(以及/sbin/init
其他)进行查找,并且一些临时驱动程序使用 中的帮助程序etc
,但内核在没有/etc
.
GLibc 在源代码中肯定有“/etc/hosts”硬编码。
是的,确实如此。
glibc 中有多少条这样的路径?某处有一个列表吗?如果改变它们有多难?
在我的存储库副本中,grep -r '"/etc'
找到 86 个实例。我不知道任何地方都有维护列表。更改源代码中的路径并不难。
嵌入式 Linux 镜像上的软件有多少是在其中查找的?
这更难确定。需要自己配置的程序/etc
肯定会在那里查找;许多其他人会通过库(如果只有 C 库)间接实现。前者需要更改才能使用另一条路径;后者将拾取对相关库所做的任何更改。
我们怎样才能知道呢?
grep
... 也可以看看在Debian中搜索对应的源码。
我们可以在不重新编译的情况下更改它吗?
不。一个相关的问题是重新编译之前会涉及多少更改。 Autoconf 生成的configure
脚本通常支持sysconfdir
默认为/etc
或 的选项/usr/local/etc
,但这并不能处理所有情况 - 在许多情况下,它确定程序安装并查找自己的配置文件的位置,但它不会更改程序查找的位置它需要的其他文件/etc
(请参阅 GNU C 库)。
然后,例如 Ubuntu 中还有多少需要更改的地方?
我怀疑,随着你进一步“向上”移动,这种情况会越来越少。任何用户可配置的内容最多都会在 中具有默认值/etc
,并且现在许多程序根本没有任何配置/etc
,或者即使有,也是通过某种机制提供的,而不是直接在 中查看/etc
。
但如果 Linux 生态系统的建立是为了让这样的事情变得可行,那会是什么样子呢?
它可能看起来像其中之一自由桌面网站确定程序如何查找文件的规范(XDG 等)。
答案2
你问的是 Gnu/Linux(Linux 是内核,也经常被混淆地用来描述整个操作系统。因为操作系统是内核、外壳、命令工具、库和编译器——我认为这可能是 Dennis Ritchie 说的你可以拥有没有 GNU 的 Linux:android,也可以拥有没有 Linux 的 Gnu:cygwin、Linux 1 的 Windows 子系统、Gnu/Hurd、BSD 上的 Gnu、Solaris 上的 Gnu,……)
回到你的问题
只需重新编译每个程序即可在不同的位置查找配置。
任何使用自动配置的程序都可以轻松地在不同位置进行编译。这可能有充分的理由。但为什么要改变默认值呢?
/conf
或者所有从到 的符号链接/etc
。(cd /; ln -s -T /etc /conf )