[TinyLinux-005] 系统定制实战:init 脚本与个性化配置
系列简介:TinyLinux 是由 LabHub 发起的"大道至简"Linux 学习项目。我们通过对内核进行"剔骨"级的物理精简,旨在构建一个 100% 透明、可重现的极简实验室。
公众号:LabHub | 项目仓库:https://gitee.com/lynyujiang/tiny-linux.git
🛠 技术看板
| |
|---|
| 定制系统启动流程和用户环境,打造个性化 Linux 系统 |
| init 脚本 / inittab / mdev 设备管理 / shell 环境配置 |
| overlay/ |
| |
| overlay/etc/init.d/rcS |
| |
1. 知识点详注 (Technical Glossary)
- init 进程:Linux 系统启动后运行的第一个进程(PID=1),负责初始化系统、挂载文件系统、启动后续服务。TinyLinux 使用 BusyBox 的
init 作为主 init 进程。 - inittab:BusyBox init 的配置文件,定义系统运行级别和初始化脚本。格式为
id:runlevel:action:process。 - rcS 脚本:系统启动时执行的第一个用户脚本,通常位于
/etc/init.d/rcS,负责基础系统初始化。 - mdev:BusyBox 提供的轻量级设备管理器,是 udev 的简化版本。通过
/etc/mdev.conf 配置文件管理设备节点的创建和移除。 - overlay 目录:TinyLinux 用于存放自定义配置文件的目录,在构建根文件系统时会自动合并到
rootfs_staging 中。
2. 理论背景 (Deep Theory)
2.1 Linux 启动流程回顾
BIOS/UEFI
↓
Bootloader (GRUB/QEMU 直接启动)
↓
Kernel (bzImage)
↓
initramfs (rootfs.cpio.xz)
↓
init 进程 (PID=1)
↓
/etc/inittab
↓
/etc/init.d/rcS
↓
Shell (/bin/sh)
2.2 BusyBox init 的工作原理
BusyBox 的 init 进程遵循以下流程:
- **读取
/etc/inittab**:如果存在,按配置执行 - 启动登录 shell:根据配置启动 shell 或 getty
- 处理 ctrlaltdel:捕获 Ctrl+Alt+Del 组合键
2.3 TinyLinux 的 init 策略
由于 TinyLinux 追求极简,我们采用简化的 init 策略:
这种设计使得系统能够在 1.4 秒内完成启动并进入 Shell。
3. 源码与脚本深度走读 (Source Code Dive)
3.1 overlay 目录结构
overlay/
├── etc/
│ ├── init.d/
│ │ └── rcS # 系统启动脚本
│ ├── mdev.conf # 设备管理配置
│ ├── profile # Shell 环境配置
│ ├── issue # 登录欢迎信息
│ └── version # 系统版本信息
└── lib/
└── mdev/
└── usb_handler # USB 热插拔处理脚本(可选)
3.2 核心 init 脚本:rcS
#!/bin/sh
# TinyLinux Minimal Init
# 1. 基础挂载
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t devtmpfs devtmpfs /dev 2>/dev/null || true
# 2. 设置主机名
# hostname TinyLinux
# 3. 打印精简欢迎语
cat /etc/issue 2>/dev/null
脚本解析:
| | |
|---|
| mount -t proc proc /proc | |
| mount -t sysfs sysfs /sys | |
| mount -t devtmpfs devtmpfs /dev | |
| # hostname TinyLinux | |
| cat /etc/issue | |
3.3 Shell 环境配置:profile
# /etc/profile: Minimal shell setup
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PS1='TinyLinux# '
# 常用别名
alias ll='ls -l'
alias df='df -h'
alias free='free -h'
# 自动打印版本(如果存在)
[ -f /etc/version ] && cat /etc/version
配置解析:
| | |
|---|
PATH | /bin:/sbin:/usr/bin:/usr/sbin | |
PS1 | TinyLinux# | |
alias ll | ls -l | |
alias df | df -h | |
alias free | free -h | |
3.4 设备管理配置:mdev.conf
# /etc/mdev.conf
# 格式:devicename_regex user:group mode [action]
# 核心设备
null 0:0 666
zero 0:0 666
console 0:5 600
tty 0:5 666
# 串口设备(QEMU 调试关键)
ttyS[0-9]* 0:20 660
# 磁盘设备
sd[a-z][0-9]* 0:6 660
vd[a-z][0-9]* 0:6 660
# 输入设备
event[0-9]* 0:0 660 =input/
# 热插拔支持
sd[a-z][0-9]* 0:0 660 */lib/mdev/usb_handler
3.5 构建脚本中的 overlay 合并
# scripts/build_rootfs.sh 片段
# Merge overlay custom files
if [ -d "${TINYLINUX_CUSTOM_DIR}" ]; then
echo_info "Overlaying custom files from ${TINYLINUX_CUSTOM_DIR}..."
sudo cp -rf "${TINYLINUX_CUSTOM_DIR}/"* "${STAGING_DIR}/"
fi
4. 配置详解 (Config & Engineering)
4.1 添加自定义欢迎信息
创建 overlay/etc/issue:
____ _ __ __ _
/ ___| _ _| |__| \/ | ___ __| |_ __
\___ \| | | | '_ \ |\/| |/ _ \/ _` | '__|
___) | |_| | |_) | | | | __/ (_| | |
|____/ \__,_|_.__/|_| |_|\___|\__,_|_|
TinyLinux 6.12.51 - Built on $(date +%Y-%m-%d)
4.2 添加系统版本信息
创建 overlay/etc/version:
TinyLinux v0.1.0
Kernel: 6.12.51
BusyBox: 1.36.1
Build: 2026-03-08
4.3 增强 rcS 脚本
#!/bin/sh
# TinyLinux Enhanced Init
echo"Starting TinyLinux..."
# 1. 基础挂载
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t devtmpfs devtmpfs /dev 2>/dev/null || true
# 2. 启动 mdev 设备管理器
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
# 3. 设置主机名
hostname TinyLinux
# 4. 挂载临时目录
mount -t tmpfs tmpfs /tmp
mount -t tmpfs tmpfs /var
# 5. 打印欢迎信息
cat /etc/issue
# 6. 显示系统信息
echo"CPU: $(cat /proc/cpuinfo | grep 'model name' | head -1 | cut -d: -f2)"
echo"Memory: $(free -m | awk 'NR==2{print $2}MB total, "$3"MB used)"
4.4 添加网络初始化(可选)
创建 overlay/etc/init.d/network:
#!/bin/sh
# Network initialization
# 配置 loopback 接口
ip link set lo up
ip addr add 127.0.0.1/8 dev lo
# 如果使用 QEMU 用户模式网络
# ip link set eth0 up
# udhcpc -i eth0
4.5 自定义 Shell 提示符
| | |
|---|
| PS1='# ' | # |
| PS1='\u@\h:\w$ ' | root@TinyLinux:~# |
| PS1='TinyLinux# ' | TinyLinux# |
| PS1='[\t] # ' | [12:34:56] # |
5. 工程实验步骤 (Lab Steps)
5.1 添加欢迎信息
cd /home/devhub/xlabs/tiny-linux
# 创建 issue 文件
cat > overlay/etc/issue << 'EOF'
____ _ __ __ _
/ ___| _ _| |__| \/ | ___ __| |_ __
\___ \| | | | '_ \ |\/| |/ _ \/ _` | '__|
___) | |_| | |_) | | | | __/ (_| | |
|____/ \__,_|_.__/|_| |_|\___|\__,_|_|
TinyLinux 6.12.51
EOF
5.2 添加版本信息
cat > overlay/etc/version << 'EOF'
TinyLinux v0.1.0
Kernel: 6.12.51
BusyBox: 1.36.1
Build: 2026-03-08
EOF
5.3 增强 rcS 脚本
cat > overlay/etc/init.d/rcS << 'EOF'
#!/bin/sh
# TinyLinux Enhanced Init
echo"Starting TinyLinux..."
# 1. 基础挂载
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t devtmpfs devtmpfs /dev 2>/dev/null || true
# 2. 启动 mdev 设备管理器
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
# 3. 设置主机名
hostname TinyLinux
# 4. 挂载临时目录
mount -t tmpfs tmpfs /tmp
mount -t tmpfs tmpfs /var
# 5. 打印欢迎信息
cat /etc/issue
# 6. 显示系统信息
echo"CPU: $(cat /proc/cpuinfo | grep 'model name' | head -1 | cut -d: -f2)"
echo"Memory: $(free -m | awk 'NR==2{print $2"MB total, "$3"MB used"}')"
EOF
chmod +x overlay/etc/init.d/rcS
5.4 重新构建系统
source env.sh
./scripts/make_all.sh
5.5 测试启动
./scripts/run_qemu.sh
5.2 观察点 (Observation Points)
启动后应该看到:
Starting TinyLinux...
____ _ __ __ _
/ ___| _ _| |__| \/ | ___ __| |_ __
\___ \| | | | '_ \ |\/| |/ _ \/ _` | '__|
___) | |_| | |_) | | | | __/ (_| | |
|____/ \__,_|_.__/|_| |_|\___|\__,_|_|
TinyLinux 6.12.51
CPU: AMD QEMU Virtual CPU version 2.5+
Memory: 498MB total, 24MB used
TinyLinux#
5.3 避坑指南
6. 验证与重现
6.1 系统验证命令
# 1. 查看主机名
hostname
# 输出:TinyLinux
# 2. 查看挂载点
mount
# 输出:proc, sysfs, devtmpfs, tmpfs
# 3. 查看设备节点
ls -l /dev/
# 输出:ttyS0, null, zero, sd* 等
# 4. 查看 Shell 提示符
echo$PS1
# 输出:TinyLinux#
# 5. 查看版本信息
cat /etc/version
# 输出:TinyLinux v0.1.0 ...
6.2 测试 profile 配置
# 测试别名
ll /bin/
df -h
free -h
# 测试 PATH
echo$PATH
# 输出:/bin:/sbin:/usr/bin:/usr/sbin
6.3 对应提交
| |
|---|
| 9e35606c4 (refactor: separate configuration from build scripts) |
| git checkout 9e35606c4 |
| source env.sh && ./scripts/make_all.sh |
| TinyLinux# |
⚠️ 注意:Git 提交信息请执行 git log --oneline -5 获取最新提交。
7. 总结与延伸
7.1 本章收获
通过本章,我们掌握了系统定制的核心技能:
- ✅ 理解了 init 进程和 rcS 脚本的工作原理
7.2 思考题
- 如何添加开机自动运行服务(如 SSH、Web 服务器)?
7.3 下一章预告
在 [TinyLinux-006] 中,我们将探索网络功能配置,让 TinyLinux 能够连接外部网络。敬请期待!
🌟 互动与支持
如果你觉得这个项目对理解 Linux 底层有帮助,请不要吝啬你的支持:
- 点赞 & 在看:点击右下角,让更多极客看到这个"活的代码教科书"。
- 关注 LabHub:第一时间获取 TinyLinux 的最新"手术"报告。
- Star 项目:点击 Gitee 仓库地址 给我们一个五星好评!
本文由 LabHub 团队原创,转载请注明出处。
项目地址:https://gitee.com/lynyujiang/tiny-linux.git