linux 启动流详解
內核的功能:
??????? 進程管理: task_struct,scheduler
??????? 內存管理
??????? I/O管理:中斷及中斷處理
??????? 文件系統: ext3,ext4,reiserfs,xfs
??????? 驅動程序:
??????? 安全相關: SELinux
??????? 通用軟件,平臺類的軟件
內核設計流派:
??????? 單內核:單一體系結構
?????????????? Linux
???????????????????? 模塊化設計:核心+外圍功能性模塊組成
?????????????????????????? .ko:kernel object
?????????????????????????? 內核支持動態裝卸載模塊
??????????????????????????
??????? 微內核:內核子系統
?????????????? Windows
?????????????? Solaris
???????
??????? fork():
?????????????? init: 負責管理用戶空間的進程
?????????????????? init: PID 1
?????????????????? /sbin/init: 可執行文件
?????? Linux系統的初始化流程:
?????????????? POST: ROM+RAM
??????????????
?????????????? BIOS:Boot?? Sequence
?????????????? MBR:
???????????????????? 446: bootloader
???????????????????? 64:分區表
???????????????????? 2:5A?
?????????????
? ? ? ? ? ? ?? kernel文件:基本磁盤分區
? ? ? ? ? ? ??
? ? ? ? ? ? ?? /sbin/init
? ? ? ? ? ? ?? /lib/modules/
? ? ? ? ? ? ?
? ? ? ? ? ? ?? initrd:
? ? ? ? ? ? ? ? ? ? rd: ram disk
?????????????? /sbin/init:
?????????????????????? /etc/inittab
????????????????????? /etc/rc.d/rc.sysinit腳本
?????????????????????
??????????????? init:
????????????????????? CentOS 5: SysV格式的系統初始化程序
?????????????????????????????? 串行化:100
?????????????????????????????? A-- > B --> C
????????????????????????????????????? A ()
???????????????????? CentOS 6: Upstart
?????????????????????????? dbus
? ? ? ? ? ? ? ? ? ? ?????????? A
?????????????????????????????? B
?????????????????????????????? C
????????????????????????? SystemD:參考OS X中并行初始化的過程
?????????????????????????
????????????? 運行級別:
??????????????????? 0-6: 7個級別
????????????????????????? 0:關機
????????????????????????? 1:單用戶模式,直接以root用戶登錄
????????????????????????? 2:多用戶模式,不支持NFS文件系統
????????????????????????? 3:完全多用戶模式,文本模式
????????????????????????? 4:預留級別
????????????????????????? 5:完全多用戶模式,圖形模式
????????????????????????? 6:重啟
?????????????????????????
???????????? /sbin/init的配置文件:
????????????????????? 每行定義一種操作:
?????????????????????????????? id:操作的ID
?????????????????????????????? runlevels:在哪些級別下執行此操作
?????????????????????????????? action:動作
???????????????????????????????????? initdefault:設置默認運行級別,無需定義操作
???????????????????????????????????? sysinit:指定系統初始化腳本
???????????????????????????????????????????? si::sysinit:/etc/rc.d/rc.sysinit
???????????????????????????????????? wait:等待系統切換至此級別時運行一次:
???????????????????????????????????? ctrlaltdel:定義組合鍵別按下時要運行的命令:
???????????????????????????????????? respawn:當指定的操作進程被關閉時立即再啟動一次:
?????????????????????????????????????????
?????????????????????????????? process:操作
??????????????????????????????
??????????????????????????? /etc/inittab定義的操作:
?????????????????????????????????? 設定默認運行級別?????????????????
?????????????????????????????????? 指定系統運行的初始化腳本
?????????????????????????????????? 啟動指定級別下要啟動的服務,并關閉需要停止的服務
?????????????????????????????????? 定義CtrlAltDel組合的動作
?????????????????????????????????? 初始化字符終端
?????????????????????????????????? 啟動圖形終端
????????? 系統初始化腳本/etc/rc.d/rc.sysinit
??????????????? 設置主機名
??????????????? 激活SELinux和Udev
??????????????? 打印文本歡迎信息
??????????????? 激活swap
??????????????? 掛載/etc/fstab定義的本地文件系統
??????????????? 檢測根文件系統并對其以讀寫方式重新掛載
??????????????? 設置系統時鐘
??????????????? 裝載鍵盤映射
??????????????? 根據/etc/sysctl.conf設置內核參數
??????????????? 激活RAID和LVM設備
??????????????? 清理操作
? ? ? ? ? ? ??????????????????????
MBR:
? ? ? ? ? bootloader:程序
? ? ? ? ? ? ? ? ?? LILO:LInux LOader
? ? ? ? ? ? ? ? ? ? ? ? ?? 不能引導位于1024 Cylinder以后的分區中的OS:
? ? ? ? ? ? ? ? ?? GRUB: Grand Unified BootLoader
? ? ? ? ? ? ? ? ? ? ? ? ?? 1st? stage:? 位于MBR中,為了引導2nd stage
? ? ? ? ? ? ? ? ? ? ? ? ?? 1.5? stage:? 位于boot基本磁盤分區中,為識別內核文件所在的文件系統提供
? ? ? ? ? ? ? ? ? ? ? ? ?? 文件系統識別擴展
? ? ? ? ? ? ? ? ? ? ? ? ?? 2nd? stage:位于boot基本磁盤分區中,GRUB的引導程序
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? boot分區大小:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? CentOS5:100M
?????????????????????????????????????????? CentOS6: 200M????????????????
?????????????????????????????????? /boot/grub/
??????????????????????????????????????????? stage2: 配置文件
??????????????????????????????????????????? grub.conf??
????????????????? Grub的功能:
??????????????????????????? 1、選擇要啟動的內核或系統:
?????????????????????????????????? 能隱藏選擇界面
??????????????????????????? 2、交互式接口
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? e:編輯模式
? ? ? ? ? ? ? ? ? ? ? ? ? ? 3、 基于密碼保護
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 啟用內核映像:
?????????????????????????????????? 定義在相應的title下
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 傳遞參數(進入編輯模式)
??????????????????????????????????? 定義在全局
? ? ? ? ? ? ? ? ?
???????????????? grub接口:
??????????????????????? title:操作系統或內核的標題
??????????????????????? root:設定內核文件所在的分區為grub的根
??????????????????????? kernel:定義要使用的內核文件,后面可附加傳遞給內核的啟動參數
??????????????????????? initrd:指定為內核提供額外驅動等功能的ram disk或ram fs文件
???????????????????????
??????????????? init的級別1的表示方式:
?????????????????????? 1,s,single,S
?????????????????????? 單用戶模式幾乎不會啟動任何服務,且不需要用戶登錄:但是會執行
?????????????????????? /etc/rc.d/rc.sysinit腳本:
?????????????????????? 如是連/etc/rc.d/rc.sysinit文件也不加載,則傳遞 emergency
?????????????????????? 運行級別的切換:init
????????????????????????????? init [0-6]
?????????????????????????????
?????????????????????? 查看運行級別:
????????????????????????????? runlevel
????????????????????????????? who -r
??????????????? grub.conf配置文件語法:
? ? ? ? ? ? ? ? ? ? ? ? ? default=#:指定默認啟動的內核或OS:
? ? ? ? ? ? ? ? ? ? ? ? ? timeout=#:等待用戶選擇要啟動的內核或OS的時長,單位為秒
? ? ? ? ? ? ? ? ? ? ? ? ? splashp_w_picpath=/path/to/splashp_w_picpath_file:指定使用的背景圖片
? ? ? ? ? ? ? ? ? ? ? ? ? hiddenmenu:隱藏菜單
? ? ? ? ? ? ? ? ? ? ? ? ? title
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? root (hd0,0)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (Device,Part)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Device表示方式:在grub中,統統以hd開頭,并緊跟一個數字做
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 各磁盤設備的標記,從0開始編號
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Part表示方式:代表分區,從0開始編號
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? kernel
????????????????????????????????????? 指定內核文件及傳遞給內核的參數
?????????????????????????????????????????????? 參數: ro root=/path/to/DEVICE quiet
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? initrd
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ???? 文件: 通常為cpio歸檔,并使用gzip壓縮:通常以.img作為文件名后綴:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ?? grub的安裝:
????????????????????????????? 第一種方式
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? grub > root (hd#,#)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? grub > setup (hd#)
?????????????????????????????? grub > quit
???????????????????????????? 第二種方式:
???????????????????????????? # chroot /mnt/sysp_w_picpath
???????????????????????????? # grub-install? --root-directory=/? /dev/sda
啟動流程: POST --> BIOS(boot sequence) -->GRUB(bootloader (stage1:mbr;stage2:grub目錄中))-->kernel(initrd)-->SHELL
HOST:宿主機
Target:目標機
基于HOST制作一個簡單的可啟動的Linux:
??????? 1、給目標磁盤分區
?????????????? 兩個:
?????????????????????? 宿主機上: /dev/sdb1,/dev/sdb2
?????????????????????? /dev/sdb1 掛載至 /mnt/boot
?????????????????????? /dev/sdb2 掛載至 /mnt/sysroot
?????????? 2、安裝grub至目標磁盤
????????????????? # grub-install --root-directory=/mnt? /dev/sdb
?????????? 3、復制內核和initrd文件
??????????????? # cp? /boot/vmlinuz-VERSION?? /mnt/boot/vmlinuz
??????????????? # cp? /boot/initramfs-VERSION.img?? /mnt/boot/initramfs.img
?????????? 4、創建目標主機的根文件系統
???????????????????? mkdir? -pv? /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,home,root)
????????????? 接著去移植bash等至目標主機的根文件系統:
? ? ? ? ?? 5、為grub提供配置文件
? ? ? ? ? ? ? ?? # vim? /mnt/boot/grub/grub.conf
? ? ? ? ? ? ? ? ? ? default=0
? ? ? ? ? ? ? ? ? ? timeout=5
? ? ? ? ? ? ? ? ? ? title MageEdu Little Linux
? ? ? ? ? ? ? ? ? ? ? ? root(hd0,0)
? ? ? ? ? ? ? ? ? ? ? ? kernel /vmlinuz ro root=/dev/sda2 quiet selinux=0 init=/bin/bash
? ? ? ? ? ? ? ? ? ? ? ? initrd? /initramfs.img
???
???????? Linux的內核:單內核,支持動態裝載和卸載
???????????????? 模塊:? /lib/modules/KERNEL_VERSION/
????????????????
???????????????? 查看PCI命令:
???????????????? #lspci
???????????????? 列出內核加載的所有模塊
???????????????? #lsmod
???????????????? 查看某一模塊的詳細信息
???????????????? # modinfo? MOD_NAME
??????????????? 動態卸載某模塊:
????????????????? #modprobe -r? MOD_NAME
????????????????? #rmmod? MOD_NAME
??????????????? 動態裝載某模塊:
????????????????? #modprobe? MOD_NAME
????????????????? #insmod? /path/to/module_name
?????????????????
??????????????? /sbin/init
???????????????????? /etc/inittab, /etc/rc.d/rc.sysinit
???????????????????? 啟動對應級別的需要啟動的服務,停止需要關閉的服務:
??????????????????????????? /etc/rc.d/rcN.d/
?????????????????????????????????? S##
?????????????????????????????????? K##
?????????????????????????????????? 符號鏈接:? /etc/init.d/
?????????????????????????????????? ##:表示優先級(0-99),數字越小,優先級越高:
???????????????????? # chkconfig
? ? ? ? ? ? ? ? ? ? ? ? ? ? --add? SERVICE_NAME
? ? ? ? ? ? ? ? ? ? ? ? chkconfig SERVICE_NAME {on|off}
? ? ? ? ? ? ? ? ? ? ? ? chkconfig --level? LEVEL SERVICE_NAME {on|off}
? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? chkconfig --del SERVICE_NAME
Linux 啟動圖解:
?????????????????????????????????????????????????
啟動流程: POST --> BIOS(boot sequence) -->GRUB(bootloader (stage1:mbr;stage2:grub目錄中))-->kernel(initrd)-->SHELL????????????????????????????????
??????????????
當用戶打開PC 的電源,BIOS開機自檢,按BIOS中設置的啟動設備(通常是硬盤)啟動,接著啟動設備上安
裝的引導程序lilo或grub開始引導Linux, Linux首先進行內核的引導,接下來執行init程序,init程序
調用了rc.sysinit和rc等程序,rc.sysinit和rc當完成系統初始化和運行服務的任務后,返回init;init啟動了mingetty后,打開了終端供用戶登錄系統,用戶登錄成功后進入了Shell,這樣就完成了從開機到登錄的整個啟動過程。
BIOS自檢
? ? ? ? 稍有計算機基礎的人都應該聽過BIOS(Basic Input / Output System),又稱基本輸入輸出系統,可以視為是一個永久地記錄在ROM中的一個軟件,是操作系統輸入輸出管理系統的一部分。早期的BIOS芯片確實是"只讀"的,里面的內容是用一種燒錄器寫入的,一旦寫入就不能更改,除非更換芯片。現在的主機板都使用一種叫Flash EPROM的芯片來存儲系統BIOS,里面的內容可通過使用主板廠商提供的擦寫程序擦除后重新寫入,這樣就給用戶升級BIOS提供了極大的方便。
? ? ? ? BIOS的功能由兩部分組成,分別是POST碼和Runtime服務。POST階段完成后它將從存儲器中被清除,而Runtime服務會被一直保留,用于目標操作系統的啟動。BIOS兩個階段所做的詳細工作如下:
? ? ? ? ?步驟1:上電自檢POST(Power-on self test),主要負責檢測系統外圍關鍵設備(如:CPU、內存、顯卡、I/O、鍵盤鼠標等)是否正常。例如,最常見的是內存松動的情況,BIOS自檢階段會報錯,系統就無法啟動起來;
? ? ? ? ?步驟2:步驟1成功后,便會執行一段小程序用來枚舉本地設備并對其初始化。這一步主要是根據我們在BIOS中設置的系統啟動順序來搜索用于啟動系統的驅動器,如硬盤、光盤、U盤、軟盤和網絡等。我們以硬盤啟動為例,BIOS此時去讀取硬盤驅動器的第一個扇區(MBR,512字節),然后執行里面的代碼。實際上這里BIOS并不關心啟動設備第一個扇區中是什么內容,它只是負責讀取該扇區內容、并執行。
至此,BIOS的任務就完成了,此后將系統啟動的控制權移交到MBR部分的代碼。
? ? ? ? PS: 在個人電腦中,Linux的啟動是從0xFFFF0地址開始的。
當你打開計算機電源,計算機會首先加載BIOS信息,BIOS信息是如此的重要,以至于計算機必須在最開始就找到它。這是因為BIOS中包含了CPU的相關信息、設備啟動順序信息、硬盤信息、內存信息、時鐘信息、PnP特性等等。在此之后,計算機心里就有譜了,知道應該去讀取哪個硬件設備了。
系統引導
? ? ? 我們首先來了解一下MBR,它是Master Boot Record的縮寫。硬盤的0柱面、0磁頭、1扇區稱為主引導扇區。它由三個部分組成,主引導程序(Bootloader)、 硬盤分區表DPT(Disk Partition table)和硬盤有效標志(55AA),其結構圖如下所示:
磁盤分區表包含以下三部分:
? ? ? ? 1)、Partition ID? (5:延申? 82:Swap?? 83:Linux?? 8e:LVM???? fd:RAID)
? ? ? ? 2)、Partition起始磁柱
? ? ? ? 3)、Partition的磁柱數量
? ? ? ?通常情況下,諸如lilo、grub這些常見的引導程序都直接安裝在MBR中。我們以grub為例來分析這個引導過程。
?grub引導也分為兩個階段stage1階段和stage2階段(有些較新的grub又定義了stage1.5階段)。
? ? ? ? 1)、stage1:stage1是直接被寫入到MBR中去的,這樣機器一啟動檢測完硬件后,就將控制權交給了GRUB的代碼。也就是上圖所看到的前446個字節空間中存放的是stage1的代碼。BIOS將stage1載入內存中0x7c00處并跳轉執行。stage1(/stage1/start.S)的任務非常單純,僅僅是將硬盤0頭0道2扇區讀入內存。而0頭0道2扇區內容是源代碼中的/stage2/start.S,編譯后512字節,它是stage2或者stage1_5的入口。而此時,stage1是沒有識別文件系統的能力的。如果感覺腦子有些暈了,那么下面的過程就直接跳過,去看stage2吧!
? ? ? ? 【外傳】定位硬盤的0頭0道2扇區的過程:
? ? ? ? ?BIOS將stage1載入內存0x7c00處并執行,然后調用BIOS INIT13中斷,將硬盤0頭0道2扇區內容載入內存0x7000處,然后調用copy_buffer將其轉移到內存0x8000處。在定位0頭0道2扇區時通常有兩種尋址方式:LBA和CHS。如果你是刨根問底兒型的愛好者,那么此時去找谷哥打聽打聽這兩種方式的來龍去脈吧。
? ? ? ? ?2)、stage2:嚴格來說這里還應該再區分個stage1.5的,就一并把stage1.5放在這里一起介紹了,免得大家看得心里亂哄哄的。好的,我們繼續說0頭0到2扇區的/stage2/start.S文件,當它的內容被讀入到內存之后,它的主要作用就是負責將stage2或stage1.5從硬盤讀到內存中。如果是stage2,它將被載入到0x820處;如果是stage1.5,它將被載入到0x2200處。這里的stage2或者stage1_5不是/boot分區/boot/grub目錄下的文件,因為這個時候grub還沒有能力識別任何文件系統。
? ? ? ? ?? 如果start.S加載stage1.5:stage1.5它存放在硬盤0頭0道3扇區向后的位置,stage1_5作為stage1和stage2中間的橋梁,stage1_5有識別文件系統的能力,此后grub才有能力去訪問/boot分區/boot/grub目錄下的 stage2文件,將stage2載入內存并執行。
? ? ? ? ?? 如果start.S加載stage2:同樣,這個stage2也不是/boot分區/boot/grub目錄下的stage2,這個時候start.S讀取的是存放在/boot分區Boot Sector的stage2。這種情況下就有一個限制:因為start.S通過BIOS中斷方式直接對硬盤尋址(而非通過訪問具體的文件系統),其尋址范圍有限,限制在8GB以內。因此這種情況需要將/boot分區分在硬盤8GB尋址空間之前。
? ? ? ? 假如是情形2,我們將/boot/grub目錄下的內容清空,依然能成功啟動grub;假如是情形1,將/boot/grub目錄下stage2刪除后,則系統啟動過程中grub會啟動失敗。
啟動內核
? ? ?當stage2被載入內存執行時,它首先會去解析grub的配置文件/boot/grub/grub.conf,然后加載內核鏡像到內存中,并將控制權轉交給內核。而內核會立即初始化系統中各設備并做相關的配置工作,其中包括CPU、I/O、存儲設備等。
關于Linux的設備驅動程序的加載,有一部分驅動程序直接被編譯進內核鏡像中,另一部分驅動程序則是以模塊的形式放在initrd(ramdisk)中。
? ? ? Linux內核需要適應多種不同的硬件架構,但是將所有的硬件驅動編入內核又是不實際的,而且內核也不可能每新出一種硬件結構,就將該硬件的設備驅動寫入內核。實際上Linux的內核鏡像僅是包含了基本的硬件驅動,在系統安裝過程中會檢測系統硬件信息,根據安裝信息和系統硬件信息將一部分設備驅動寫入 initrd 。這樣在以后啟動系統時,一部分設備驅動就放在initrd中來加載。這里有必要給大家再多介紹一下initrd這個東東:
? ? ? ?initrd 的英文含義是 bootloader initialized RAM disk,就是由 boot loader 初始化的內存盤。在 linu2.6內核啟動前,boot loader 會將存儲介質中的 initrd 文件加載到內存,內核啟動時會在訪問真正的根文件系統前先訪問該內存中的 initrd 文件系統。在 boot loader 配置了 initrd 的情況下,內核啟動被分成了兩個階段,第一階段先執行 initrd 文件系統中的init,完成加載驅動模塊等任務,第二階段才會執行真正的根文件系統中的 /sbin/init 進程。
另外一個概念:initramfs
? ? ? ?initramfs 是在 kernel 2.5中引入的技術,實際上它的含義就是:在內核鏡像中附加一個cpio包,這個cpio包中包含了一個小型的文件系統,當內核啟動時,內核將這個 cpio包解開,并且將其中包含的文件系統釋放到rootfs中,內核中的一部分初始化代碼會放到這個文件系統中,作為用戶層進程來執行。這樣帶來的明顯的好處是精簡了內核的初始化代碼,而且使得內核的初始化過程更容易定制。
疑惑的是:我的內核是2.6.32-431版本,但在我的/boot分區下面卻存在的是/boot/initramfs-2.6.32-431.el6.x86_64.img類型的文件,沒搞明白,還望高人解惑。我只知道在2.6內核中支持兩種格式的initrd,一種是2.4內核的文件系統鏡像p_w_picpath-initrd,一種是cpio格式。
grub的stage2將initrd加載到內存里,讓后將其中的內容釋放到內容中,內核便去執行initrd中的init腳本,這時內核將控制權交給了init文件處理。我們簡單瀏覽一下init腳本的內容,發現它也主要是加載各種存儲介質相關的設備驅動程序。當所需的驅動程序加載完后,會創建一個根設備,然后將根文件系統rootfs以只讀的方式掛載。這一步結束后,釋放未使用的內存,轉換到真正的根文件系統上面去,同時運行/sbin/init程序,執行系統的1號進程。此后系統的控制權就全權交給/sbin/init進程了。
l? 初始化系統
經過千辛萬苦的跋涉,我們終于接近黎明的曙光了。接下來就是最后一步了:初始化系統。/sbin/init進程是系統其他所有進程的父進程,當它接管了系統的控制權先之后,它首先會去讀取/etc/inittab文件來執行相應的腳本進行系統初始化,如設置鍵盤、字體,裝載模塊,設置網絡等。主要包括以下工作:
1)、執行系統初始化腳本(/etc/rc.d/rc.sysinit),對系統進行基本的配置,以讀寫方式掛載根文件系統及其它文件系統,到此系統算是基本運行起來了,后面需要進行運行級別的確定及相應服務的啟動。rc.sysinit所做的事情(不同的Linux發行版,該文件可能有些差異)如下:
(1)獲取網絡環境與主機類型。首先會讀取網絡環境設置文件"/etc/sysconfig/network",獲取主機名稱與默認網關等網絡環境。
(2)測試與載入內存設備/proc及usb設備/sys。除了/proc外,系統會主動檢測是否有usb設備,并主動加載usb驅動,嘗試載入usb文件系統。
(3)決定是否啟動SELinux。
(4)接口設備的檢測與即插即用(pnp)參數的測試。
(5)用戶自定義模塊的加載。用戶可以再"/etc/sysconfig/modules/*.modules"加入自定義的模塊,此時會加載到系統中。
(6)加載核心的相關設置。按"/etc/sysctl.conf"這個文件的設置值配置功能。
(7)設置系統時間(clock)。
(8)設置終端的控制臺的字形。
(9)設置raid及LVM等硬盤功能。
(10)以方式查看檢驗磁盤文件系統。
(11)進行磁盤配額quota的轉換。
(12)重新以讀取模式載入系統磁盤。
(13)啟動quota功能。
(14)啟動系統隨機數設備(產生隨機數功能)。
(15)清楚啟動過程中的臨時文件。
(16)將啟動信息加載到"/var/log/dmesg"文件中。
?當/etc/rc.d/rc.sysinit執行完后,系統就可以順利工作了,只是還需要啟動系統所需要的各種服務,這樣主機才可以提供相關的網絡和主機功能,因此便會執行下面的腳本。
2)、執行/etc/rc.d/rc腳本。該文件定義了服務啟動的順序是先K后S,而具體的每個運行級別的服務狀態是放在/etc/rc.d/rc*.d(*=0~6)目錄下,所有的文件均是指向/etc/init.d下相應文件的符號鏈接。rc.sysinit通過分析/etc/inittab文件來確定系統的啟動級別,然后才去執行/etc/rc.d/rc*.d下的文件。
/etc/init.d-> /etc/rc.d/init.d
/etc/rc ->/etc/rc.d/rc
/etc/rc*.d ->/etc/rc.d/rc*.d
/etc/rc.local-> /etc/rc.d/rc.local
/etc/rc.sysinit-> /etc/rc.d/rc.sysinit
也就是說,/etc目錄下的init.d、rc、rc*.d、rc.local和rc.sysinit均是指向/etc/rc.d目錄下相應文件和文件夾的符號鏈接。我們以啟動級別3為例來簡要說明一下。
/etc/rc.d/rc3.d目錄,該目錄下的內容全部都是以 S 或 K 開頭的鏈接文件,都鏈接到"/etc/rc.d/init.d"目錄下的各種shell腳本。S表示的是啟動時需要start的服務內容,K表示關機時需要關閉的服務內容。/etc/rc.d/rc*.d中的系統服務會在系統后臺啟動,如果要對某個運行級別中的服務進行更具體的定制,通過chkconfig命令來操作,或者通過setup、ntsys、system-config-services來進行定制。如果我們需要自己增加啟動的內容,可以在init.d目錄中增加相關的shell腳本,然后在rc*.d目錄中建立鏈接文件指向該shell腳本。這些shell腳本的啟動或結束順序是由S或K字母后面的數字決定,數字越小的腳本越先執行。例如,/etc/rc.d/rc3.d /S01sysstat就比/etc/rc.d/rc3.d /S99local先執行。
3)、執行用戶自定義引導程序/etc/rc.d/rc.local。其實當執行/etc/rc.d/rc3.d/S99local時,它就是在執行/etc/rc.d/rc.local。S99local是指向rc.local的符號鏈接。就是一般來說,自定義的程序不需要執行上面所說的繁瑣的建立shell增加鏈接文件的步驟,只需要將命令放在rc.local里面就可以了,這個shell腳本就是保留給用戶自定義啟動內容的。
4)、完成了系統所有的啟動任務后,linux會啟動終端或X-Window來等待用戶登錄。tty1,tty2,tty3...這表示在運行等級1,2,3,4的時候,都會執行"/sbin/mingetty",而且執行了6個,所以linux會有6個純文本終端,mingetty就是啟動終端的命令。
除了這6個之外還會執行"/etc/X11/prefdm-nodaemon"這個主要啟動X-Window
至此,系統就啟動完畢了。以上分析不到的地方還請各位大蝦不吝指正。
關于Linux的其他分析內容下次再繼續寫。
最后附上一張非常完整的系統啟動流程圖,適合各個水平階段的讀者。
參考文獻:
http://blog.csdn.net/miss_acha/article/details/50004717
http://blog.chinaunix.net/uid-26495963-id-3066282.html
http://www.cnblogs.com/zengkefu/p/5559058.html
轉載于:https://blog.51cto.com/shamereedwine/1946925
總結
以上是生活随笔為你收集整理的linux 启动流详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P1011 车站
- 下一篇: Unity应用架构设计(6)——设计动态