基于 ok6410-busybox 研究 busybox 启动

busybox 也支持 init 系统, 与 sysvinit 中提供的 init系统 不同
代码取自于 BusyBox v1.30.0.git (2020-10-20 16:11:07 CST)


  • busybox启动流程 - 从 log 的角度
Freeing unused kernel memory: 316K (c0835000 - c0884000) 
mount: mounting /dev/mmcblk0p1 on /boot failed: No such file or directory // init系统打印的第一句
/etc/init.d/rcS: line 13: can't create /proc/sys/kernel/hotplug: nonexistent directory
dm9000 dm9000.0 eth0: link down
IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
----------------------------------- 
 welcome to A9 vexpress board
-----------------------------------

Please press Enter to activate this console. IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
dm9000 dm9000.0 eth0: link up, 100Mbps, full-duplex, lpa 0x4DE1

wit@vexpress:/ #
  • busybox 启动流程 - 从 过程 的角度
/etc/inittab,逐行解析并执行/etc/inittab中的命令(以当前的/etc/inittab为例)
	执行 /etc/init.d/rcS, rcS 为脚本文件,直接执行
	如果当前为 	 tty1,askfirst,键入回车后执行/bin/sh
	...
	如果当前为 ttySAC0,askfirst,键入回车后执行/bin/sh
	

/etc/inittab 文件内容
-----------------------------------------------------
::sysinit:/etc/init.d/rcS
tty1::askfirst:-/bin/sh 
tty2::askfirst:-/bin/sh
tty3::askfirst:-/bin/sh
tty4::askfirst:-/bin/sh
tty5::askfirst:-/bin/sh
tty6::askfirst:-/bin/sh
tty7::askfirst:-/bin/sh
#::ctrlaltdel:/bin/umount -a -r

#console::askfirst:-/bin/sh
ttySAC0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r

/etc/init.d/rcS 文件内容
-----------------------------------------------------

#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
LD_LIBRARY_PATH=/lib
export PATH LD_LIBRARY_PATH

mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
mdev -s
mkdir -p /var/lock

# 2019-1-9 10:01:40 ...... ...... uevent_helper .....................
echo /sbin/mdev > /proc/sys/kernel/hotplug


ifconfig eth0  10.10.11.117 netmask 255.255.255.0  up
route add default gw 10.10.11.254

echo "-----------------------------------"

echo " welcome to ARM11 ok6410 board"

echo "-----------------------------------"


busybox 中的 inittab 解析
id:runlevel_ignored:action:command
<id>:<runlevels>:<action>:<process> 
各字段的含义如下

<id>:
	id字段与sysvinit的inittab中的含义不同,它代表的是这个语句中process执行所在的tty设备,内容就是/dev目录中tty设备的文件名。
	sysvinit的inittab要求每条语句id的值唯一,busybox的inittab不要求

<runlevels>:
	busybox不支持runlevel,所以此字段完全被忽略,为空

<action>:
	sysinit 	为init提供初始化命令脚本的路径
	respawn 	每当相应的进程终止执行时,重新启动该进程
	askfirst 	主要用途是减少系统上执行的终端应用程序的数量。
				它将会促使init在控制台上显示“Please press Enter to active this console”的信息,并在重新启动进程之前等待用户按下“enter”键
	wait 		告诉init必须等到相应的进程执行完成之后才能继续执行
	once 		仅执行相应的进程一次,而且不会等待它执行完成
	ctratldel 	当按下Ctrl+Alt+Delete组合键时,执行相应的进程
	shutdown 	当系统关机时,执行相应的进程
	restart 	当init重新启动时,执行相应的进程,通常此处所执行的进程就是init本身

<process>:
	指定要运行的process的命令行。
sysvinit 与 busybox 异同
项目sysvinitbusybox
是否提供init进程
是否需要bootargs支持init=/linuxrc
启动项名称/sbin/init/linuxrc
来源代码sysvinit-2.86.tar.gzbusybox-1.30.0.tar.gz
解析文件/etc/inittab/etc/inittab
inittab语法A类似A,不同与A
是否支持run level
其他

符号"-" 表示 启动 /bin/sh 的时候 以 login shell 方式启动

关于这里, login shell和non-login shell加载的一些配置文件是不一样的, 不同的shell也不一定.

以bash为例, login shell加载的顺序是:

/etc/profile
/etc/profile.d/*.sh (这一步其实是在上面的/etc/profile里source的)
~/.bash_profile
~/.bash_login
~/.profile
后三个是按顺序找到其中一个, 加载后就不再加载后续的.

non-login shell加载顺序是:

/etc/bash.bashrc
~/.bashrc

详情请查阅 https://blog.tankywoo.com/2015/08/30/login-nonlogin-interactive-noninteractive-shell.html?utm_source=tuicool&utm_medium=referral

  • sysvinit 的 一般流程 和 busybox 有什么不同
busybox :
	1. 启动初始化脚本A
	2. 在对应的tty上启动 /bin/sh

sysvinit :
	1. 启动通用初始化脚本B
	2. 查看当前runlevel,根据runlevel启动对应的初始化脚本C
	3. 在对应的tty(例如tty1)上启动/sbin/agetty tty1 9600

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值