当前位置:首页>Linux>[TinyLinux-005] 系统定制实战:init 脚本与个性化配置

[TinyLinux-005] 系统定制实战:init 脚本与个性化配置

  • 2026-09-30 04:13:54
[TinyLinux-005] 系统定制实战:init 脚本与个性化配置

[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
、overlay/etc/profile
启动时间
约 1.4 秒

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 进程遵循以下流程:

  1. **读取 /etc/inittab**:如果存在,按配置执行
  2. 执行系统初始化:运行 sysinit 指定的脚本
  3. 启动登录 shell:根据配置启动 shell 或 getty
  4. 处理 ctrlaltdel:捕获 Ctrl+Alt+Del 组合键
  5. 管理运行级别:支持多运行级别切换

2.3 TinyLinux 的 init 策略

由于 TinyLinux 追求极简,我们采用简化的 init 策略:

特性
配置
说明
inittab
无
使用默认行为
初始化脚本
/etc/init.d/rcS
手动挂载文件系统
登录方式
直接 shell
无需密码登录
运行级别
单用户模式
无多用户切换

这种设计使得系统能够在 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

脚本解析:

行号
命令
作用
5
mount -t proc proc /proc
挂载 proc 文件系统,提供进程信息
6
mount -t sysfs sysfs /sys
挂载 sysfs 文件系统,提供设备信息
7
mount -t devtmpfs devtmpfs /dev
挂载 devtmpfs,自动创建设备节点
10
# hostname TinyLinux
注释掉的主机名设置(可选)
13
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
命令搜索路径
PS1TinyLinux# 
Shell 提示符
alias llls -l
长列表别名
alias dfdf -h
人类可读磁盘使用量
alias freefree -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='# '# 
标准风格
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 避坑指南

现象
原因
解决方案
欢迎信息不显示
/etc/issue
 不存在
检查 overlay 目录结构
rcS 脚本报错
语法错误
使用 sh -n rcS 检查语法
设备节点缺失
mdev 未启动
检查 mdev -s 命令
提示符未改变
profile 未加载
检查 /etc/profile 路径
挂载失败
内核不支持
检查内核配置 CONFIG_*_FS

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 脚本的工作原理
  • ✅ 学会了使用 overlay 目录定制系统配置
  • ✅ 掌握了 mdev 设备管理器的配置方法
  • ✅ 能够独立定制 Shell 环境和提示符

7.2 思考题

  1. 如何添加开机自动运行服务(如 SSH、Web 服务器)?
  2. 如何实现多用户登录和密码认证?
  3. 如何使用 inittab 配置多个运行级别?
  4. 如何实现系统关机/重启命令?

7.3 下一章预告

在 [TinyLinux-006] 中,我们将探索网络功能配置,让 TinyLinux 能够连接外部网络。敬请期待!


🌟 互动与支持

如果你觉得这个项目对理解 Linux 底层有帮助,请不要吝啬你的支持:

  • 点赞 & 在看:点击右下角,让更多极客看到这个"活的代码教科书"。
  • 关注 LabHub:第一时间获取 TinyLinux 的最新"手术"报告。
  • Star 项目:点击 Gitee 仓库地址 给我们一个五星好评!

本文由 LabHub 团队原创,转载请注明出处。


项目地址:https://gitee.com/lynyujiang/tiny-linux.git

最新文章

随机文章