Linux啓動之旅

轉自:http://www.cnblogs.com/bangerlee/archive/2012/03/11/2388275.html


引言

某出租房內,某臺電腦的電源鍵被按下,於是開啓了一段Linux啓動之旅...

light

 

BIOS

系統啓動,首先進入BIOS。

  ● BIOS 爲 Base Input/Output System(基本輸入輸出系統)的簡寫

  ● 其執行POST(Power on self test,上電自檢),在發現問題時發出告警聲

  ● 在啓動設備(cd-rom,網絡,硬盤等)中搜尋boot loader

  ● 將boot loader stage1程序加載進內存,並執行

  ● 之後BIOS將“控制權”交給boot loader stage1

 

MBR

一般情況下,系統從硬盤啓動,硬盤中存放boot loader stage1程序的扇區被稱爲MBR。

  ● MBR 爲 Master boot record (主引導扇區)的簡稱

  ● 它是啓動硬盤(/dev/sda)的首個扇區

  ● 該512字節的扇區用於存放三個部分內容:

    1) boot loader stage1程序     446字節   

    2) 硬盤分區表                        64字節   

    3) 該扇區的有效標示              2字節

我們可以使用dd命令獲取該扇區內容

linux-q62c:/home/lx/test # dd if=/dev/sda1 of=sector bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 4.9448e-05 s, 10.4 MB/s

然後使用strings命令進行讀取:

複製代碼
linux-q62c:/home/lx/test # strings sector
ZRrK
D|f1
GRUB 
Geom
Hard Disk
Read
 Error
複製代碼

  ● boot loader stage1程序被執行之後,我們開始了GRUB之旅

 

GRUB

GRUB是主流的boot loader,GRUB分成多個階段運行。boot loader stage1是GRUB的第一階段,並不是其完全體。

  ● stage1的主要工作是加載stage1.5

  ● stage1.5加載kernel所在盤的文件系統,之後加載stage2

在/boot/grub目錄下,我們可以看到stage1.5階段可加載的文件系統:

linux-q62c:~ # ls /boot/grub/*stage1_5
/boot/grub/e2fs_stage1_5     /boot/grub/minix_stage1_5
/boot/grub/fat_stage1_5      /boot/grub/reiserfs_stage1_5
/boot/grub/ffs_stage1_5      /boot/grub/ufs2_stage1_5
/boot/grub/iso9660_stage1_5  /boot/grub/vstafs_stage1_5
/boot/grub/jfs_stage1_5      /boot/grub/xfs_stage1_5

  ● 根據/boot/grub/menu.lst配置文件,stage2階段顯示可進入的系統列表

複製代碼
default 0
timeout 8
gfxmenu (hd0,0)/boot/message

title SUSE Linux Enterprise Desktop 11 SP1 - 2.6.32.12-0.7
    root (hd0,0)
    kernel /boot/vmlinuz-2.6.32.12-0.7-default root=/dev/disk/by-id/ata-Hitachi_HTS541616J9SA00_SB3441GRHSXZDE-part1 resume=/dev/disk/by-id/ata-Hitachi_HTS541616J9SA00_SB3441GRHSXZDE-part5 splash=silent showopts
    initrd /boot/initrd-2.6.32.12-0.7-default
複製代碼

以上menu.lst文件中,列出了kernel和initrd鏡像的路徑

  ● GRUB的最後一步就是加載kernel和initrd鏡像

 

Kernel/initrd

接下來kernel鏡像被解壓並執行,kernel完成初始化硬件、進程調度、內存管理等任務。

  ● kernel對硬件進行再次檢測

  ● 加載必要的模塊和驅動程序,其他驅動程序和模塊組件(如USB、SATA等設備模塊)由後續initrd提供

因其他模塊由initrd提供,kernel得以成功“瘦身”:

linux-q62c:~ # ll /boot/vmlinuz-2.6.32.12-0.7-default
-rw-r--r-- 1 root root 3231872 May 20  2010 /boot/vmlinuz-2.6.32.12-0.7-default 
linux-q62c:~ # ll /boot/initrd-2.6.32.12-0.7-default 
-rw-r--r-- 1 root root 5847144 Mar  8 23:47 /boot/initrd-2.6.32.12-0.7-default

  ● 加載initrd(initial RAM disk,虛擬文件系統),在內存中展開得到虛擬根分區

此時initrd被展開,真正的磁盤還沒有被掛載,通過以下命令可以手工展開initrd:

linux-q62c:/boot # mkdir initrd.d
linux-q62c:/boot # cd initrd.d/
linux-q62c:/boot/initrd.d # cp ../initrd-2.6.32.12-0.7-default initrd.gz
linux-q62c:/boot/initrd.d # gzip -d initrd.gz 
linux-q62c:/boot/initrd.d # cpio -i < initrd 

展開initrd後,我們可以看到其內容與真正根目錄所包含的內容大致相同:

linux-q62c:/boot/initrd.d # ls
bin         dev                           lib              root        tmp
boot        etc                           lib64            run_all.sh  usr
bootsplash  init                          mkinitrd.config  sbin        var
config      initrd-2.6.32.12-0.7-default  proc             sys

  ● 執行initrd中的init腳本,完成加載模塊、檢查磁盤(fsck)等任務

  ● 掛載真正的根文件系統,之後執行/sbin/init程序

 

/sbin/init

/sbin/init是Linux啓動後第一個用戶態下的進程(PID爲1),根據/etc/inittab配置文件,/sbin/init完成系統軟件環境的設定,比如主機名、網絡設定以及其他啓動服務。

  ● 進行系統初始化

  ● 根據開機運行級別,啓動相應級別的服務

如下/etc/inittab文件中,默認的運行級別爲5:

複製代碼
# The default runlevel is defined here
id:5:initdefault:

l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
#l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
複製代碼

之後根據該級別,調用/etc/init.d/rc腳本,啓動/etc/init.d/rc5.d/目錄下的服務:

複製代碼
linux-q62c:~ # ll /etc/init.d/rc5.d/
……
lrwxrwxrwx 1 root root  9 Mar  8 23:29 K06syslog -> ../syslog
lrwxrwxrwx 1 root root 14 Mar  8 23:29 K07earlysyslog -> ../earlysyslog
lrwxrwxrwx 1 root root 10 Mar  8 23:29 K07network -> ../network
lrwxrwxrwx 1 root root 21 Mar  8 23:51 K08SuSEfirewall2_init -> ../SuSEfirewall2_init
lrwxrwxrwx 1 root root  7 Mar  8 23:29 K08dbus -> ../dbus
lrwxrwxrwx 1 root root 21 Mar  8 23:51 S01SuSEfirewall2_init -> ../SuSEfirewall2_init
lrwxrwxrwx 1 root root  8 Mar  8 23:14 S01acpid -> ../acpid
lrwxrwxrwx 1 root root  7 Mar  8 23:21 S01dbus -> ../dbus
……
複製代碼

以上所列文件中,以"S"開頭的項爲開機時啓動的服務,以"K"開頭的項爲關機或重啓時關閉的服務項。

  ● 根據運行級別,執行相應getty,進入登陸界面

複製代碼
# getty-programs for the normal runlevels
# <id>:<runlevels>:<action>:<process>
# The "id" field  MUST be the same as the last
# characters of the device (after "tty").
1:2345:respawn:/sbin/mingetty --noclear tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
複製代碼

至此,系統啓動過程完成,界面提示輸入用戶名和密碼。

 

小結

Linux啓動過程如下:

BIOS   --->   MBR   --->   GRUB   --->   kernel/initrd   --->   init

 

在GRUB階段,可以通過命令與系統交互,自行加載kernel和initrd,亦可修改kernel加載參數;

在initrd階段,我們可以加載自定義的initrd文件,使其加載更多模塊,亦可在此階段拉起bash,進行修復文件系統、修改root密碼等工作;

我們還可以修改/etc/inittab等啓動配置文件,自行設定啓動環境、按需要增刪啓動服務項;

⋯⋯

 

總之,Linux的啓動過程可以被靈活的定製。是否已經躍躍欲試了?嘗試一下吧,Just for fun!

 

------------------------------------------------------------

本文基於Suse11sp1(x86_64),該發行版可從這裏下載。

linux-q62c:~ # cat /etc/SuSE-release;uname -r
SUSE Linux Enterprise Desktop 11 (x86_64)
VERSION = 11
PATCHLEVEL = 1
2.6.32.12-0.7-default

 

Reference:  6 Stages of Linux Boot Process (Startup Sequence)

      Inside the Linux boot process


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