说起linux的启动流程,让我想起一个成语:牵一发而动全身,随着你按下开关的那一刻,屏幕上虽然黑乎乎的没有什么界面,但背后却引来了犹如千军万马的程序。呵呵,这就叫不看不知道,一看吓一跳,下面的两幅图我感觉很好,借来用一用,让大家具体了解一下,你那一个简单的动作所引发的“血案”

图一:

linux 的启动流程分析_post  MBR grub

 

图2:

linux 的启动流程分析_post  MBR grub _02下面我们一起具体的把每一步分析一下:

第一阶段:硬件引发启动:

     1、 POST(power on system test) 加电自检

   主板通电后,通过固化在主板上的芯片(BIOS)自检,而BIOS的设置信息保存在 COMS(互补金属氧化物   是记录各种硬件参数且嵌入到主板上面)中,检查计算机启动需要用到的最基本的硬件(cpu,memory,磁盘,鼠标,键盘等),同时也查找启动磁盘,找到启动磁盘的第一个扇区,boot squence(找到MBR)。

     2、MBR:Master Boot Record,即主引导记录

     共有512个字节,前446个字节记录的是bootloader,grub的安装程序就在bootloader。

     bootloader是引导装载程序,使用的软件主要有:LILO,grub。现在主流是grub。我们这里只说grub ,grub出场 ,进入下一阶段。

第二个阶段:grub启动引导

      grub分为两个阶段来执行:

    stage1:执行boot loader主程序

            被安装在启动区,即MBR的前446个字节,作用是启动stage2.

    stage2:主程序加载配置文件

            是grub的核心映像,加载所有的配置文件与相关的环境参数文件(包括文件系统的定义域主要的配置文件 menu.lst)

    配置文件在/boot/grub/

  1. [root@localhost grub]# ls -l /boot/grub 
  2. total 233 
  3. -rw-r--r-- 1 root root     63 May 29 18:55 device.map 
  4. -rw-r--r-- 1 root root   7584 May 29 18:55 e2fs_stage1_5 
  5. -rw-r--r-- 1 root root   7456 May 29 18:55 fat_stage1_5 
  6. -rw-r--r-- 1 root root   6720 May 29 18:55 ffs_stage1_5 
  7. -rw------- 1 root root   1003 Jun 11 03:08 grub.conf 
  8. -rw-r--r-- 1 root root   6720 May 29 18:55 iso9660_stage1_5 
  9. -rw-r--r-- 1 root root   8192 May 29 18:55 jfs_stage1_5 
  10. lrwxrwxrwx 1 root root     11 May 29 18:55 menu.lst -> ./gr
  11. ub.conf 

  12. -rw-r--r-- 1 root root   6880 May 29 18:55 minix_stage1_5 
  13. -rw-r--r-- 1 root root   9248 May 29 18:55 reiserfs_stage1_5 
  14. -rw-r--r-- 1 root root  32428 Jan  5  2007 splash.xpm.gz 
  15. -rw-r--r-- 1 root root    512 May 29 18:55 stage1 

  16. -rw-r--r-- 1 root root 104988 May 29 18:55 stage2 
  17. -rw-r--r-- 1 root root   7072 May 29 18:55 ufs2_stage1_5 
  18. -rw-r--r-- 1 root root   6272 May 29 18:55 vstafs_stage1_5 
  19. -rw-r--r-- 1 root root   8904 May 29 18:55 xfs_stage1_5 

我们来看一下menu.lst 

 

  1. default=0   #默认启动选项 使用第一个启动菜单(title)
  2. timeout=5  #默认时间
  3. splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz  背景图片
  4. hiddenmenu  隐藏启动菜单
  5.  
  6. title Red Hat Enterprise Linux Server (2.6.18-308.el5) 
  7.         root (hd0,0)  #内核文件的分区
  8.         kernel /vmlinuz-2.6.18-308.el5 ro root=/dev/vol0/root rhgb quiet 内核
  9.         initrd /initrd-2.6.18-308.el5.img #RAM DISK的文件名
  10. title Install Red Hat Enterprise Linux 5 
  11.         root (hd0,0) 
  12.         kernel /vmlinuz-5 ks=http://172.16.0.1/workstation.cfg ksdevice=eth0 noipv6 
  13.         initrd /initrd-5  
  14.         password --md5 $1$FSUEU/$uhUUc8USBK5QAXc.BfW4m. 

   grub加载要启动的内核到内存,并展开。找到内核了,进入下一个阶段 


  第三阶段:内核引导阶段  

   1、内核初始化

kernel 启动时完成的任务 :

 

          硬件探测

          硬件驱动初始化 (initrd :RAMDISK)

 挂载根文件系统(根切换initrd-->rootfs)

 启动init进程

 

 内核在/boot 目录下

  1. [root@localhost boot]# ls -l 
  2. total 26074 
  3. -rw-r--r-- 1 root root    70121 Jan 28 06:35 config-2.6.18-308.el5 
  4. drwxr-xr-x 2 root root     1024 Jun 21 11:13 grub 
  5. -rw------- 1 root root  3493005 May 29 18:40 initrd-2.6.18-308.el5.img 
  6. -rw-r--r-- 1 root root 11406054 May 13 20:00 initrd-5 
  7. drwx------ 2 root root    12288 May 29 18:21 lost+found 
  8. -rw-r--r-- 1 root root   115211 Jan 28 06:35 symvers-2.6.18-308.el5.gz 
  9. lrwxrwxrwx 1 root root       39 Jun 11 03:08 System.map -> /boot/System.map-2.6.28.10-zhanghui.com 
  10. -rw-r--r-- 1 root root   990113 Jan 28 06:35 System.map-2.6.18-308.el5 
  11. -rw-r--r-- 1 root root  1901940 Jan 28 06:35 vmlinuz-2.6.18-308.el5 
  12. -rw-r--r-- 1 root root  1901940 May 13 20:00 vmlinuz-5 

    内核自己初始化,装载基本的硬件驱动,把内核的基本功能初始化。

2、引导initrd解压载入,

initrd其实就是一个小型的linux系统它的作用是将在lvm或raid上根文件系统进行只读性挂载。让内核识别根文件系统所在的磁盘。启动真正的根文件系统的/sbin/init进程

第四个阶段:init初始

     1、/sbin/init 的配置文件是/etc/inittab 

 根据/etc/inittab 的设置启动终端或图形界面

  1. id:3:initdefault:  默认启动级别
  2. si::sysinit:/etc/rc.d/rc.sysinit  进行系统初始化
  3.  
  4. l0:0:wait:/etc/rc.d/rc 0  关机
  5. l1:1:wait:/etc/rc.d/rc 1  #单用户模式
  6. l2:2:wait:/etc/rc.d/rc 2 
  7. l3:3:wait:/etc/rc.d/rc 3  #多用户模式
  8. l4:4:wait:/etc/rc.d/rc 4  #保留
  9. l5:5:wait:/etc/rc.d/rc 5  #图形界面
  10. l6:6:wait:/etc/rc.d/rc 6  #重启
  11.  
  12. ca::ctrlaltdel:/sbin/shutdown -t3 -r now 
  13.  
  14. pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" 
  15.  
  16. pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" 
  17.  
  18. 1:2345:respawn:/sbin/mingetty tty1 
  19. 2:2345:respawn:/sbin/mingetty tty2 
  20. 3:2345:respawn:/sbin/mingetty tty3 
  21. 4:2345:respawn:/sbin/mingetty tty4 
  22. 5:2345:respawn:/sbin/mingetty tty5 
  23. 6:2345:respawn:/sbin/mingetty tty6 
  24.  
  25. x:5:respawn:/etc/X11/prefdm -nodaemon 
  26.  
  27.                                                                           

 

2、/etc/rc.d/rc.sysinit :设置整个系统的环境 

实现的功能有 :

        n 激活udev和selinux

        n 通过读取/etc/sysctl.conf设置内核参数 

      n 设置系统时间 

      n 加载键盘映射 

       n 启用swap分区 

      n 设置主机名 

      n 检查根文件系统,并以读写方式重新挂载根文件系统 

       n 激活LVM和RAID设备 

       n 启动磁盘限额 

      n 挂载其他文件系统 

        n 清理过期文件锁和PID文件 

/etc/rc.d/rc.sysinit这个脚本运行完毕,继续按照/etc/inittab中继续开启对应运行级别中的服务,这些服务有inittab中:

 

级别不同,只是启动的服务不同 ,

3、/etc/rc.d/rc#.d  决定对应级别下 启动不同的脚本 即不同的服务 

  1. [root@localhost ~]# ls -l /etc/rc.d/ 
  2. total 112 
  3. drwxr-xr-x 2 root root  4096 Jun 14 11:56 init.d 
  4. -rwxr-xr-x 1 root root  2255 Dec 20  2011 rc 
  5. drwxr-xr-x 2 root root  4096 Jun 14 11:58 rc0.d 
  6. drwxr-xr-x 2 root root  4096 Jun 14 11:58 rc1.d 
  7. drwxr-xr-x 2 root root  4096 Jun 14 11:58 rc2.d 
  8. drwxr-xr-x 2 root root  4096 Jun 14 11:58 rc3.d 
  9. drwxr-xr-x 2 root root  4096 Jun 14 11:58 rc4.d 
  10. drwxr-xr-x 2 root root  4096 Jun 14 11:58 rc5.d 
  11. drwxr-xr-x 2 root root  4096 Jun 14 11:58 rc6.d 
  12. -rwxr-xr-x 1 root root   220 Dec 20  2011 rc.local 
  13. -rwxr-xr-x 1 root root 26815 Dec 20  2011 rc.sysinit 

 

对应的rc0~6目录中是各需要开启服务的链接文件,S开头表示开启,K开 头表示关闭。

  1. [root@localhost ~]# ls /etc/rc.d/rc1.d 
  2. K01dnsmasq         K05conman     K24irda        K73ypbind     K85mdmpd        K88auditd          K89rdisc            S13cpuspeed 
  3. K01smartd          K05saslauthd  K25sshd        K74acpid      K85messagebus   K88pcscd           K90bluetooth        S26lvm2-monitor 
  4. K02avahi-daemon    K05wdaemon    K30sendmail    K74apmd       K85rpcgssd      K88syslog          K90network          S99single 
  5. K02avahi-dnsconfd  K10cups       K35vncserver   K74haldaemon  K85rpcidmapd    K88wpa_supplicant  K92ip6tables 
  6. K02NetworkManager  K10hplip      K35winbind     K74ipmi       K86nfslock      K89dund            K92iptables 
  7. K02rhsmcertd       K10psacct     K44rawdevices  K74named      K87irqbalance   K89hidd            K95firstboot 
  8. K03rhnsd           K10xfs        K50netconsole  K74nscd       K87mcstrans     K89iscsi           K95kudzu 
  9. K03yum-updatesd    K15gpm        K60crond       K74ntpd       K87multipathd   K89iscsid          K99microcode_ctl 
  10. K05anacron         K15svnserve   K69rpcsvcgssd  K75netfs      K87portmap      K89netplugd        K99readahead_early 
  11. K05atd             K20nfs        K72autofs      K85mdmonitor  K87restorecond  K89pand            K99readahead_later 

 

4、/sbin/mingetty 用户名+密码  决定哪些用户可以登录,哪些不可以。

   /etc/login  登陆界面   

   与三个文件有关 

   /etc/password /etc/shadow /etc/gshadow  

  用户登录后,执行对应的 shell

第五个阶段:启动完成

     下面 就可以进行自己的工作了 ,暴风雨平静了。

最后总结一下,我们用到的目录和脚本;

  1. 配置文件 : 
  2.  /etc/inittab 
  3.  /boot/grub/grub.conf 
  4.  脚本 : 
  5.    /etc/rc.d/rc.sysinit 
  6. 二进制程序 : 
  7.  /sbin/init 
  8.   /bin/bash 
  9.         /bin/sh -->/bin/bash 
  10. 目录  
  11.  /boot  
  12.  /grub  

由于能力有限,时间有限,写出来的东西也就更有限,先到此结束,路过的大虾有什么意见或建议请直接留言,我会及时改进。