linux启动过程
先把相关的学习资料摆出来:
详细启动过程如下
- 首先计算机开机加电,自检硬件有没有问题
- 执行bios中的引导程序
- 加载启动盘MBR中的代码
- 通过MBR的信息加载磁盘的启动分区(放有/boot目录,专门用于linux系统启动)
- 将操作系统的内核代码加载到内存并加压缩
- 执行内核的各种初始化工作,如进程管理,内存管理,文件系统功能
前面的过程都偏底层,其实不必过于纠结,我也只是知道一个大概的流程。学习要考虑“投入产出比”。
- 启动1号进程,它是所有用户态进程的祖先。这个过程会运行一个程序文件,不同的Linux系统这个文件不同。如 /sbin/init, /etc/init ,/bin/init, /bin/sh等。只要有一个运行了就不再执行后面的启动程序。
if (ramdisk_execute_command) {
ret = run_init_process(ramdisk_execute_command);
......
}
......
if (!try_to_run_init_process("/sbin/init") ||
!try_to_run_init_process("/etc/init") ||
!try_to_run_init_process("/bin/init") ||
!try_to_run_init_process("/bin/sh"))
return 0;
上面是一段Linux的内核代码,我是从《趣谈Linux操作系统》专栏里拷贝出来的。
启动程序
上述的启动程序内部会执行一系列的脚本,做一些系统的初始化操作,把用户带入可操作的环境中。如启动一些系统服务,nginx,mysql等,以及登录shell,ssh进程与用户交互。
这一步骤的启动过程是可以“配置”的。不同的运行级别,会启动不同的初始化进程。
也就是**/etc/rcX.d**下的启动脚本(程序)。所以我们可以直接或间接地添加自己的脚本在系统初始化时所一些事情。
比如注明的chkconfig命令就可以间接的在rcX.d下建立一个启动脚本。
总结
一号进程启动前的过程我们只需要大致了解。对于开发人员,还是应用视角下的sbin启动的初始化工程。