Linux启动过程

      启动流程 
      1. 加载 BIOS 的硬件信息; 
  2. 读取 MBR 的 Kernel Loader (亦即是 lilo, grub, spfdisk 等等)开机信息; 
  3. 加载 Kernel 的操作系统核心信息; 
  4. Kernel 执行 init 程序并取得 run-level 信息; 
  5. init 执行 /etc/rc.d/rc.sysinit 档案; 
  6. 激活核心的外挂式模块 (/etc/modules.conf); 
  7. init 执行 run-level 的各个批次档( Scripts ); 
  8. init 执行 /etc/rc.d/rc.local 档案; 
  9. 执行 /bin/login 程序; 
  10. 登入之后开始以 Shell 控管主机。

下面对其中的几个重要部分说明一下:

加载内核
此前还会有bios加电,mbr引导等过程,但不在本文讨论的范围之内,故不再说明。
系统启动时,内存中并没有操作系统,故要先加载内核。加载过程复杂,这而不过多说明。

init
内核加载后,执行的第一个程序是init, 因此它的进程pid总为1。/etc/inittab是init程序的配置文件。从这里读取启动级别等信息。

/etc/rc.d/rc.sysinit 
init加载配置后,首先执行rc.sysinit文件。它大致的工作如下,从资料上看到,但还没有细细研究。
 1. 设定预设路径:( PATH ) 
  2. 设定网络状态:系统会再去读取 /etc/sysconfig/network,并将该档案内的资料,如 NETWORKING, FORWARD_IPV4, HOSTNAME, DOMAINNAME, GATEWARY, GATEWAYDEV 等等的设定读入系统中。 
  3. 激活系统的置换空间(简单的可以想成是虚拟内存): swapping 
  4. 检查档案系统:这个时候系统会去检查一些可能会存在的目录,例如 /fsckoptions 与 /forcfsck 及 /fastboot 等等的目录,当你的系统有不正常关机的现象时(例如突然的断电等等),那么 Linux 将会自动的强制去检查 root 的档案系统 ( checking root filesystems )。简单的想一想,就好象是 Windows 系统下,当你不正常关机时,在开机的过程中就会出现扫瞄硬盘的情况相同啦! 
  5. 周边设定与系统设定的参数 ( /proc ):在 Linux 或者是 Unix 系统中,你会在根目录中发现一个很奇怪的扇区,那就是 /proc 啰!其实这个目录是记录在内存当中的,每次开机的时候就会被建置起来。他的主要功能是记录主机的一些接口设备的最新资料状况!例如网络周边啦、输入输出周边啦等等的。没事的话,不要到里面乱砍喔!会有问题 
  6. 设定 Plug and Play ( PNP )的一些参数资料; 
  7. 清除 /etc/mtab ; 
  8. mount root 及 /proc 档案系统 :好了,将一些资料都设定好之后,当然就是需要将资料写下来啰!这个时候就会将 root 与 /proc 资料给他 mount 上档案系统啦! 
  9. 决定是否使用模块, 加载模块 
  10. 检查档案系统 :与前面相同的,当前面的 /fastboot 检查的旗标开启之后,就会以 fsck 检查你的其它扇区啰! ( 使用 fsck ) 
  11. 挂上其它档案系统 
  12. 设定 console 字型 
  13. 打开 quota 
  14. 清除不必要的档案, 如 lock, pid 
  15. 设定 clock 
  16. serial port 初始化 
  17. 将开机讯息经由 dmesg 放入 /var/log/dmesg 中 

/etc/rc.d/rcX.d/
根据不同的启动级别,在rc.sysinit执行完后。会到相应rcX.d目录下执行脚本。比如level为3 则执行/etc/rc.d/rc3.d/目录下的脚本。
而在这些rcX.d目录下并没有放实际的脚本!而是放的到/etc/rc.d/init.d目录下的实际脚本的字符链接。为什么要这么做呢。这和写程序一样,公用模块而已。例如rc3.d,  rc5.d两种级别下会启动好多同样的脚本。这样只要放到/etc/rc.d/init.d目录下,链接过去就可以了。所以init.d目录下应该是放置了所有的脚本,在不同级别时,去选择调用就可以了。
注:/etc/init.d 与 /etc/rc.d/init.d是一样的。谁链接到谁就不知道了。

可以使用chkconfig --list 命令来查看各个运行级别服务的启动与关闭情况

/etc/rc.d/rc.local
这是个性化模块rcX.d执行完后,要统一执行的脚本,(好像有的级别也是不执行它的)。所以用户想要系统自动执行的一些操作放在这比较合适。
比如系统启动时自动mount一些设备。为什么说放在这儿比较合适呢?如果你把一些执行操作写在加载内核之前是肯定不行的。因为有些操作是要一些服务启动后才能做的。在rc.sysinit  rcX.d执行完后,大部分系统服务等都已经启动了,在rc.local中执行一些用户操作是比较合适的。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值