一、inittab文件概述
1.1 什么是inittab
/etc/inittab是init进程的配置文件,用于定义系统启动、运行级别和关机时应该运行哪些进程。虽然现代Linux系统多使用systemd,但许多嵌入式系统仍使用传统的SysV init或BusyBox init,它们依赖inittab。
1.2 适用场景
电源按下 ↓Bootloader(U-Boot等) ↓加载Linux内核 ↓内核初始化 ↓init进程启动(PID=1) ↓读取 /etc/inittab ←── 执行位置! ↓执行sysinit(系统初始化) ↓启动基本服务 ↓启动登录界面/串口控制台 ↓系统准备就绪 ↓用户登录/运行应用程序
二、inittab文件格式详解
2.1 基本语法
id:runlevels:action:process
2.2 各字段含义
2.3 action类型
| | |
|---|
| | ::sysinit:/etc/init.d/rcS |
| | ttyS0::respawn:/sbin/getty |
| | |
| | |
| | ::ctrlaltdel:/sbin/reboot |
| | ::shutdown:/sbin/swapoff -a |
三、嵌入式inittab配置实践
3.1 最小化配置示例
# /etc/inittab - 最小配置::sysinit:/etc/init.d/rcS::respawn:-/bin/shtty1::respawn:/sbin/getty -L tty1 115200 vt100::ctrlaltdel:/sbin/reboot::shutdown:/bin/umount -a-r
3.2 完整嵌入式配置示例
# /etc/inittab - 完整嵌入式配置# 设置默认运行级别id:3:initdefault:# 系统初始化脚本::sysinit:/bin/mount -t proc proc /proc::sysinit:/bin/mount -t sysfs sysfs /sys::sysinit:/bin/mount -t tmpfs tmpfs /tmp::sysinit:/bin/mkdir -p /dev/pts::sysinit:/bin/mount -t devpts devpts /dev/pts::sysinit:/sbin/mdev -s::sysinit:/bin/hostname -F /etc/hostname::sysinit:/etc/init.d/rcS# 串口控制台ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100ttyS1::respawn:/sbin/getty -L ttyS1 115200 vt100# 网络服务::respawn:/usr/sbin/dropbear -R# 应用进程myapp::respawn:/usr/bin/myapp --daemonlogger::respawn:/usr/bin/syslogd -n# 看门狗watchdog::respawn:/usr/sbin/watchdog -t10 /dev/watchdog# 关机处理::shutdown:/etc/init.d/rcK::shutdown:/bin/umount -a-r::shutdown:/sbin/swapoff -a
四、inittab开发实践技巧
4.1 自定义初始化脚本
创建 /etc/init.d/rcS:
#!/bin/sh# rcS - 系统初始化脚本echo"Starting system initialization..."# 设置环境变量exportPATH=/bin:/sbin:/usr/bin:/usr/sbinexportLD_LIBRARY_PATH=/lib:/usr/lib# 创建必要的目录mkdir-p /var/runmkdir-p /var/logmkdir-p /var/lock# 配置网络if[-f /etc/network.conf ];then. /etc/network.conffi# 启动守护进程[-x /usr/sbin/crond ]&& /usr/sbin/crond# 用户自定义初始化if[-f /etc/rc.local ];then /etc/rc.localfiecho"System initialization completed."
4.2 进程监控与恢复
# 应用进程监控配置app_monitor::respawn:/usr/bin/app_monitor.sh# app_monitor.sh 内容:#!/bin/shwhiletrue;doif! pidof myapp > /dev/null;thenecho"myapp crashed, restarting...">> /var/log/app.log /usr/bin/myapp --daemonfisleep10done
4.3 多运行级别管理
# 嵌入式多运行级别示例# 运行级别定义:# 1 - 单用户模式# 2 - 多用户无网络# 3 - 多用户有网络# 4 - 自定义模式# 默认运行级别id:3:initdefault:# 级别1:维护模式l1:1:wait:/etc/init.d/rc 1l1:S1:wait:/sbin/sulogin# 级别3:正常模式l3:3:wait:/etc/init.d/rc 3l3:3:respawn:/usr/sbin/dropbearl3:3:respawn:/usr/sbin/lighttpd# 运行级别切换脚本::ctrlaltdel:/sbin/init 1
五、调试与排错
5.1 常见问题解决
问题1:进程频繁重启
# 在inittab中添加日志ttyS0::respawn:/bin/sh -c"exec /sbin/getty -L ttyS0 115200 vt100 2>&1 | logger -t getty"
问题2:启动卡住
# 在rcS中添加调试信息echo"Starting rcS at $(date)"> /dev/kmsg# 每个命令后添加状态检查mount-t proc proc /proc ||echo"mount proc failed"
5.2 调试技巧
# 1. 查看init进程日志cat /proc/1/cmdlinedmesg|grep init# 2. 手动测试inittab条目# 临时修改inittab测试cp /etc/inittab /etc/inittab.backup# 测试单个条目/sbin/getty -L ttyS0 115200 vt100# 3. 使用strace跟踪strace-p1# 跟踪init进程
六、高级应用
6.1 动态inittab生成
#!/bin/sh# generate_inittab.sh - 动态生成inittabcat> /etc/inittab <<EOF# Auto-generated inittab# Generated on: $(date)::sysinit:/bin/mount -t proc proc /proc::sysinit:/bin/mount -t sysfs sysfs /sys# 根据硬件配置添加串口if [ -c /dev/ttyS0 ]; then echo "ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100" >> /etc/inittabfiif [ -c /dev/ttyS1 ]; then echo "ttyS1::respawn:/sbin/getty -L ttyS1 115200 vt100" >> /etc/inittabfi# 根据服务存在性添加[ -x /usr/sbin/dropbear ] && echo "::respawn:/usr/sbin/dropbear -R" >> /etc/inittab[ -x /usr/sbin/lighttpd ] && echo "::respawn:/usr/sbin/lighttpd -D -f /etc/lighttpd.conf" >> /etc/inittabEOF# 重新加载inittabkill-HUP1
6.2 安全增强配置
# 安全增强的inittab配置# 限制串口访问权限ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100 -n-l /bin/login# 添加审计日志::respawn:/usr/sbin/auditd# 设置看门狗超时watchdog::respawn:/usr/sbin/watchdog -t30 /dev/watchdog# 资源限制myapp::respawn:/bin/sh -c"ulimit -c 0; ulimit -n 256; exec /usr/bin/myapp"
七、与systemd对比迁移
7.1 主要差异
注:在ubuntu下的 /sbin/init 指向了 /lib/systemd/systemd7.2 迁移
- 可折中方案:使用BusyBox init + 自定义监控脚本
八、最佳实践
- 保持简洁
- 错误处理
- 日志记录
- 资源监控
- 安全考虑
- 测试充分
九、实用工具脚本
9.1 inittab语法检查
#!/bin/sh# check_inittab.shINITTAB=/etc/inittabcheck_line(){localline="$1"locallineno="$2"# 跳过空行和注释echo"$line"|grep-q'^#'&&return0[-z"$line"]&&return0# 检查格式if!echo"$line"|grep-q'^[^:]*:[^:]*:[^:]*:[^:]*$';thenecho"Error line $lineno: Invalid format"return1fireturn0}lineno=1whileIFS=read-r line;do check_line "$line"$lineno||exit1lineno=$((lineno +1))done<"$INITTAB"echo"inittab syntax check passed"
9.2 进程状态监控
#!/bin/sh# monitor_inittab.sh# 监控inittab中所有respawn进程get_respawn_processes(){grep'^[^#].*:respawn:' /etc/inittab |\awk -F: '{print $4}'|\sed's/^[[:space:]]*//;s/[[:space:]]*$//'}forcmdin$(get_respawn_processes);do# 提取可执行文件名exe=$(echo"$cmd"|awk'{print $1}')name=$(basename"$exe")if! pidof "$name"> /dev/null 2>&1;thenecho"WARNING: $name is not running" logger -t inittab-monitor "$name is not running"fidone