摘要

当我们在 Linux 系统中运行与 systemd 相关的命令时,可能会遇到以下错误提示:
System has not been booted with systemd as init system (PID 1)
这通常是因为当前运行的 Linux 系统未使用 systemd 作为其初始化系统,可能是因为使用了容器化环境(如 Docker)或选择了其他初始化系统(如 sysvinit)。本篇文章将详细介绍该问题的原因,并为你提供多种解决方案,确保系统服务能够正常管理和运行。


引言

在 Linux 系统中,systemd 是一种常用的初始化系统和服务管理器。它的主要作用是启动用户空间服务、管理进程和日志。然而,在某些场景中(例如运行容器、定制化的轻量级系统),systemd 可能未被启用。这时,运行与 systemd 相关的命令会抛出错误。

常见错误场景:

  • 在 Docker 容器中尝试运行 systemctl
  • 使用了非 systemd 的初始化系统(如 init)。
  • Linux 环境被自定义,仅包含最小化配置。

通过本文,你将学会如何排查和解决这个问题,即便是新手也能快速上手!

在这里插入图片描述

博主 默语带您 Go to New World.
个人主页—— 默语 的博客👦🏻 优秀内容
《java 面试题大全》
《java 专栏》
《idea技术专区》
《spring boot 技术专区》
《MyBatis从入门到精通》
《23种设计模式》
《经典算法学习》
《spring 学习》
《MYSQL从入门到精通》数据库是开发者必会基础之一~
🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭
🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨


默语是谁?

大家好,我是 默语,别名默语博主,擅长的技术领域包括Java、运维和人工智能。我的技术背景扎实,涵盖了从后端开发到前端框架的各个方面,特别是在Java 性能优化、多线程编程、算法优化等领域有深厚造诣。

目前,我活跃在CSDN、掘金、阿里云和 51CTO等平台,全网拥有超过10万的粉丝,总阅读量超过1400 万。统一 IP 名称为 默语 或者 默语博主。我是 CSDN 博客专家、阿里云专家博主和掘金博客专家,曾获博客专家、优秀社区主理人等多项荣誉,并在 2023 年度博客之星评选中名列前 50。我还是 Java 高级工程师、自媒体博主,北京城市开发者社区的主理人,拥有丰富的项目开发经验和产品设计能力。希望通过我的分享,帮助大家更好地了解和使用各类技术产品,在不断的学习过程中,可以帮助到更多的人,结交更多的朋友.


我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。


System has not been booted with systemd as init system (PID 1):系统未使用 systemd 引导完美解决方法


正文

一、错误原因解析

运行 systemctl 时遇到以下错误:

System has not been booted with systemd as init system (PID 1). Can't operate.
1. 初始化系统简介

Linux 系统初始化过程由一个特殊的进程(init)负责,systemd 是目前最流行的初始化系统之一。然而,并不是所有的 Linux 发行版或运行环境都默认使用 systemd,例如:

  • 容器环境:大多数 Docker 容器基于轻量级基础镜像(如 Alpine),不使用 systemd
  • 替代初始化系统sysvinitupstart 等。
2. 错误原因分类
  • 容器化环境:容器通常不会加载完整的 systemd,因为它增加了不必要的复杂性。
  • 内核配置限制:某些 Linux 内核配置禁止使用 systemd
  • 轻量级系统:如 WSL(Windows Subsystem for Linux)可能使用 init 或其他兼容模式。

二、解决方案

方法一:确认当前初始化系统
  1. 使用 ps 查看 PID 1 的进程:

    ps -p 1 -o comm=
    

    输出结果可能为:

    • systemd:系统正常运行 systemd
    • init 或其他:系统未使用 systemd
  2. 检查是否支持 systemd

    ls /lib/systemd/system
    

    如果目录不存在,说明 systemd 未安装或未配置。


方法二:在容器中启用 systemd

如果你在容器中遇到该问题,可以尝试以下方法。

1. 使用支持 systemd 的基础镜像

选择基于 systemd 的镜像(如 ubuntucentos),并确保启用了 systemd

FROM ubuntu:20.04

RUN apt-get update && apt-get install -y systemd
CMD ["/bin/bash"]
2. 配置容器支持 systemd

启动容器时添加 --privileged 和挂载 /sys/fs/cgroup

docker run --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro -it your_image_name
3. 使用 docker systemctl 替代

安装第三方工具 docker-systemctl-replacement,模拟 systemctl 功能。

curl -L -o /usr/bin/systemctl https://raw.githubusercontent.com/gdraheim/docker-systemctl-replacement/master/files/docker/systemctl.py
chmod +x /usr/bin/systemctl

方法三:手动管理服务

在无 systemd 的情况下,可以手动启动和管理服务。

  1. 启动服务(以 Nginx 为例):

    nginx -g "daemon off;"
    
  2. 停止服务:

    找到相关进程并结束:

    ps aux | grep nginx
    kill <PID>
    
  3. 编写简单脚本模拟服务管理:

    #!/bin/bash
    case $1 in
        start)
            echo "Starting Nginx..."
            nginx -g "daemon off;"
            ;;
        stop)
            echo "Stopping Nginx..."
            pkill nginx
            ;;
        restart)
            echo "Restarting Nginx..."
            pkill nginx
            nginx -g "daemon off;"
            ;;
        *)
            echo "Usage: $0 {start|stop|restart}"
            exit 1
            ;;
    esac
    

方法四:安装并启用 systemd

在支持安装 systemd 的环境中,可以尝试以下步骤:

  1. 安装 systemd

    sudo apt-get update
    sudo apt-get install systemd
    
  2. 配置为默认初始化系统:

    修改 /etc/inittab 或系统配置文件,确保使用 systemd

  3. 重启系统:

    sudo reboot
    

三、预防与优化建议

  1. 选择合适的环境:在需要 systemd 的场景下,优先选择支持它的 Linux 发行版或镜像。
  2. 使用轻量化替代方案:在容器中,考虑直接启动目标服务,而非依赖完整的 systemd
  3. 熟悉环境限制:例如在 WSL 或 Alpine Linux 中,避免强制依赖 systemd

总结

通过本文的介绍,相信你已经了解了 System has not been booted with systemd as init system 错误的成因及解决方法。不论是容器化环境、轻量级系统还是自定义环境,都有相应的策略可以应对。如果你在解决过程中遇到问题,欢迎随时联系我!


参考资料


交流

学习技术是一场持久战,如果你对本文的内容有任何疑问,或者希望探讨更多 Linux 系统相关问题,欢迎添加我的微信


如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;(联系微信:Solitudemind )
点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

更多推荐