文章目录
前言
- Linux的启动过程还是非常复杂的。学习启动过程可以加深对Linux有整体认识,从而对Linux的体系更加了解。字不如图,图不如视频。所以通过图的方式,来学习Linux启动过程。
1. 启动过程流程图
2. 对启动过程的解读
2.1 从BIOS—>内核解压并自检
- 当我们开机之后,主板上的BIOS芯片就会进行自检,自检完成之后,会加载MBR(主引导记录),主引导记录当中保存是启动引导程序, 在Linux当中,Linux的启动引导程序叫grub,grub保存在MBR里,是系统启动的主要引导程序,在MBR当中,通过这个引导程序来进行下一步的启动过程,这个时候会进行选择,有一个分支,如果服务器只有一个Linux,那么启动引导程序grub就会直接加载Linux内核,然后进行下一步的启动。如果计算机里不仅有Linux还有Windows,或者有两个不同版本的Linux,这个时候会进入多系统启动的状态,有一个列表,在里面去选。 这时会出现类似Windows的界面会让你选,虚拟机在启动的时候会有倒数五秒,在倒数五秒的时候按一下任意键盘,会出现选择界面,默认只有一个Linux系统,要是有多个可以在这里去选,到底启动哪一个,那么选定哪个操作系统就会加载这个操作系统所对应的内核,选的是Linux,就会加载Linux内核,选的是Windows,就加载Windows内核。如果有多个系统就会多一个选择界面。最终都会加载需要启动操作系统的内核。然后启动就会到下一步。内核是压缩的内核,内核本身就不大,如果不压缩会占用比较大的启动空间,所以把它做了一个压缩。所以会先在内存当中进行压缩进行解压缩,解压缩之后,内核会在做一次自检,bios会进行一次自检,内核在进行一次自检,如果是Linux,一般Linux信任的是内核自检,会把内核的自检过程记录在dmesg命令(输入可以看到启动自检过程的信息)当中,启动这个过程之后,内核加载之后,就需要内核去加载驱动。
2.2 从找到intramfs–>挂载真正的根目录
- 前言: 装虚拟机的时候是这样的,安装完Linux,所有的硬件内核直接就驱动了,然后就直接可以使用了。Windows:装完计算机,需要给每一个硬件安装驱动,然后才能使用,说明Windows装的单纯的操作系统。不附带任何驱动程序,如果想使用驱动,需要手工安装,当然Windows当中会集成一些简单的驱动,到那时绝大多数的驱动还是需要手动安装的,但是Linux不是,Linux的真实机安装和虚拟机安装是完全一样的。
- 内核只要安装完,所有的驱动都装在内核当中,内核通过服务器的硬件,来判断到底需要哪个驱动,会自动加载(练习用的虚拟机和真实机完全一样,都不需要手工安装驱动,只需要把内核装那,会自动帮你检测驱动。)这样有一个问题,如果把所有硬件的驱动都放在内核里,那么内核就会变得无比庞大。 解决方案是: 把常见得驱动放在内核里。把不常见的驱动,作为函数模块。把驱动写成一个程序,保存在硬盘里,一般放在硬盘的/lib/这个目录当中,是函数库的保存位置。 把他放进去,然后当我需要的时候内核直接去这里去读,把他拿出来就可以了。这样保证了我的内核不会太大。绝大多数的硬件驱动都不需要手工安装,Linux会自动进行识别。只有一种情况下,需要手工安装驱动,比如Linux内核当中没有包含这个硬件的驱动,比如说硬件太新了。当这个硬件发行的时候,内核早都出现了。所以有可能进行手工安装。但是大多数的程序,尤其是服务器上的硬件,都不需要手工安装驱动。也就是说内核解压自检完成之后,应该去/lib/下去读取这个驱动。读出来就可以加载了。
- 硬盘接口的驱动在硬盘里,内核需要去硬盘读取驱动,可是内核没有硬盘接口的驱动,进不去,这个问题该如何解决??? 我们的硬盘如果是IDE接口,IDE接口的驱动是直接在内存当中,就可以认识IDE硬盘,然后去找到/lib/目录然后拿出。但是我们现在绝大多数的计算机,我们的硬盘都是SATA接口的,或者SCSI接口(淘汰了)。SATA接口的硬盘,内核认为驱动不是必须的,所以他是作为模块放在/lib这个目录当中。这就是产生的问题: 我的内核必须要去/lib/当中读取出来SATA的这个驱动,才能识别硬盘,但是我既然没有识别硬盘,怎么去加载他的驱动那???SATA接口的这个驱动,是放在硬盘的/lib/目录下的,但是如果我没有这个驱动,是无法读取这个硬盘的,我也当然就无法打开/lib这个目录。
- 举个形象的栗子来说明这个问题: 如果进自己家的门,通过钥匙才能打开,但是那钥匙(相当于驱动,驱动就放在/lib/目录下),但是钥匙没有在身上(相当于内核没有驱动),而是把锁在了房间里面。请问如何进这个屋里???解决方法: 如果真要开房间就要找开锁公司,但是对Linux内核,也是用类似的办法。他在我们的启动分区当中,有一个initamfs文件系统,这个文件系统模拟了一个跟硬盘基本相似的这个结构,然后那内核先加载他,通过它把基本的常见驱动,加载到内核里,也就是说SATA的这个驱动,没有直接再从/lib/下去调,而是从这个假的文件系统里面去调,内核加载了它之后,才建立仿真目录,然后才能去加载真正的硬盘分区,才能读取剩余的其他驱动。 也就是说有一个假的根目录,这个根目录当中保存了硬盘上必须的这些驱动。把这个加载到内核里,内核就可以去调用真正的硬盘。相当于找开锁公司,配了把假钥匙,拿这个假钥匙就能打开门,能取出真钥匙,才能读取后续的命令。
- 这时还会有疑问: Initramfs文件是放在/boot目录下,那/boot/不也在硬盘上吗?内核居然没法加载/lib/,当然也无法加载/boot??? /boot这个分区不是由内核直接加载的,而是由启动引导程序事先就已经读取出来的。 /boot目录整个就是启动分区,所以启动引导程序默认是可以识别boot分区的,所以不存在驱动这样的一个过程。
2.2.1 查看initramfs文件
开始实验:
- (1)打开这个initramfs内存文件系统,看一下里面有什么
小提示:
- cpio命令在rpm包安装的时候使用过,
cpio –ivcdu < 文件
就可以读取里面的内容,会把这个文件解压缩。bin、dev、etc、lib目录,绝大多数的驱动都在这,跟真正的根目录有些相似,也就是说是利用这个文件,模拟一个跟根差不多的目录,主要的目的是为了加载这个文件当中,lib下的这些驱动。 - 上面的查看initramfs文件的过程是手工进行解压的过程,在真正启动的时候,这个解压过程应该在内存当中直接进行的,建立仿真目录,里面有硬件的驱动。然后就可以读取真正的硬盘上的驱动了,就可以读取真正的系统的硬盘了。然后就可以读取里面真正的根目录了。 到这个时候,这个仿真根目录的作用使命就结束了。
2.3 从/sbin/init到/etc/init/rcS.conf
读出来真正的系统硬盘空间。系统启动的第一个进程,通过它才可以进行后续的启动进程。然后调用了/etc/init/rcS.conf文件。
/etc/init/rcS.conf
文件主要有两个功能:
- 第一个功能: 先调用
/etc/rc.d/rc.sysinit
这个文件,主要作用是进行Linux系统的初始化。 (没有这个文件的存在,系统是无法正常启动的,其实它只要正常加载,正常初始化,这时系统的基本功能就已经全部具备了。完成系统的基本启动。) - 第二个功能是:然后再调用/etc/inittab,确定系统默认级别。 就是定义进入字符界面还是进入图形界面。(定义了运行级别之后那,需要把运行级别传到
/etc/init/rc.conf
这个配置文件,通过这个配置文件调用/etc/rc.d/rc
,其实归根结底是调用/etc/rc[0-6].d
这个目录。如果是字符界面,那就调用/etc/rc3.d
这个目录下所有的程序,如果是图形界面,那就调用/etc/rc5.d
当中的所有程序。)
小总结:
- (1)读出来之后继续调用
/sbin/init
这个文件,这个命令。init是系统启动的第一个进程,是所有其余进程的父进程,在centos 5.x当中,他的作用会远比现在还要大,现在作用稍微消弱了。但还是系统启动的第一个进程。 - (2)也就是说
/etc/init/rcS.conf
有两个功能,第一进行系统的初始化,系统初始化完成之后,操作系统的基本功能就具备了。但是这只是它的最基本功能,要想正常使用,需要确定系统是进入的字符界面还是图形界面,如果进入的是不同的界面,还需要启动对应的附加程序才可以完成整个系统的启动。
2.4 从/etc/inittab到进入系统
从/etc/inittab经过调用,运行级别参数传入/etc/rc.d/rc这个脚本之后,由这个脚本我呢见按照不同的级别启动/etc/rc[0-6].d/目录中的相应的程序。如果级别为3,进入cd /etc/rc3.d/ 字符界面的级别下,目录下都是执行文件。而且这些执行文件很特殊,很有规律,要么以K开头,要么以S开头的,K开头的对字符界面没有太大的作用,所以默认把他关了。S开头的一次启动,如果把这些程序都启动了,我的系统就进入了对应的字符界面级别。这些都是程序,全部都是命令,他们都是软连接(快捷方式);
/etc/rc3.d/K??开头的文件 (??是数字),会按照数字顺寻依次关闭
/etc/rc3.d/S??开头的文件 (??是数字),会按照数字顺序依次启动
- (1)查看/etc/rc3.d文件
- 在登录界面之前还会调用,/etc/rc.d/rc.local(服务管理涉及过)文件,只要把这个命令写到这个文件里,在开机的时候都会执行一遍。为什么再开机是都会执行一遍那???按照启动顺序,在登录之前,会把这个文件当中所有的命令都会执行一遍,所以可以把服务的启动命令写在这里。然后登录进入系统。注意: 如果是图形界面,/etc/rc.d/rc.local这一步执行完之后,还要进行一系列操作,这里主要指的是启动了图形界面的Xserver和图形界面的Xclient程序,依次启动之后才可以起。
3. 总结
(1) 从BIOS自检,到加载内核,到加载驱动,到加载运行级别,一系列的启动过程,完成的启动过程。
(2) 重点理解加载驱动的过程,initramfs文件的功能(内核通过它获取常见的驱动,同时包括SATA硬盘接口的驱动,然后才能进入硬盘,读取真正的根目录)
(3) 如果启动级别是5,进入的图形界面,那么/etc/rc.d/rc.local
这一步执行完之后,还要进行一系列操作,这里主要指的是启动了图形界面的Xserver和图形界面的Xclient程序,依次启动之后才可以启动图形界面。
(4) 图形界面对服务器来讲用处不大,不建议去使用图形界面。
4. 补充 /etc/rc.d/rc.sysinit初始化
/etc/rc.d/rc.sysinit初始化了哪些东西那???
- 获得网络环境
- 挂载设备
- 开机启动画面Plymouth
- 判断是否启用SELinux
- 显示开机过程中的欢迎画面
- 初始化硬件
- 用户自定义模块的加载
- 配置内核的参数
- 设置主机名
- 同步存储器
- 设备映射器及相关的初始化
- 初始化软件磁盘阵列(RAID)
- 初始化LVM的文件系统功能
- 检验磁盘文件系统(fsck)
- 设置磁盘配额(quota)
- 重新以可读写模式挂载系统磁盘
- 更新quota(非必要)
- 启动系统虚拟随机数生成器
- 配置机器(非必要)
- 清除开机过程当中的临时文件
- 创建ICE目录
- 启动交换分区(swap)
- 将开机信息写入/var/log/dmesg文件中