一些背景:
我最近通过一种奇怪的方式在 chromebook 上安装了 Arch Linux,其中我使用安装脚本来安装 Ubuntu,然后用 Arch rootfs 覆盖 Ubuntu rootfs。我不确定这背后的机制是什么(如下所示:https://wiki.archlinux.org/index.php/Acer_C7_Chromebook)。
Linux 在 chroot 进入 rootfs 之前运行的部分对于所有 Linux 发行版来说都是通用的(这就是为什么初始引导对 Arch 和 Ubuntu 都有效)?或者,更一般地说,哪些软件在所有 Linux 发行版中是通用的,即定义 Linux 发行版?
答案1
Q#1:或者,更一般地说,哪些软件在所有 Linux 发行版中是通用的,即定义一个 Linux 发行版?
如果我们谈论的是 GNU/Linux 发行版,我肯定可以猜测各个发行版的用户区几乎是相同的。
我想不出有哪一个可以在不使用 GNU Coreutils、GNU Binutils、GNU Bash、GNU Compiler Collection 等的情况下运行。
现在,如果您想要的只是 Linux 发行版的组成部分的定义,那么用一句话来说:这是 Linux 内核,还有一个用户空间,这是一组在该内核之上运行的软件,以使其对您有用。
大多数 Linux 发行版还使用某种软件管理系统,例如,为了简化软件安装和配置(无论是通过像 Debian 这样的二进制包管理,还是像 Gentoo 这样的源包管理),并且偶尔,一些发行版特定的软件,例如管理工具(我可以想到debconf
Debian 或yast
OpenSuse 等)。如果您想要更明确的答案,您一定应该看看Linux 从头开始
Q#2:在 chroot 进入 rootfs 之前运行的 Linux 部分对于所有 Linux 发行版来说都是通用的(这就是为什么初始引导对 Arch 和 Ubuntu 都有效)?
是和不是。大多数发行版使用以下步骤的稍微修改版本,但不同部分的技术选择可能不同。例如,不同的引导加载程序(GRUB、Lilo 等)。
摘自维基百科文章标题:Linux启动过程
- BIOS 执行特定于硬件平台的启动任务
- 一旦硬件被正确识别并启动,BIOS 就会从指定的引导设备加载并执行分区引导代码,其中包含 Linux 引导加载程序的第 1 阶段。第 1 阶段加载第 2 阶段(引导加载程序代码的大部分)。某些加载器可能会使用中间阶段(称为阶段 1.5)来实现此目的,因为如果没有进一步的代码,现代大型磁盘可能无法完全读取。
- 引导加载程序通常会向用户提供可能的引导选项的菜单。然后,它加载操作系统,解压到内存中,并在调用 start_kernel() 之前设置系统功能,例如基本硬件和内存分页。
- 然后,start_kernel() 在分别生成空闲进程和调度程序以及 Init 进程(在用户空间中执行)之前执行大部分系统设置(中断、其余内存管理、设备初始化、驱动程序等)。
- Init 进程根据需要执行脚本,设置所有非操作系统服务和结构,以便创建用户环境,然后向用户显示登录屏幕。
更多细节
表面上的复杂性(第一阶段引导加载程序调用第二阶段)与 PC 的成长历史有关,随着 IBM 和其他公司标准化各种子系统的设计以及它们如何协同工作,一切都被固定下来。
另一个复杂性来自 Linux 的本质,其中各种组件都是模块化且可互换的。这种模块化设计是有代价的,您在这里可以看到架构的过度设计。请记住,Linux 可以在多种硬件平台上启动并支持多种文件系统,因此这在一定程度上是所有这些选择的结果。