您的位置:首页 > 运维架构 > Linux

Linux内核启动过程分析和思考

2009-10-19 15:59 375 查看
系统先读grub.conf文件,

然后根据其内容选择内核并加载initrd.img文件到内存中,

内核的main.c文件中的init函数进而执行initrd.img中的init脚本(nash脚本),该脚本运行流程如下:

装载基本的内核系统文件和设备文件 (mknod /dev/tty1....., insmod 硬盘、nfs模块等等)

根据grub的启动命令行参数,判断root根文件设备,参看/boot/grub/grub.conf文件中制定的参数,该参数在内核启动后可有cat /proc/cmdline显示出来,nash和其他的一些程序也是通 过读该系统文件来去内核启动参数的。

在将从grub启动参数中获得根设备并将其与/dev/root设备联接以后,通过nash的switchroot指令将/dev/root设备挂接到根目录上("/")

内核中main.c中init函数,调用/sbin/init处理/etc/inittab文件,该文件流程如下:

运行/etc/rc.sysinit

根据inittab文件第一行initdefault所指定的级别运行该级别下的启动脚本。

建立六个运行控制终端,在runlevel5下运行图形化界面

内核中main.c中init函数,调用/sbin/init处理/etc/inittab文件

rc.sysinit rc.d rc.local etc/inettab mingetty

grub文件详解

http://blog.csdn.net/zhuliting/archive/2010/04/19/5502636.aspx

Linux启动过程综述

http://www.unix-center.net/bbs/archiver/?tid-12186.html

使用ram disk初始化(initrd)

http://www.linuxfans.org/bbs/thread-169737-1-1.html

于是温习鸟哥的开机关机流程与Loader(这个比启动过程综述多了两步,更详细点):
1. 整个开机流程是

(1) 载入BIOS的硬件信息,并取得第一个开机装置的代号
(2)读取第一个开机装置的MBR的boot Loader (grub)的开机信息
(3)载入OS Kernel信息,解压Kernel,尝试驱动硬件
(4) Kernel执行init程序并获得run-lebel信息(如3或5)
(5) init执行/etc/rc.d/rc.sysinit
(6)启动内核外挂模块(/etc/modprobe.conf)
(7) init执行run-level的各种Scripts,启动服务
(8) init执行/etc/rc.d/rc.local
(9)执行/bin/login,等待用户Login
(10)Login后进入Shell

/etc/rc.d/rc.sysinit 文件详解

http://blog.csdn.net/jiangcl207504/archive/2010/01/15/5192215.aspx

linux 设置开机启动服务

http://darkmasky.javaeye.com/blog/253753

总结一下chkconfig的本质就是决定是否需要一个链接,请看如下测试:

[root@c190 ~]# /sbin/chkconfig --level 345 iptables on
[root@c190 ~]# ll /etc/rc.d/rc3.d |grep iptable
lrwxrwxrwx 1 root root 18 Nov 5 16:19 S08iptables -> ../init.d/iptables
[root@c190 ~]# /sbin/chkconfig --level 345 iptables off
[root@c190 ~]# ll /etc/rc.d/rc3.d |grep iptable
lrwxrwxrwx 1 root root 18 Nov 5 16:19 K92iptables -> ../init.d/iptables

另经测试setup也是这样的,请看如上。

如何改变linux启动时加载驱动程序的次序?(基本解决!)

已基本解决!

具体的解决办法如下:

编辑/boot目录下config打头的文件,以RedHat AS3 Update3为例是config-2.4.21-20.EL。找到“SCSI low-level drivers”这一段,你会发现“CONFIG_SCSI_AIC7XXX=m”这一行是在“CONFIG_SCSI_MEGARAID=m”、“CONFIG_SCSI_MEGARAID2=m”前头的,这也就是系统在引导时先加载AIC7XXX的原因。将后两行移至最前,保存config-2.4.21-20.EL。然后执行以下命令:
mv initrd-2.4.21-20.EL.img initrd-2.4.21-20.EL.bak
mkinitrd initrd-2.4.21-20.EL.img 2.4.21-20.EL
完成上述操作后重起机器,这时你就能看到在引导时首先加载了megaraid、然后再加载aic7xxx了。启动完成后就能正常使用阵列柜了! :D

据RedHat的人说这个问题在AS4上已经解决了,4.0中会先加载本地的SCSI驱动,然后再加载盘柜的驱动。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: