构建Linux文件系统:使用systemd监管sheel

实验目标

本次实验,我们面临的主要目标是构建一个稳定且可靠的系统环境,使其能够有效地管理和监控系统中的进程。核心任务是将systemd集成到我们的实验环境中,使其成为系统初始化过程的一部分,并负责管理系统中的服务和应用程序,包括/bin/bash。具体目标可以分解为以下几个关键点:

  1. 实现systemd作为主进程(PID 1): 在Linux系统中,PID 1的进程负责初始化系统并启动其他服务和应用程序。我们计划将systemd置于此核心角色中,以替代原先由bash承担的临时初始化任务。这一转变对于增强系统的稳定性和可管理性至关重要。
  2. 通过systemd监管/bin/bash 我们希望通过systemd来管理/bin/bash,确保当bash进程退出时,systemd能够立即启动一个新的shell实例。这将提升系统对错误的恢复能力,并保持用户界面的连续性,避免因单个shell的崩溃而影响整个系统。
  3. 创建和测试systemd服务单元: 为了实现对bash的有效管理,我们需要根据systemd的配置规则编写一个专门的服务单元文件。这个文件将定义如何启动、监控和重新启动bash进程,以及在什么情况下这些操作应该被执行。
  4. 模仿标准系统的启动过程: 我们的最终目标是在我们的实验环境中复现一个标准Linux系统的启动和运行过程。这包括完成必要的挂载操作、设置环境变量、启动关键服务,最终通过执行systemd来接管系统的进程管理。这样,我们不仅能够提高系统的稳定性,还能为后续添加更多的系统服务和特性打下坚实的基础。

实验过程

首先,我们把systemd和它的相关文件复制过来

bash 复制代码
cd myfilesystem
cp /bin/systemd bin/
cp /lib/systemd/systemd lib/systemd/
cp /bin/systemctl bin/

cp /lib/systemd/libsystemd-shared-249.so lib/systemd/
cp /lib/x86_64-linux-gnu/libseccomp.so.2 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libapparmor.so.1 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libcrypt.so.1 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libip4tc.so.2 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libseccomp.so.2 lib/x86_64-linux-gnu/

mkdir etc/systemd
mkdir lib/systemd
mkdir etc/systemd/system
mkdir lib/systemd/system
cp /lib/modules/6.5.0-26-generic/kernel/fs lib/modules/6.5.0-26-generic/kernel/ -r
cp /lib/systemd/system/default.target lib/systemd/system/
cp /lib/systemd/system/basic.target lib/systemd/system/
cp /lib/systemd/system/multi-user.target lib/systemd/system/
cp /lib/systemd/system/sysinit.target lib/systemd/system/

接下来,我们要在 /etc/systemd/system/ 目录下创建一个新的服务单元文件,在系统启动到多用户模式之后自动启动一个交互式的 Bash shell。该服务被设置为在 Bash 进程退出时自动重启,并通过强制分配一个终端来确保 Bash 可以以交互式模式运行,处理标准输入、输出和错误。

bash 复制代码
vim etc/systemd/system/bash.service
ini 复制代码
[Unit]
Description=Interactive Bash Shell
After=multi-user.target

[Service]
ExecStart=/bin/bash -i
Restart=always
StandardInput=tty-force
StandardOutput=tty
StandardError=tty

[Install]
WantedBy=multi-user.target

然后我们通过虚拟环境启动这个服务

bash 复制代码
chroot . bin/bash
systemctl enable bash.service
exit

接下来,修改我们的init文件,让systemd来接管PID1

bash 复制代码
vim init
sh 复制代码
#!/bin/sh 
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev
modprobe mptspi
/lib/systemd/systemd-udevd
udevadm trigger --action=add
udevadm settle || true
mount /dev/sda3 /mnt/hd
exec /lib/systemd/systemd

最后,我们打包并更新grub,重启系统。

bash 复制代码
find . | cpio -o -H newc | gzip > /boot/my-initrd.img
update-grub

我们重新启动进入这个我们的小系统,这时候就获得了一个由systemd接管的bash,推出后能自动重新启动。

相关推荐
bush438 分钟前
嵌入式linux学习记录十二,mmap
java·linux·学习
似水এ᭄往昔1 小时前
【Linux系统编程】--进程概念
linux·运维·服务器
Dxy12393102161 小时前
Linux 如何关闭关不掉的进程
linux·运维·chrome
小徐敲java2 小时前
Linux读取串口实时数据
linux·运维·服务器
keyipatience2 小时前
25.Linux静态动态库全解析
linux·运维·服务器
爱睡觉1113 小时前
在 Android 模拟器 Shell 下运行 ncnn 推理的性能排查记录
linux·shell
落羽的落羽3 小时前
【项目】JsonRpc框架——开发实现1(细节功能、字段定义、抽象层、具象层)
linux·服务器·网络·c++·人工智能·算法·机器学习
shixuzhimeng3 小时前
FTP服务器项目
linux·网络·ftp
Chris-zz3 小时前
Linux:线程概念与控制
linux·运维
剑神一笑4 小时前
Linux chown 命令详解:从 inode 到实战
linux·运维·服务器