
Linux是一个内核而非完整的操作系统,其上运行着多种发行版,例如Debian、Fedora和Ubuntu等。
由Mark Shuttleworth开发的Ubuntu是全球最受欢迎和广泛使用的发行版之一。作为开源且免费的系统,Ubuntu 经常更新,每年发布新版本,其开发由成千上万的开发者共同贡献完成。
但Ubuntu是如何在内部运行的?其操作受哪些进程和事件驱动?这些为何重要?本文将深入解析 Ubuntu 的内部工作原理,即使是初学者也能轻松理解。
Ubuntu 的系统结构
Ubuntu 的核心功能(如电源管理、启动和系统崩溃处理)依赖于一套强大的进程系统。Ubuntu 中的每个系统服务都被视为一个进程,其配置文件位于 /etc/init/ 目录中。
这些配置文件定义了触发进程启动和停止的事件,使 Ubuntu 成为一个事件驱动的系统。
Ubuntu 事件驱动系统的核心是 init 进程(进程 ID 为 1)。这是系统启动时运行的第一个进程,并一直运行到系统关闭为止。
它在启动和关闭事件的管理中扮演着至关重要的角色,同时也是所有其他进程的父进程,确保系统从启动到关闭都能顺利运行。
从 Upstart 到 systemd 的过渡
Ubuntu 曾使用 Upstart 作为其事件驱动的 init 系统,该系统在 2014 年 9 月更新至 1.13.2 版本后停止维护。
从 2015 年 4 月发布的 Ubuntu 15.04(Vivid Vervet)开始,Ubuntu 将默认的 init 系统从 Upstart 切换为 systemd。
相比 Upstart,systemd 是一个更高级的 init 系统,提供了更灵活的进程管理、更高效的并行化处理,以及对服务的更强控制。
systemd 还简化了启动管理和服务监督,成为包括 Ubuntu 在内的大多数现代 Linux 发行版的标准 init 系统。
Ubuntu 中的启动过程(基于 systemd)
当系统启动时,init 是被触发的第一个进程,之后它以层级方式启动其他进程。在使用 systemd 的典型 Ubuntu 系统中,启动顺序如下:
Init(PID 1):系统启动时的第一个进程,它设置系统环境并触发后续事件。
systemd:接管 init 后成为主进程,负责启动所有其他系统服务(称为“单元”)。这些单元定义在 /etc/systemd/system 和 /lib/systemd/system 中的单元文件中。
启动服务:systemd 开始引导启动基本服务,例如挂载文件系统、加载内核模块和设置网络连接。
文件系统挂载:如 mountall 等服务负责挂载本地和远程文件系统。systemd 通过事件通知其他服务何时可以继续操作。
显示管理器:基础服务设置完成后,显示管理器(如 gdm 或 lightdm)启动,允许用户登录。
用户会话初始化:登录后,系统加载用户环境设置,启动图形用户界面,并运行用户特定的进程。
systemd 的关键目标和事件
默认目标(default.target):系统启动完成后达到的最终状态,通常设置为 graphical.target,用于启动用户界面。
多用户目标(multi-user.target):用于非图形的多用户环境。
救援目标(rescue.target):提供单用户模式,适用于系统修复场景。
进程与事件管理
在 Ubuntu 中,每个系统服务或进程都与事件相关联。例如,systemd 和其他服务管理器通过单元文件指定服务启动和停止的条件。这些条件定义了进程应何时基于系统事件触发(如系统启动或某个文件挂载)。
Ubuntu 的事件驱动模型中有两类进程:
短生命周期进程(Work-and-die jobs):这些进程在完成任务后终止,例如挂载文件系统或加载内核模块。
长生命周期进程(Stay-and-work jobs):这些进程在系统运行期间持续存在,管理关键服务,如网络、日志记录和用户会话。
systemd 的单元类型
服务单元(.service):定义由 systemd 管理的服务。
套接字单元(.socket):定义通信端点。
目标单元(.target):定义服务的分组,用于特定目的或启动过程中的某个阶段。
systemd 进程的层次结构
在采用 systemd 后,Ubuntu 中的进程按照层级结构组织,每个服务都依赖其他服务的正常运行。systemd 服务管理器通过单元文件创建和管理这些依赖关系。
层级结构如下:
systemd(PID 1) -> 基础服务(如挂载、内核模块) -> 显示管理器 -> 用户会话
启动过程中关键服务与事件
hostname:设置系统主机名,配置文件为 /etc/hostname。
kmod:加载 /etc/modules 中定义的内核模块。
mountall:挂载所有本地和远程文件系统,包括 /proc 和 /sys。
plymouth:在启动过程中显示闪屏,为用户提供视觉反馈。
其他关键服务还包括 dbus(用于进程间通信)、network-manager(用于网络配置)和 udev(用于设备管理)。
Ubuntu 的启动过程多年来经历了显著变化。从早期版本使用的 Upstart,到现代版本(15.04 起)默认采用的 systemd,其改进包括更好的并行化、更简化的服务管理以及更强的灵活性。
理解systemd的工作方式对于想要深入了解操作系统内部工作原理、管理服务或解决启动相关问题的用户至关重要。通过掌握 systemd 单元、目标和事件的关键概念,您可以更深入地理解 Ubuntu 在启动及其后续运行中的运作方式。











