Linux系统引导流程
1、固件:硬件和软件结合
加电自检是我们按下电源会检测硬件像CPU、内存、网卡等信息(从硬件层次检测硬件是否可用)
固件设置时间:
[root@centos ~]# hwclock #硬件时间 Wed 28 Mar 2018 09:22:15 PM CST -0.811743 seconds [root@centos ~]# date #软件时间 Wed Mar 28 21:22:18 CST 2018
hwclock的两个参数:
hwclock --hctosys #以硬件时钟为标准修改软件时钟 hwclock --systohc #以软件时钟为标准修改硬件时钟
2、检测完之后跳转到mbr(主引导记录)里面读取一个很重要的数据bootloader(后续的所有工作都是bootloader完成)和partition table、magic number
3、bootloader载入内核:
内核的概念:(Linux是一堆源码,在开机的时候会看到booting the kernel,从软件层次检测硬件是否可用)
主要作用就两个:驱动硬件(所谓驱动就是系统识别硬件,让操作系统认识硬件,从软件识别硬件是否可用)、启动完init进程其任务就完成了。
4、init进程也是Linux启动的第一个进程
init进程的任务:
init启动后读取inittab文件,执行缺省运行级别,从而继续引导过程。在Unix系统中,init时第一个可以存在的进程,它的PID恒为1,但它也必须向一个更高级的功能负责:PID为0的内核调度器(Kernel scheduler),从而获得CPU时间。
解释:
init进程的PID为1,其PPID为0,PPID就是父进程ID,其父进程是内核任务调度器。
Linux是一个实时系统,就是将处理时间按时间分配,如果你这次时间没有处理完则下次继续给你分配时间的时候再处理,这就需要一个CPU时间调度器,也就是PID为0的内核调度器。
Linux中由一个进程派生出的进程成为子进程。如果一个进程的父进程死了,其子进程也不能存在。Linux中父进程死掉了子进程存活的进程成为孤儿进程,在Linux中不允许孤儿进程的存在。Linux扫描到存在孤儿进程的时候会自动将这个孤儿进程的父进程设置为init进程(PID为1的进程)。
子进程死亡,父进程应该切换和子进程之间的联系,这个子进程成为了僵尸进程(J进程),这种进程也不允许存在。
5、读取 /etc/inittab文件
inittab定义Linux的7个运行级别
- 0:关机状态(系统默认运行级别不能设为0,否则不能正常启动)
- 1:单用户模式(类似Windows的安全模式),只允许root登录,用于系统维护,禁止远程登录
- 2:多用户模式,没有NFS服务(网络文件服务,实现文件共享)
- 3:多用户模式,有NFS服务
- 4:系统未使用,保留,可以让用户自定义一些启动程序
- 5:X11控制台,登陆后进入图形GUI模式。与3一样是多用户模式,只是有图像界面。
- 6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动。
6、inittab文件剖析:
在inittab中,所有条目采用如下格式:
id:runlevel:action:process
- id:标识符,一般为两位字母或者数字(长度为1-4位即可)
- run-levels:指定运行级别,可以指定多个
- action:指定运行状态
- process:指定要运行的脚本和命令(前面三个是process的铺垫)
actions常用取值:
- initdefault:指定系统常用级别
- sysinit:系统启动执行process中指定的命令
- wait:执行process中的指令,并等其他指令结束再运行其他命令
- once:执行process中的指令,不等其结束
- ctrlaltdel:按下Ctrl+Alt+Del时执行process的指令
inittab重要的两个条目:
id:3:initdefault: #指定系统默认运行级别为3,如果想系统启动后自动运行X Window,则将上面的3改为5 # System initialization. si::sysinit:/etc/rc.d/rc.sysinit #启动脚本/etc/rc.d/rc.sysinit,完成系统服务程序启动,如系统环境变量设置、设置系统时钟、加载字体、检查加载文件系统、生成系统启动信息日志文件等。
rc.sysinit是一个标准的shell脚本,如果我们想开机不管哪个运行级别都执行一段脚本我们可以将脚本或命令放在/etc/rc.d/rc.sysinit里面。
inittab记录了默认级别、必须启动的脚本、电源管理、6个终端等信息。
接下来系统就会按照inittab指定的运行级别的目录下的脚本:(/etc/rc.d/rc[0-6].d目录分别对应着运行级别的目录):
假如系统的缺省运行级别为3,系统会执行/etc/rc.d/rc3.d/目录下的脚本;
总结:
- fireware(固件)开机自检,检验硬件设备是否正常,如果正常则读取硬盘上面存放数据的第一个位置MBR(Master Boot Record)里面的bootloader
- BootLoader里面最重要的是存放了一个自举程序(GRUB)
- GRUB载入内核(Kernel)驱动硬件、启动init进程
- init进程读取/etc/inittab,首先执行脚本:/etc/rc.d/rc.sysinit(不管任何运行级别都会执行这个脚本),然后根据initdefault查到默认的运行级别并且去/etc/rc.d/rcN.d/下执行脚本,以S开头的脚本是启动服务的脚本,以K开头的是关闭服务的脚本
- 最后会建立终端,等待用户登录。显示user、name。