浅析Linux初始化init系统之第5部分: OpenRC
2025-04-23 09:59:24 阿炯

OpenRC是一个在类Unix系统基于依赖的初始化(init)系统。由Roy Marples于2007年4月创建,他也是活跃于 Gentoo计划的NetBSD开发者。

OpenRC是GentooAlpine、Hyperbola GNU/Linux-libre、Parabola GNU/Linux-libre、Artix、Maemo Leste、TrueOS和其他类unix系统的缺省init系统,而其他一些发行版比如Devuan把它作为一个选项提供。这意味着这些支持它的系统/发行版的软件包和守护进程(daemon),带有或使用可获得的脚本。采用C语言编写开发并在两类的BSD许可协议授权。


特点
在Linux、TrueOS、FreeBSD和NetBSD之间可移植。
并行的服务启动(缺省关闭)。
基于依赖的引导。
通过cgroups的进程隔离。
每服务资源限制(ulimit)。
代码和配置分离(init.d / conf.d)。
可扩展的启动脚本。
有状态的init脚本(它已经启动了吗?)。
启动多个组件的复杂init脚本(Samba(smbd和nmbd),NFS(nfsd、portmap等))。
自动的依赖计算和服务定序。
模块化架构和可选组件的分离(Cron、syslog)。
有表达力和灵活性的网络处理(包括VPN,网桥等)。
冗长调试模式。


OpenRC构成自一些模块组件,主要的组件是init(可选)、核心依赖管理系统和守护进程监管器(supervisor)(可选)。它用C语言和遵循POSIX的shell写成,这使得它在BSD和Linux系统上均可使用。其核心部分处理依赖管理和init脚本分析。它通过扫描运行级别,建造依赖图,接着启动需要的服务脚本来工作。一旦脚本都已经启动它就退出。缺省的,OpenRC使用一个修改版本的start-stop-daemon用于守护进程管理。

init脚本享有与SysVinit使用的脚本的相似性,但是提供了一些特征来简化它们的创建。脚本都假定有start()、stop()和status(),而系统使用已经声明的变量来创建这些缺省函数。使用依赖函数来声明对其他服务的依赖性,这在SysVinit中是用LSB头完成的。配置和机制是分离的,分别采用在conf.d目录中的配置文件和在init.d目录中的init文件。

Openrc-init在版本0.25中用作对/sbin/init的可选的替代,还支持一些其他init包括SysVinit和BusyBox。监管守护进程(supervise-daemon)首次出现在版本0.21中,给予openrc监管能力。它可以在init脚本中启用,用作启动和监控一个守护进程的监管守护进程。支持一些其他其他守护进程监管器包括runit和s6。

最新版本:0.61


项目主页:https://github.com/OpenRC/