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

 

  1. 系统先读grub.conf文件,
  2. 然后根据其内容选择内核并加载initrd.img文件到内存中,
  3. 内核的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设备挂接到根目录上("/")
  4. 内核中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驱动,然后再加载盘柜的驱动。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值