busybox是一个轻量级的Linux工具箱,其中包含了一些基本的UNIX工具。init_main是busybox中的一个重要函数,其作用是启动系统初始化,包括初始化系统进程、挂载文件系统、执行rc脚本等。下面是对init_main函数的源码分析:
int init_main(int argc, char **argv)
{
int i;
char *s;
struct init_action *action;
unsigned long long start_time;
int sig;
int rc;
// 初始化系统进程,调用execv函数执行/bin/busybox init
// 如果执行失败则打印错误信息并退出
if (getpid() != 1) {
bb_error_msg_and_die("init: Not running as init");
}
if (argv[1] && !strcmp(argv[1], "-v")) {
bb_info_msg("init built-in %s", BB_VER);
}
if (argv[1] && !strcmp(argv[1], "-T")) {
print_tracer_data();
return 0;
}
if (argv[1] && !strcmp(argv[1], "-h")) {
usage();
}
if (argv[1] && !strcmp(argv[1], "-R")) {
exec_init(argv[2]);
return 0;
}
// 初始化信号处理函数
signal_init();
// 初始化系统计时器
start_time = monotonic_us();
// 初始化系统环境变量
s = getenv("PATH");
if (s && *s) {
bb_path_init(s);
} else {
bb_path_init(DEFAULT_PATH);
}
// 挂载文件系统
mount_and_warn_if_failed("proc", "/proc", "proc", 0, NULL);
mount_and_warn_if_failed("sysfs", "/sys", "sysfs", 0, NULL);
mount_and_warn_if_failed("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");
// 执行rc脚本
action = init_action_list;
while (action) {
if (action->run) {
// 执行rc脚本
rc = action->run(action->name);
if (rc) {
if (action->error) {
// 打印错误信息
action->error(action->name, rc);
}
if (action->flags & INIT_ACTION_CRITICAL) {
// 如果脚本执行失败且是关键性操作,则退出程序
bb_error_msg_and_die("%s failed (error %d)", action->name, rc);
}
}
}
action = action->next;
}
// 打印系统启动时间
bb_info_msg("%s started: %llu us", bb_applet_name, monotonic_us() - start_time);
// 等待信号
for (;;) {
sig = wait_any_nohang_or_sig();
if (sig < 0) {
continue;
}
if (sig > 0) {
bb_info_msg("init: got signal %d", sig);
}
reap_dead_processes();
}
return 0;
}
从上述代码可知,init_main函数主要完成以下几个任务:
- 初始化系统进程,调用execv函数执行/bin/busybox init。如果执行失败则打印错误信息并退出。
- 初始化信号处理函数。
- 初始化系统计时器。
- 初始化系统环境变量。
- 挂载文件系统。
- 执行rc脚本。
- 打印系统启动时间。
- 等待信号。
其中,最重要的是执行rc脚本,这些脚本包括init.d目录下的所有脚本和rcS文件。在执行这些脚本时,需要注意它们的执行顺序和执行结果。如果脚本执行失败且是关键性操作,则需要退出程序。否则,程序将一直等待信号并重新执行上述任务。
总之,busybox的init_main函数是一个非常重要的函数,其完成了系统的初始化和启动。在此基础上,busybox提供了一些基本的UNIX工具,使得系统管理员可以更加方便地管理和维护Linux系统。