小弟接触Linux刚好一个月多,特意找了注册很久的51cto写第一篇博客来整理整理知识。
内容很多都是参考《鸟哥私房菜基础篇》、《RHCE 培训》文档等等。。。
恩,肯定有很多不足的地方,有什么不对的,请大家指出,小弟在这里感谢每一位看过这博客的人
今天我要讲的主题是:《linux开机流程》
相信很多刚学linux的人,都会觉得linux开机怎么这么复杂,像Windows, Mac OS多方便啊,一键就能打开电脑又省事又省心。没办法,谁让你学的是linux,注定就是要折腾他,你要折腾他当然首先就是要了解他吗,对于泡妞也是同样道理。好了废话不多马上上干货。
先简单列出开机流程
BOIS initialization(加载BIOS的硬件信息与进行自我测试POST,power on self test,并取得第一个可开机的装置
Boot loader(读取并执行第一个可开机装置内MBR的Boot loader,现在大多数都为grub)
Kernel initialization(依据boot loader的设定加载kernel,且kernel会侦测硬件与加载驱动程序)
init stars and enters desired run level by executing:
/etc/rc.d/rc.sysinit
/etc/rc.d/rc?.d/
/etc/rc.d/rc.local
(X display manger if appropr)
这一小节特别重点,下面我会详细说说
BIOS,boot loader
(1) BIOS,开机自我检测与MBR
Basic Input Output System。开机的时候透过BIOS程序去加载CMOS的信息,取得BIOS还会进行开机自我测试(power on self test,POST),接着会指定开机的的装置让我们可以读取磁盘中的操作系统核心档案,所以我们必须要一个开机管理程序来处理核心档案加载的问题,这个程序就是我们常说的grub了,然后grub是装在MBR上的
什么是MBR呢?就是磁盘的第一个扇区里面的一个最主要组成部分:主要开机区(Master boot record,MBR)占有446bytes
(2)boot loader
boot loader的最主要功能就是要认识操作系统的文件格式并据以加载到主存储器中执行(载入kernel)。boot roader可以安装在MBR上或者一个分区的boot sector上。
其实我们现在用得最多的roader 为grub,因为grub实在太强大,下次再写一个详细的grub blog。
kernel initialization(依据boot loader的设定加载kernel,且kernel会序侦测硬件与加载驱动程)
我们由boot loader的管理而开始读取核心档案后,Linux就会将核心解压缩到主存储器当中,并且利用核心的功能,开始测试与驱动各个周边装置,包括网卡,声卡,CPU等。可以说核心这时候接管了BIOS的工作,核心档案一般放在/boot里面,取名为/boot/vmlinuz
下面涉及了核心的编译和管理的小小知识,可能会有点难理解。因为Linux是可以透过动态加载核心模块的,这些核心模块就放置在/lib/modules/目录内。大家要注意的是/lib和/一定要放在同一个partition。因此在开机的过程中必须要挂载根目录,这样才能够读取核心模块提供加载驱动程序的功能。
一般来说,USB,SATA,SCSI等磁盘装置的驱动程序通常都是以模块的方式来存在的,大家想想,假设你的linux是安装在SATA磁盘上面,当你透过BIOS取得boot loader与kernel档案来开机,然后kernel会开始接管系统并且侦测硬件及尝试挂载根目录来取得额外的驱动。问题开始来了,核心根本不认识SATA磁盘,要加载SATA磁盘的驱动程序就要挂载根目录,但是SATA的驱动程序在/lib/modules内,你无法挂载根目录又怎么能取到/lib/modules/内的驱动程序呢?这里是不是有点绕,有点像是先有鸡还是先有鸡蛋的问题,认真看几次这里!!!
这里我就要介绍一个叫initrd的东东,Initial RAM Disk虚拟文件系统。他像kernel一样,能透过boot loader加载到内存中,然后这个档案会被解压缩并且在内存当中仿真成一个根目录,且此仿真在内存当中的文件系统能够提供一支可执行的程序,透过该程序来加载开机过程中所需要的核心模块
init stars and enters desired run level by executing(第一支程序init)
在核心加载完毕,进行完硬件侦测与驱动程序加载后,核心会主动的呼叫第一支程序,那就是/sbin/init,所以init的PID号码是1,且这支程序的配置文件为/etc/inittab,我们先看看这个配置文件
这里我们init按照图上的流程来处理,这里我分了6个步骤,有点像shell script从上往下执行,我们一步一步来分析
(1)initial run level -- 先取得runlevel亦即是默认执行等级的相关等级
run level | 模式 |
0 | halt(系统直接关机) |
1 | single user mode (单人维护模式,用在系统出问题时的维护)非常有用!!! |
2 | muli-user,without nfs(多用户模式,无NFS服务) |
3 | full multi user mode(含完整网络功能的纯文本模式) |
4 | unused(系统保留功能) |
5 | X11(与runlevel3类似,但加载了X window |
6 | reboot(重启) |
(2)system initialization scripts -- init处理系统初始化流程
我们加载各项系统服务之前,得先做好整个系统环境,这要利用/etc/rc.d/rc.sysinit这个shell script来设定好自己的系统环境,我简单介绍一下他的工作,有兴趣的朋友可以去cat /etc/rc.d/rc.sysinit
activate udev and selinu
set kernel parameters in /etc/sysctl.conf(加载核心的相关设定)
sets the system clock
loads keymaps
enables swap partitions
sets hostname
root filesystem check and remount
activate RAID and LVM devices
enable disk quotas
check and mount other filesystems
cleans up stale locks and PID files
在这个过程当中,比较值得注意的是自定义模块的加载,如果我们想要加载核心模块的话,可以将整个模块写入到/etc/sysconfig/modules/*.modules
(3)runlevel specific script directories-- 启动系统服务与相关启动启动配置文件
这时候Centos系统已经可以顺利工作了,我们还要启动系统所要的各项服务,那么各个不同的runlevel服务启动的各个shell script放在不同地方,看看我们的图片
由于我们预设的runlevel为3,所以我们执行的script应为/etc/rc.d/rc5.d/目录下的各个脚本程序
档案全部以Sxx或Kxx,其中xx为数字。K为开启,S为关闭,数字表示的顺序
全部是连接档,连接到stand alone服务启动的目录/etc/init.d/去
这里需要注意的最后一个被执行的目录是什么,亦即是S99local->../rc.local
如果我们有任何想要在开机时就进行的工作,直接讲他写入/etc/rc.d/rc.local,这样的话,开机就会将我的shell script执行
嗯嗯 就讲到这里啦 大家有什么不明白的可以留言我 有错的地方也可以指出来,谢谢大家