问题

Linux 出于何种考虑推出 usrmerge,将根目录下的一些文件夹合并到 /usr 下?

回答
Linux 的“根目录大瘦身”:usrmerge 的背后考量

你有没有注意到,在很多现代 Linux 系统中,像 `/bin`、`/sbin`、`/lib`、`/lib64` 这些重要的目录都“消失”了,取而代之的是 `/usr/bin`、`/usr/sbin`、`/usr/lib`、`/usr/lib64`? 这背后其实是 Linux 世界一次重要的目录结构调整,它的名字叫做 usrmerge。这次调整可不是一时兴起,而是基于一系列深思熟虑的考虑,旨在让 Linux 系统更加精简、一致和易于维护。

要理解 usrmerge 的意义,我们得先回到 Linux 最早的时光。

追溯历史:为什么最初有独立的 /bin 和 /sbin?

在 Linux 和类 Unix 系统发展的早期,文件系统的设计理念与现在有所不同。当时的计算机资源相对有限,系统也更加“精益求精”。为了最大化利用空间和简化系统启动过程,一些核心的系统二进制文件被放置在根目录下的独立目录中:

/bin: 这是“binary”的缩写,里面存放的是所有用户都可能需要的基本系统命令,例如 `ls`、`cp`、`mv` 等。这些命令是系统最基础的操作单元,即使在非常简单的环境中,用户也需要它们。
/sbin: 这是“system binary”的缩写,顾名思义,这里存放的是系统管理员(root 用户)才能使用的系统管理命令,比如 `fdisk`、`reboot`、`shutdown` 等。这些命令涉及对系统的关键配置和维护。
/lib: 这是“library”的缩写,里面存放的是应用程序和系统命令所需的共享库。这些库是程序运行时依赖的基础组件。
/lib64: 在 64 位系统出现后,为了兼容性和效率,为 64 位系统提供的共享库被单独放置在这里,而 32 位系统的库则继续放在 `/lib` 中。

这种设计有其合理性,尤其是在资源匮乏的早期。独立的 `/bin` 和 `/sbin` 目录意味着在系统启动的早期阶段,只需要挂载根文件系统(root filesystem)就可以访问到最基本的操作命令和库,而不需要等待其他文件系统(比如包含 `/usr` 的文件系统)被挂载。这对于一个需要尽可能快地启动并提供基本功能的系统来说是至关重要的。

引入 `/usr`:用户程序的集散地

随着系统功能的不断丰富,越来越多的应用程序和工具被开发出来。为了区分系统核心组件和用户安装的应用程序,一个名为 `/usr` 的目录应运而生。

/usr: 这个目录通常被认为是“Unix System Resources”的缩写,或者更简洁地说,是“user”的缩写。它包含了绝大多数非核心的、非系统启动必需的软件、库、文档、以及用户数据等。我们平时安装的各种应用程序,比如文本编辑器、浏览器、开发工具等,它们的可执行文件、库文件、配置文件等等,大多都存放在 `/usr` 的子目录中,例如 `/usr/bin`、`/usr/sbin`、`/usr/lib`、`/usr/share` 等。

冲突与冗余:usrmerge 的出现背景

从上面的描述可以看出,早期的 Linux 系统在 `/bin` 和 `/usr/bin`,`/sbin` 和 `/usr/sbin`,`/lib` 和 `/usr/lib` 中都存在大量的重复。

想象一下:

一些最基础的系统命令(如 `ls`)在 `/bin` 里有一份。
而随着系统越来越复杂,更多更高级的命令(也包括一些用户安装的工具)则被放在 `/usr/bin` 里。
问题来了,很多常用的命令,比如 `cp`,它既是基本操作,又可能在 `/usr/bin` 里有更高级的版本或者与用户环境相关的配置。

这种目录结构的划分,在早期是为了区分系统启动必需和非必需的组件。但随着时间的推移,这种划分变得越来越模糊,并且带来了许多问题:

1. 冗余和混乱: 很多重要的命令和库文件同时存在于根目录下的独立目录和 `/usr` 的子目录中。这不仅占用了宝贵的磁盘空间,也给文件查找和管理带来了额外的复杂性。如果一个工具同时存在于 `/bin` 和 `/usr/bin`,那么系统维护者就需要同时考虑这两个位置的更新和依赖关系。
2. 维护成本增加: 对于软件包开发者和系统管理员来说,这意味着需要管理两套几乎相同的目录结构。例如,当你更新一个命令时,可能需要在 `/bin` 和 `/usr/bin` 中都进行操作,或者至少需要确保它们指向的正确位置。这种重复性的工作大大增加了维护的成本和出错的可能性。
3. 对“初始 RAM 磁盘” (initramfs) 的依赖性减弱: 现代 Linux 系统在启动时,通常会使用 `initramfs` 来加载必要的驱动程序和初始化文件系统。`initramfs` 的出现大大减轻了对根目录下必须包含所有基本命令的需求。早期将核心命令放在 `/bin` 是为了在 `initramfs` 尚未完全加载前就能执行基本操作。但随着 `initramfs` 的成熟和功能增强,它已经可以包含足够多的必要组件,使得根目录下的 `/bin`、`/sbin` 等变得不再那么“绝对必要”。
4. 简化文件系统布局: 将相关的二进制文件、库文件和脚本统一放置在 `/usr` 的子目录下,使得整个文件系统结构更加清晰、统一。这有利于提高文件系统的可读性、可维护性和标准化程度。
5. 便携性与容器化: 在容器化技术(如 Docker)和系统部署日益普及的今天,一个更精简、更集中的文件系统结构更便于打包和分发。将所有用户可见的二进制文件都集中到 `/usr/bin` 等位置,可以更容易地创建轻量级的根文件系统镜像,并且在不同的发行版之间保持一定的兼容性。

usrmerge 的解决方案:统一到 `/usr`

基于以上考量,usrmerge 的核心思想就是将 `/bin`、`/sbin`、`/lib`、`/lib64` 这些目录的内容合并到 `/usr` 的相应子目录下,并保留原有的根目录下的目录,但这些目录最终会变成指向 `/usr` 子目录的符号链接。

具体来说,`usrmerge` 的操作通常是这样的:

将 `/bin` 的内容移动到 `/usr/bin`。
将 `/sbin` 的内容移动到 `/usr/sbin`。
将 `/lib` 的内容移动到 `/usr/lib`。
将 `/lib64` 的内容移动到 `/usr/lib64`。
然后,在根目录下创建一个符号链接:`/bin > /usr/bin`
`/sbin > /usr/sbin`
`/lib > /usr/lib`
`/lib64 > /usr/lib64`

这样一来,从用户的角度来看,文件系统的功能并没有改变,你仍然可以像以前一样输入 `ls`、`cp` 等命令。但是,从文件系统的内部结构来看,所有可执行文件和库都集中到了 `/usr` 下的特定目录。

带来的好处

1. 精简根目录: 根目录下的文件和目录数量大大减少,更加清晰。这对于那些需要极简环境的场景(例如嵌入式系统、容器镜像)非常有益。
2. 减少冗余: 消除了根目录和 `/usr` 之间重复的目录结构,减少了文件存储的冗余。
3. 提高一致性: 使得不同 Linux 发行版的文件系统结构更加一致,降低了学习和迁移的成本。
4. 简化打包和维护: 软件包开发者和系统管理员只需要管理一套目录结构,大大降低了维护难度。
5. 支持更灵活的文件系统挂载: 允许将根文件系统(` /`)和用户文件系统(`/usr`)分离,甚至可以放在不同的分区或存储设备上,为系统管理提供了更大的灵活性。例如,你可以将 `/usr` 分离到一个单独的、更大容量的分区,或者根据需要更方便地挂载和卸载。

并非一步到位,谨慎推进

尽管 usrmerge 的好处多多,但由于它是一个对文件系统结构产生根本性改变的操作,因此在 Linux 世界中推进并非一蹴而就。许多发行版(如 Debian、Ubuntu、Fedora)都逐步采纳了这个改变,但也有一些发行版(例如 Arch Linux)很早就采用了这个结构,而一些历史悠久的发行版则可能需要更长的过渡期。

需要注意的是,完成 usrmerge 并非仅仅是创建符号链接。它还需要确保所有依赖该目录的应用程序和脚本都能正确地找到它们所需的文件。这需要仔细的软件包管理和测试。

总而言之,usrmerge 是 Linux 在适应现代计算环境和提升系统管理效率方面的一次重要演进。它通过整合和精简文件系统结构,为构建更轻量、更一致、更易于维护的 Linux 系统奠定了基础。这就像是给你的 Linux 系统进行了一次“精装修”,虽然内部结构调整了,但对外的使用体验依然流畅,甚至更好了。

网友意见

user avatar

Archlinux 2013 年就 merge 了

另外 Arch 容易“滚炸”的一个说法就是这个合并导致需要手动干预。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有