說起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/
- [root@localhost grub]# ls -l /boot/grub
- total 233
- -rw-r--r-- 1 root root 63 May 29 18:55 device.map
- -rw-r--r-- 1 root root 7584 May 29 18:55 e2fs_stage1_5
- -rw-r--r-- 1 root root 7456 May 29 18:55 fat_stage1_5
- -rw-r--r-- 1 root root 6720 May 29 18:55 ffs_stage1_5
- -rw------- 1 root root 1003 Jun 11 03:08 grub.conf
- -rw-r--r-- 1 root root 6720 May 29 18:55 iso9660_stage1_5
- -rw-r--r-- 1 root root 8192 May 29 18:55 jfs_stage1_5
- lrwxrwxrwx 1 root root 11 May 29 18:55 menu.lst -> ./gr
- ub.conf
- -rw-r--r-- 1 root root 6880 May 29 18:55 minix_stage1_5
- -rw-r--r-- 1 root root 9248 May 29 18:55 reiserfs_stage1_5
- -rw-r--r-- 1 root root 32428 Jan 5 2007 splash.xpm.gz
- -rw-r--r-- 1 root root 512 May 29 18:55 stage1
- -rw-r--r-- 1 root root 104988 May 29 18:55 stage2
- -rw-r--r-- 1 root root 7072 May 29 18:55 ufs2_stage1_5
- -rw-r--r-- 1 root root 6272 May 29 18:55 vstafs_stage1_5
- -rw-r--r-- 1 root root 8904 May 29 18:55 xfs_stage1_5
我們來看一下menu.lst
- default=0 #默認啓動選項 使用第一個啓動菜單(title)
- timeout=5 #默認時間
- splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz 背景圖片
- hiddenmenu 隱藏啓動菜單
- title Red Hat Enterprise Linux Server (2.6.18-308.el5)
- root (hd0,0) #內核文件的分區
- kernel /vmlinuz-2.6.18-308.el5 ro root=/dev/vol0/root rhgb quiet 內核
- initrd /initrd-2.6.18-308.el5.img #RAM DISK的文件名
- title Install Red Hat Enterprise Linux 5
- root (hd0,0)
- kernel /vmlinuz-5 ks=http://172.16.0.1/workstation.cfg ksdevice=eth0 noipv6
- initrd /initrd-5
- password --md5 $1$FSUEU/$uhUUc8USBK5QAXc.BfW4m.
grub加載要啓動的內核到內存,並展開。找到內核了,進入下一個階段
第三階段:內核引導階段
1、內核初始化
kernel 啓動時完成的任務 :
硬件探測
硬件驅動初始化 (initrd :RAMDISK)
掛載根文件系統(根切換initrd-->rootfs)
啓動init進程
內核在/boot 目錄下
- [root@localhost boot]# ls -l
- total 26074
- -rw-r--r-- 1 root root 70121 Jan 28 06:35 config-2.6.18-308.el5
- drwxr-xr-x 2 root root 1024 Jun 21 11:13 grub
- -rw------- 1 root root 3493005 May 29 18:40 initrd-2.6.18-308.el5.img
- -rw-r--r-- 1 root root 11406054 May 13 20:00 initrd-5
- drwx------ 2 root root 12288 May 29 18:21 lost+found
- -rw-r--r-- 1 root root 115211 Jan 28 06:35 symvers-2.6.18-308.el5.gz
- lrwxrwxrwx 1 root root 39 Jun 11 03:08 System.map -> /boot/System.map-2.6.28.10-zhanghui.com
- -rw-r--r-- 1 root root 990113 Jan 28 06:35 System.map-2.6.18-308.el5
- -rw-r--r-- 1 root root 1901940 Jan 28 06:35 vmlinuz-2.6.18-308.el5
- -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 的設置啓動終端或圖形界面
- id:3:initdefault: 默認啓動級別
- si::sysinit:/etc/rc.d/rc.sysinit 進行系統初始化
- l0:0:wait:/etc/rc.d/rc 0 關機
- l1:1:wait:/etc/rc.d/rc 1 #單用戶模式
- l2:2:wait:/etc/rc.d/rc 2
- l3:3:wait:/etc/rc.d/rc 3 #多用戶模式
- l4:4:wait:/etc/rc.d/rc 4 #保留
- l5:5:wait:/etc/rc.d/rc 5 #圖形界面
- l6:6:wait:/etc/rc.d/rc 6 #重啓
- ca::ctrlaltdel:/sbin/shutdown -t3 -r now
- pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
- pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
- 1:2345:respawn:/sbin/mingetty 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
- x:5:respawn:/etc/X11/prefdm -nodaemon
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 決定對應級別下 啓動不同的腳本 即不同的服務
- [root@localhost ~]# ls -l /etc/rc.d/
- total 112
- drwxr-xr-x 2 root root 4096 Jun 14 11:56 init.d
- -rwxr-xr-x 1 root root 2255 Dec 20 2011 rc
- drwxr-xr-x 2 root root 4096 Jun 14 11:58 rc0.d
- drwxr-xr-x 2 root root 4096 Jun 14 11:58 rc1.d
- drwxr-xr-x 2 root root 4096 Jun 14 11:58 rc2.d
- drwxr-xr-x 2 root root 4096 Jun 14 11:58 rc3.d
- drwxr-xr-x 2 root root 4096 Jun 14 11:58 rc4.d
- drwxr-xr-x 2 root root 4096 Jun 14 11:58 rc5.d
- drwxr-xr-x 2 root root 4096 Jun 14 11:58 rc6.d
- -rwxr-xr-x 1 root root 220 Dec 20 2011 rc.local
- -rwxr-xr-x 1 root root 26815 Dec 20 2011 rc.sysinit
對應的rc0~6目錄中是各需要開啓服務的鏈接文件,S開頭表示開啓,K開 頭表示關閉。
- [root@localhost ~]# ls /etc/rc.d/rc1.d
- K01dnsmasq K05conman K24irda K73ypbind K85mdmpd K88auditd K89rdisc S13cpuspeed
- K01smartd K05saslauthd K25sshd K74acpid K85messagebus K88pcscd K90bluetooth S26lvm2-monitor
- K02avahi-daemon K05wdaemon K30sendmail K74apmd K85rpcgssd K88syslog K90network S99single
- K02avahi-dnsconfd K10cups K35vncserver K74haldaemon K85rpcidmapd K88wpa_supplicant K92ip6tables
- K02NetworkManager K10hplip K35winbind K74ipmi K86nfslock K89dund K92iptables
- K02rhsmcertd K10psacct K44rawdevices K74named K87irqbalance K89hidd K95firstboot
- K03rhnsd K10xfs K50netconsole K74nscd K87mcstrans K89iscsi K95kudzu
- K03yum-updatesd K15gpm K60crond K74ntpd K87multipathd K89iscsid K99microcode_ctl
- K05anacron K15svnserve K69rpcsvcgssd K75netfs K87portmap K89netplugd K99readahead_early
- K05atd K20nfs K72autofs K85mdmonitor K87restorecond K89pand K99readahead_later
4、/sbin/mingetty 用戶名+密碼 決定哪些用戶可以登錄,哪些不可以。
/etc/login 登陸界面
與三個文件有關
/etc/password /etc/shadow /etc/gshadow
用戶登錄後,執行對應的 shell
第五個階段:啓動完成
下面 就可以進行自己的工作了 ,暴風雨平靜了。
最後總結一下,我們用到的目錄和腳本;
- 配置文件 :
- /etc/inittab
- /boot/grub/grub.conf
- 腳本 :
- /etc/rc.d/rc.sysinit
- 二進制程序 :
- /sbin/init
- /bin/bash
- /bin/sh -->/bin/bash
- 目錄
- /boot
- /grub
由於能力有限,時間有限,寫出來的東西也就更有限,先到此結束,路過的大蝦有什麼意見或建議請直接留言,我會及時改進。