Linux系統初始化流程:系統初始化相關基礎知識
內核簡介
-
內核的功能
- 進程管理:通過task_struct, scheduler 實現
- 內存管理
- I/O管理:中斷以及中斷處理
- 文件系統管理:ext3,ext4,xfs 等
- 驅動程序
- 安全相關:SELinux,各種加密庫
- 通用軟件,平臺相關軟件
-
內核設計流派
-
單內核:單一體系結構
- linux 為單一內核
- 模塊化設計:核心+外圍功能性模塊
- 外圍模塊:,ko結尾的 kernel object。通常在/lib/modules 下面的各目錄中
- 內核支持動態裝在模塊
- 微內核:多內核子系統 (windows, solaris)
-
fork() 用戶空間內核的管理:
- init :負責用戶空間進程的管理
- init :PID 為1,第一個用戶空間的任務
- 所在目錄: /sbin/init:
-
單內核:單一體系結構
系統初始化流程
- POST:硬件開機自檢,探測硬件設備,初始化內存,CPU等。
- BIOS:按照bios中的分區啟動順序啟動
-
MBR (Master Boot Record):讀取主引導記錄
- Boot loader ( 446 bytes ):用于加載內核并讀取分區信息的程序
- Partition Table ( 64 bytes ):分區記錄
- SA:MBR有效標志位
-
kernel 裝載:
- bootloader 裝載boot所在分區的內核到內存中,bootloader只有基本磁盤分區文件系統驅動,只能識別基本分區
- initrd (centos5) /initramfs (centos6 ):內存模擬根文件系統,讀取并裝載真正根文件系統所需要的驅動
- 真正根文件系統成功識別后,替換掉臨時根文件系統
-
init :真正根文件系統掛載成功后,init將開始運行初始化用戶空間的程序與服務
-
SysV 風格:Centos5 的init腳本
- 串行話:需按照依賴關系順序初始化進程,A–B–C
- 前一個進程初始化完成后,才能初始化后一個
-
Upstart :由ubuntu 研發
- dbus:可以在前一個進程啟動一部分時就開始下一個進程啟動
- 速度比SysV快
- SystemD :參考so x的初始化過程,速度更快
-
SysV 風格:Centos5 的init腳本
系統運行級別
-
linux系統包含 0-6 共7個運行級別
- 0:關機
- 1:單用戶模式,直接以root用戶登陸,用戶破譯密碼
- 2:多用戶模式,不支持NFS文件系統
- 3:完全多用戶模式,文本shell
- 4:預留級別
- 5:完全多用戶模式,圖形shell
- 6:重啟
- SysV 風格的/sbin/init的配置文件, /etc/inittab, 每一行指定一種操作
- id : 操作的ID
- runlevels:設置在哪些運行級別下執行此操作,不寫為所有級別
-
action:[ACTION_CMD] 動作,指定如何進行操作的操作
- initdefault:設置默認運行級別,無需定義操作
- sysinit:指定系統初始化腳本例如:si::sysinit:/etc/rc.d/rc.sysinit
- wait:等到系統切換到次級別時運行一次
- ctrlaltdel:指定組合件所執行的命令
- respawn:當制定操作進程被關閉后立即再從啟一次
- process :操作,具體運行的程序
init 命令的主要任務
-
init 的主要任務:
- 設置默認運行級
- 指定系統運行的初始化腳本
-
啟動指定級別下要啟動的服務,開關閉需要停止的服務
-
/etc/init.d/:服務腳本所在位置
-
/etc/rc.d/rcN.d (0-6)/ :不同級別下要操作的服務文件夾
- S## 需要在##開啟
-
K## 需要在##關閉
-
/etc/init.d/:服務腳本所在位置
- 定義組合鍵CtrlAltDel的動作
-
初始化字符終端,對應設備為:
- /dev/tty#, /dev/ttyS#, /dev/console, /dev/pts/#
- 調用:login–>/etc/issue
- 啟動圖形中斷:x-windows
-
系統初始化腳本的 /etc/rc.d/rc.sysinit
- 設置主機名
- 打印歡迎信息
- 激活SELinux和udev
- 激活swap
- 掛載/etc/fstab定義的本地文件系統
- 檢測根文件系統并對其以讀寫方式重新掛載
- 設置系統時鐘
- 裝載鍵盤映射
- 根據/etc/sysctl.conf設置內核參數
- 激活RAID和LVM設備
- 清理操作
MBR ( Master Boot Record)中bootloader介紹
-
MBR 中的 bootloader 程序
- LILO:LInux LOder 早起的bootloader :不能引導位于1024 Cylinder 以后分區中的os逐漸過時
-
GRUP:GRand Unified Bootloader ,啟動時候有兩個階段
- 1st stage:位于MBR中, 為了引導2nd stage
- 1.5st stage :位于boot基本磁盤分區中國,為識別內核文件所在的文件系統識別和拓展
-
2nd stage :位于boot基本磁盤分區GRUB的引導程序
- boot分區大小:CentOS5 100M, Centos6 200M
- 所在目錄: /boot/grub/ stage2的配置文件,grub.conf
-
Grub的功能:
-
選擇啟動的內核或系統, 可以隱藏選擇界面
-
提供交互式接口,e 進入編輯模式
-
基于密碼保護
- 啟動內核映像時:定義在配置文件中相應的title下
- 傳遞參數(進入編輯模式時):定義在全局字段中
-
選擇啟動的內核或系統, 可以隱藏選擇界面
- grub接口:
- title:操作系統或者內核的標題
- root:設置內核文件所在的分區作為grub的跟,無論硬盤是什么,都以hd#.#表示
- kernel :定義要使用的內核文件,后面可以附加傳遞
- initrd:指定為內核提供額外驅動等功能的ram disk或ram fs
-
init 運行級別參數傳遞,級別為1時為單用戶模式,用戶密碼修改
- 表示方法: 1,s,single,S
- 單用戶模式幾乎不會啟動任何服務,且不需要用戶登錄,但是會執行/etc/rc.d/rc.sysinit腳本;
-
如是連/etc/rc.d/rc.sysinit文件也不加載,則傳遞 emergency
單用戶啟動后,無需身份認證,直接root,此時可以進行設置密碼的操作
-
grub的配置文件,grub.conf 語法格式
title root (hd0,0) (Device,Part) : Device 在grub中,統統以hd開頭,并緊跟一個數字做各磁盤設備的標記,從0開始編號 Part 代表分區,從0開始編號 kernel :指定內核文件以及傳遞給內核的參數 內核文件位置:/vmlinux (這里的根是boot目錄) 參數:ro root=/path/to/DEVICE quiet initrd : 文件:通常為cpio歸檔,并使用gzip壓縮;通常以.img作為文件名后綴; /initrafs (這里的根是boot目錄)
-
grub 的安裝,如果MBR中簽446bytes 損壞,則需要修復bootloader,通常需要系統啟動盤,在緊急救援模式下進行,需要版本對應。以下以手工破壞MBR為例 演示,重啟后,系統已經無法掛載
第一種方式:插入系統光盤后以緊急救援模式啟動,如果分區信息沒有損壞原系統根目錄會自動掛在到/mnt/sysimage
chroot /mnt/sysimage grub-install --root-directory=/ /dev/sda
這里的–root-directory 變量應該指向boot目錄的上一層目錄, 后面接需要安裝bootloader的硬盤設備
第二種方式: 直接進入grub命令行接口進行安裝
chroot /mnt/sysimage grub ## 進入grub 命令行接口 grub> root (hd#,#) grub> setup (hd#) grub> quit
原創文章,作者:以馬內利,如若轉載,請注明出處:http://www.www58058.com/432
總結的很詳細,贊一個
文檔功底及認真的態度可見一斑,只是本地遷移到在線格式上稍亂了些,贊 加油 :mrgreen: