构建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,推出后能自动重新启动。

相关推荐
小糖学代码4 小时前
LLM系列:1.python入门:3.布尔型对象
linux·开发语言·python
shizhan_cloud4 小时前
Shell 函数的知识与实践
linux·运维
Deng8723473484 小时前
代码语法检查工具
linux·服务器·windows
霍夫曼6 小时前
UTC时间与本地时间转换问题
java·linux·服务器·前端·javascript
月熊7 小时前
在root无法通过登录界面进去时,通过原本的普通用户qiujian如何把它修改为自己指定的用户名
linux·运维·服务器
大江东去浪淘尽千古风流人物8 小时前
【DSP】向量化操作的误差来源分析及其经典解决方案
linux·运维·人工智能·算法·vr·dsp开发·mr
赖small强9 小时前
【Linux驱动开发】NOR Flash 技术原理与 Linux 系统应用全解析
linux·驱动开发·nor flash·芯片内执行
IT运维爱好者10 小时前
【Linux】LVM理论介绍、实战操作
linux·磁盘扩容·lvm
LEEE@FPGA10 小时前
ZYNQ MPSOC linux hello world
linux·运维·服务器
郝学胜-神的一滴10 小时前
Linux定时器编程:深入理解setitimer函数
linux·服务器·开发语言·c++·程序人生