sysvinit 串行启动、shell 脚本管理、runlevel 控制状态、服务生命周期无管控;systemd 并行启动、单元声明式配置、target 灵活组合、全生命周期托管与资源约束。

启动方式:串行 vs 并行
sysvinit 启动是严格串行的,必须等一个服务完全就绪,才能开始下一个。比如网络服务没起来,SSH 就得等着,整个过程像排队打饭。systemd 则能并行拉起多个服务,只要它们之间没有强依赖,就一起启动。这大幅缩短了开机时间,尤其在服务数量多、依赖关系复杂的现代系统中效果明显。
管理单位:脚本 vs 单元(Unit)
sysvinit 用的是 Shell 脚本,放在 /etc/init.d/ 下,靠 rcN.d 目录里的软链接控制启停顺序。写法自由但容易出错,维护成本高。systemd 把所有可管理对象——服务、挂载点、socket、定时器——都抽象成“单元”,统一用声明式配置文件(如 .service)定义,结构清晰、语义明确,例如用 WantedBy=multi-user.target 表达启动时机,不再靠文件名排序猜意图。
运行目标:runlevel vs target
sysvinit 用数字 runlevel(0–6)表示系统状态,比如 runlevel 3 是字符界面多用户,runlevel 5 是图形界面。切换靠 init 3 命令,本质是切换执行哪组脚本。systemd 改用更灵活的 target 单元,比如 multi-user.target 或 graphical.target,它们本身不干具体事,而是通过 Wants 和 Requires 汇集一批服务。系统默认进入哪个 target,由 /etc/systemd/system/default.target 软链接决定,改个链接就能换模式,不用动逻辑。
服务生命周期与上下文
sysvinit 对服务几乎不干预,进程 fork 出去后就放手不管;日志、环境、工作目录、权限全靠脚本自己处理。systemd 主动接管整个生命周期:自动记录日志到 journald、限制资源使用(cgroups)、支持 socket 激活(服务按需启动)、能感知进程是否真正就绪(Type=notify)。它默认环境极简,PATH 只有 /usr/bin:/bin,所以服务里调外部命令要显式设 Environment=PATH=...,否则手动能跑、systemctl 启动就失败。










