作为一个操作系统,Linux启动和windows有类似的地方,就是要从BIOS开始,去找引导分区,然后加载系统,加载服务。
上面说的是一个笼统的过程。
下面就Linux的启动过程较为详细的谈一谈。
众所周知,操作系统作为系统软件,他的启动过程,离不开硬件的支持。
操作系统作为系统软件就要把系统硬件的信息进行记录,这就是读取BIOS的信息的过程。
粗略的启动流程如下,然后会逐一讲述每个流程。
1. 加载BIOS硬件信息,并获取第一个启动设备的代号。
2. 读取第一个启动设备的MBR(主引导记录)的引导程序(比如,grub)。。。。
3. 系统加载程序会加载系统的核心,并去用驱动程序对硬件进行驱动。
4. 系统核心进行初始化(比如获取网络环境,进行各个模块的载入)。
5. 加入用户自定义的模块。
6.执行用户自定义的设定
7.进入 /bin/login程序,等待用户登录
8. 由shell来控制主机,至此,登陆过程完毕。
逐一来讲述以上所有过程。
首先,肯定要获取硬件的基本信息, 而这个要通过BIOS来读取硬件的信息,比如CPU的主频,启动设备的检索顺序,I/O设备的中断号等等,得到这些基本信息之后,根据这些信息,进行加电自检了,也就是POST的过程,在这个过程中,对硬件进行加电自检,也就是进行基本的硬件检测,确定好启动的硬盘设备,就开始进行下一步工作了.
接着,要读取启动设备的MBR区域的内容,MBR 是什么呢?是主引导记录。
而在MBR中,安装了重要的程序---引导加载程序,其实就是boot loader,类似于嵌入式系统上的那些诸如uboot,vivi之类的东东,那么这个东东要干啥呢?
加载操作系统的核心。就是这个东东要干的事情。就是加载Kernel。
因为要进行启动操作系统,必然要把硬盘上的文件读到内存,才能进行kernel的加载,而在系统刚刚启动的时候,这就必然涉及到如何识操作系统的文件格式的问题。
这就要靠加载程序来读取硬盘中的文件。当前,linux上主流用grub作为系统的加载程序。
那么,经过grub的识别,开始读取系统核心文件之后,接着,系统就会将操作系统核心解压缩到内存中,一般来说,核心文件存放的目录是: /boot/vmlinuz*这个目录。
并且要利用操作系统核心,开始测试和驱动各台外部设备(利用kernel里面的驱动程序来驱动外部硬件设备)。
驱动程序加载完毕后,就要开始执行系统的第一个程序。
init 这个程序非常重要,我们可以看到这个程序的PID是1 ,呵呵,1号程序。
init的绝对路径是/sbin/init
init程序首先会去读取 /etc/inittab的里面的设置的系统的等级。
至于系统启动的等级,在最后讲。
在/etc/inittab这个文件中,除了能获取系统启动等级之外,还要获得与初始化系统的设置相关的信息。
这个信息是放在/etc/rc.d/rc.sysinit这个目录的。
我们看一下这个文件 cat /etc/rc.d/rc.sysinit,是一段脚本,观察这个脚本,我们发现,这个脚本要做的事情,是进行系统的网络配置,测试和加载内存以及外设存储,SELinux的启动,接口设备和即插即用设备的测试,以及用户自定义模块的加载,系统环境的设置,设置系统时间,最后把系统的启动信息写到 /var/log/dmesg文件中。
随着以上关于系统环境的设置,系统具备了初步运行的能力了,接下来,要加载系统的相关服务。而这些信息,也是从/etc/inittab下面读取到的,在/etc/inittab下面,指定了系统需要启动的服务的脚本及其路径:
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
这里面指出的是不同运行等级所放置的目录。在对应的:
/etc/rc.d/rc*.d 下面(其中*号代表对应的数字)
在这个目录下面,指定系统启动时要开启的服务。
启动完系统服务之后,就会进行用户自定义的服务,这里面的服务就类似于windows里面的 开始---启动里面的服务,如果把程序放到这里面,开机就会自启动,道理是一样的。
然后,开始设置用户的终端界面,根据定义的不同,或者设置X-window界面。
进行到这里,就可以开始使用Linux了。