linux 的啓動流程分析

 說起linux的啓動流程,讓我想起一個成語:牽一髮而動全身,隨着你按下開關的那一刻,屏幕上雖然黑乎乎的沒有什麼界面,但背後卻引來了猶如千軍萬馬的程序。呵呵,這就叫不看不知道,一看嚇一跳,下面的兩幅圖我感覺很好,借來用一用,讓大傢俱體瞭解一下,你那一個簡單的動作所引發的“血案”

圖一:

 

圖2:

下面我們一起具體的把每一步分析一下:

第一階段:硬件引發啓動:

     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  

由於能力有限,時間有限,寫出來的東西也就更有限,先到此結束,路過的大蝦有什麼意見或建議請直接留言,我會及時改進。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章