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

在这里插入图片描述

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


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

摘要 📝

大家好,我是默语!今天我们来探讨一个常见但让人头疼的系统引导问题:“System has not been booted with systemd as init system (PID 1)”。这是很多在运行容器、WSL(Windows Subsystem for Linux)或自定义 Linux 发行版时经常遇到的错误。如果你在执行与 systemctl 相关的命令时遇到这个错误,说明当前系统并未使用 systemd 作为其初始化系统(init system)。在这篇博客中,我将深入分析该问题的成因,并提供适用于各种场景的解决方法,确保你的服务顺利运行。关键词:systemd、systemctl、WSL、PID 1、init system。

引言 🌐

Linux 系统中的 systemd 是现代 Linux 发行版默认的初始化系统,用于管理系统和服务。如果系统启动时没有正确加载 systemd,你将无法使用 systemctl 命令来管理服务。这在 WSL、某些容器环境,或特殊的发行版上尤为常见。

常见的错误提示如下:

System has not been booted with systemd as init system (PID 1). Can't operate.

这一错误提示表明当前系统的 PID 1(初始化进程)并不是 systemd,因此你无法通过 systemctl 来控制服务。那么,为什么会出现这个问题?又该如何解决呢?我们接着往下看!

正文 🔍

1. 什么是 systemd?🧐

1.1 初始化系统(Init System)的重要性

在 Linux 系统中,初始化系统 是系统启动时运行的第一个进程,通常被称为 PID 1。它负责启动其他所有的系统进程。常见的初始化系统有:

  • systemd:现代 Linux 系统中最常用的初始化系统,拥有丰富的服务管理功能。
  • SysVinit:systemd 之前的主流初始化系统,较为简单。
  • Upstart:被 Ubuntu 采用过的一种 init system。
1.2 为什么 systemd 更常见?

systemd 之所以被广泛使用,是因为它带来了更多的系统管理功能,支持并行服务启动、按需加载服务、日志管理等。这让 systemd 成为现代 Linux 发行版的首选。然而,某些环境(如 Docker 容器、WSL)默认并不使用 systemd,导致运行 systemctl 时出现上述错误。

2. 主要场景及解决方案 💡

2.1 在 WSL 中解决 systemd 问题 🛠️

Windows Subsystem for Linux (WSL) 是一个在 Windows 上运行 Linux 环境的子系统,但默认并不启用 systemd。因此,很多用户在 WSL 中尝试运行 systemctl 时会遇到错误。

解决方法:启用 systemd

WSL2 现在可以通过修改配置文件启用 systemd。步骤如下:

  1. 打开你的 WSL 发行版(如 Ubuntu),编辑 WSL 配置文件:

    sudo nano /etc/wsl.conf
    
  2. 添加以下内容启用 systemd:

    [boot]
    systemd=true
    
  3. 保存并退出,然后在 PowerShell 中重启 WSL:

    wsl --shutdown
    
  4. 重启 WSL 后,你可以使用 systemctl 来管理服务了。

示例:启用并查看 Docker 服务
sudo systemctl start docker
sudo systemctl status docker
2.2 Docker 容器中 systemd 问题的解决方案 🐳

Docker 容器通常只运行一个进程,因此它们的 init system 并不是 systemd,而是由 Docker 的 entrypoint 直接启动的进程。这意味着在默认的 Docker 容器环境中,systemctl 是无法使用的。

解决方法:使用特制的 Docker 镜像

如果你必须在容器中使用 systemd,可以使用支持 systemd 的 Docker 基础镜像,如 fedora 或者专门配置的 ubuntu 镜像。

你可以创建一个支持 systemd 的 Docker 容器:

  1. 使用以下 Dockerfile 创建支持 systemd 的容器:

    FROM ubuntu:20.04
    ENV container docker
    RUN apt-get update && apt-get install -y systemd systemd-sysv
    STOPSIGNAL SIGRTMIN+3
    CMD ["/lib/systemd/systemd"]
    
  2. 构建并运行容器:

    docker build -t systemd-container .
    docker run --privileged --rm -it systemd-container
    
2.3 自定义 Linux 发行版中的 systemd 问题 🔧

某些精简版或嵌入式 Linux 发行版可能并不默认使用 systemd。如果需要 systemd 功能,可以考虑切换初始化系统。

解决方法:切换到 systemd
  1. 确认系统是否已经安装 systemd:

    systemctl --version
    

    如果没有安装,可以通过包管理器进行安装:

    sudo apt-get install systemd
    
  2. 修改 GRUB 配置,确保系统在启动时加载 systemd。你可以通过编辑 /etc/default/grub 文件来完成:

    GRUB_CMDLINE_LINUX_DEFAULT="init=/lib/systemd/systemd"
    
  3. 更新 GRUB 并重启系统:

    sudo update-grub
    sudo reboot
    

3. 常见问题排查与解决 🎯

3.1 systemd 无法启动服务的常见原因

如果 systemd 启用后仍无法启动服务,可能是由于权限问题或者服务配置不正确。以下是一些常见问题及解决方案:

  • 权限问题:确保你以 root 用户或者通过 sudo 执行 systemctl

    sudo systemctl start <service_name>
    
  • 服务配置错误:检查服务配置文件是否存在问题。

    sudo systemctl status <service_name>
    
3.2 查看日志和错误信息

使用 journalctl 查看 systemd 日志,快速定位问题根源:

sudo journalctl -xe

4. 预防和优化 🌟

  • 为特定环境定制解决方案:根据系统环境的不同,确保在合适的场景中使用 systemd 或其他合适的 init 系统。
  • 定期更新系统:确保使用最新的 systemd 版本和系统补丁,避免已知的兼容性问题。

总结 📚

遇到 “System has not been booted with systemd as init system (PID 1)” 错误时,不用担心!这通常是由于你的系统环境没有正确加载 systemd。通过本文介绍的针对 WSL、Docker 以及自定义 Linux 发行版的解决方案,你可以轻松启用 systemd 并解决相关问题。希望这篇文章对你有所帮助,如果你有其他问题或不同的经验,欢迎在评论区分享!😊

参考资料 📖

默语
全栈开发者 | 运维专家 | 人工智能技术爱好者


关注我的博客,获取更多关于系统管理和服务优化的内容!

在这里插入图片描述


🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥
🪁🍁 如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;(联系微信:Solitudemind )🍁🐥
🪁点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。🐥

在这里插入图片描述

更多推荐