boot loader 讀取核心 linux將核心解壓到內存中 而且利用核心的功能,開始測試驅動和周邊的裝置,linux核心會議本身的功能從新檢測一次硬件,而不必定會使用BIOS檢測的硬件信息 此時核心已經接管bios後的工做了
虛擬文件系統 initial ram disk或者initial ram filesystem 通常會使用的文件名稱爲/boot/initrd或者/boot/initramfs
經過bootloader載入到內存當中 而且執行其中的程序來載入開機過程當中所須要的核心模塊 一般就是磁盤等文件系統的驅動 載入完成以後 會調用systemd來開始後續的正常開機流程 如上圖所示
如圖中所示 boot loader 可以載入kernel和initramfs ---initramfs解壓縮成爲根目錄 ----kernel用此目錄來載入適當的驅動程序,最終釋放虛擬文件系統,並掛在實際的根目錄文件系統,而後開始正常的開機流程。
1.查看initramfs裏面的文件內容
lsinitrd /boot/initramfs-3.10.0-299.e17.x86_64.img
其中包括一條重要的信息
lrwxrwxrwx 1 root 時間 init-->usr/lib/systemd/systemd
包含兩大部分 一個是事先宣告一些文件
另外一個是核心回去讀取的重要文件
2.去掉上面宣告的文件
a: mkdir /tmp/initramfs 建立一個解壓的目錄
cd /tmp/initramfs
dd if=/boot/initramfs-3.10.0-229.e17.x86_64.img of=initramfs.gz bs=11264 skip=1 刪除前面宣告的部分
ll initramfs.gz;fileinitramfs.gz 顯示文件權限;文件類型
b: gzip -d initramfs.gz 解壓縮文件
file intramfs 查看文件類型
c: cpio -i -d -H --no-absolute-filenames < initramfs 用cpio的命令解壓 不要絕對路徑
ll
從結果中能夠看出一個小型的根目錄文件系統 此時kernel就能夠掛載了
d: 查看此小型的文件系統中 systemd是以哪一個target來執行開機的
ll /usr/lib/systemd/system/default.target
顯示結果指向 --->initrd.target
e: 查看內設的initrd.target相依的全部服務信息
systemctl list-dependencies initrd.target
結論:initramfs是一個小型的根目錄 這個小型根目錄經過systemd來進行管理 經過initrd.target來開機 此環境依賴於basic.target sysinit.target等等硬件檢測、核心功能啓用的流程 而後開始讓系統順利運行,最後卸載initramfs 實際掛載系統的根目錄。
第一程序systemd及使用default.target進入開機流程分析
當核心載入完畢 硬件驅動加載以後 此時主機硬件已經準備就緒了 此時核心會主動調用systemd這個程序,此程序準備軟件執行的環境 包括主機名 網絡 語言環境 文件格式及其餘服務的啓動等。
默認的操做系統的環境爲default.target 主要項目 有multi-user.target 以及 graphical.target 還包括比較特殊的額rescue.target emergency.target shutdown.target等等 以及包括虛擬文件系統initramfs中的initrd.target
runlevel於systemd中的target對應關係
/usr/lib/systemd/system/runlevel0.target--------->poweroff.target
runlevel1.target--------->rescue.target
runlevel2.target--------->multi-user.target
multi-user.target
multi-user.target
5 graphical.target
6 reboot.target
systemd的處理流程
1.local-fs.target + swap.target 主要掛載本機/etc/fstab裏面所規範的文件系統與相關的內存置換空間
2.sysinit.target 這個主要檢測硬件 載入所須要的核心模塊等動做。
3.basic.target 載入主要的周邊硬件驅動程序與防火牆相關任務
4.multi-user.target下面的其餘通常系統或網絡服務的載入
5.圖形界面相關服務如 gdm.service 等其餘服務的載入
systemd執行sysinit.target初始化系統 basic.target準備系統
systemctl list-dependencies sysinit.target 查看依賴關係
大體的分類
此過程爲初始化系統
a: dev-hugepages.mount dev-mqueue.mount等的掛載服務 主要掛載和內存分頁與信息隊列 掛載後會出 現
/dev下的相應的目錄
b: 磁盤陣列 網絡磁盤 LVM文件系統 文件系統對照服務等等
c: 開機過程的信息傳遞與動畫執行 plymouthd服務搭配plymouth指令
d: 日誌式文件的使用 systemd-journald這個服務的啓用
e: 額外的核心模塊的載入 經過/etc/modules-load.d/*.conf 配置文件的設置
f: 額外的核心參數設置 包括/etc/sysctl.conf 以及/etc/sysctl.d/*.conf內部設置
g: 設置終端的文字顯示格式 console
h: 啓動動態設備管理員 就是udevd 用在動態對應實際設備存取與設備文件名對應的一個服務
basic.target 啓動系統服務
a 音頻驅動
b 防火牆
c 載入cpu微指令
d selinux
e 將開機過程 寫入/var/log/dmesg
f 加載管理員指定的模塊 /etc/sysconfig/modules/*.modules 及/etc/rc.modules
g timer 定時任務
multi-user.target下的服務
上面提到的初始化和基本的兩項流程結束後 要進入主機服務和網絡服務的功能了
multi-user.target將會啓動
/etc/systemd/system/multi-user.target.wants/下須要啓動的服務
若是用戶想將主機的服務和網那個羅服務的各個unit enable ,就將它放到/etc/systemd/system/multi-user.target.wants/ 這個目錄下作個連接 如此就能夠在開機的時候去啓動它 若是是設置爲disable的話 就是在上個目錄中刪除掉相應服務的連接文件。大多數的哦服務都是同時啓動 而不是依序啓動 這就是systemd的功能。
與systemV的rc.local.service
systemV的狀況 若是想讓系統額外執行程序 須要將程序或腳本的絕對路徑寫入到/etc/rc.d/rc.loacl這個文件中去,
systemd的狀況下 須要將腳本設定文件到/etc/systemd/system下 而後使用systemctl enable的方式來啓動它 而不是直接使用rc.local這個文件
rc.local.service 此服務的功能 不須要啓動 會本身判斷/etc/rc.d/rc.loacal 是否具備
可執行的權限來判斷是否要啓動此服務
增長可執行的權限 chmod a+x /etc/rc.d/rc.local
systemctl daemon-reload
systemctl list-dependencies multi-user.target | grep rc-local
會發現有rc-local.service 出現了
提供tty界面與登入的服務
multi-user.target 底下還有getty.target的操做界面 包括systemd-logind.service systemd-user-sessions.service
不必定哪一個服務先啓動 若是systemd-logind.service或者systemd-user-sessions.service服務還沒有執行完畢的話 那麼仍是沒法登錄的 因此會出現如下狀況 剛開機時出現tty1屏幕提示符 立刻輸入用戶名和密碼並不能登陸 可是稍微等一會以後就會順利登陸了
graphical.target下的服務
若是default.target爲圖形界面 那麼在multi-user.target執行完畢以後會執行此項服務
先查看以來關係
systemctl list-dependencies graphical.target
會出現不少的服務 其中比較重要的是圖形界面方面的gdm.service
開機流程中會用到的主要配置文件
與systemV兼容 不少服務腳本設置仍是會讀取/etc/sysconfig/下面的環境設置文件
1.
關於模塊:/etc/modprobe.d/*.conf及/etc/modules-load.d/*.conf
加載用戶自定義模塊
/etc/modules-load.d/*.comf 僅核心載入模塊的位置
/etc/modprobe.d/*.conf 能夠加上模塊參數的位置
systemd默認將須要的驅動都加載了 儘可能不動 可是若是有特定的參數 須要處理 應該在這裏進行,
舉例:
vsftpd這個服務 端口該爲555 就須要修改防火牆設定 其中針對ftp的防火牆設定中有一個模塊爲
nf_conntrack_ftp 因此須要將此模塊寫入系統開機流程中
a vim /etc/modules-load.d/
vbird.conf 此爲自定義的模塊配置文件
一個驅動模塊寫一行
b vim /etc/modprobe.d/vbird.conf 模塊額外的參數設置位置
options nf_conntrack_ftp ports=555
將原來的21端口改成555
c lsmod | grep nf_conntrack_ftp 驗證
無顯示 須要載入此模塊
d systmctl restart systemd-modules-load.service 載入模塊
lsmod | grep nf_conntarck_ftp
2.常規的設定文件
/etc/sysconfig/*
authconfig:使用本機的/etc/passwd, /etc/shadow 等 以及/etc/shadow 密碼記錄使用何種加密算法 身份登陸機制
cpupower linux核心如何操做cpu 對應的服務爲 cpupower.service
firewalld ipatables-config ebtables-config
防火牆服務啓動的額外參數
network-scripts
網卡驅動
核心與核心模塊
kernel的重要性 不言而喻
文件位置
核心:/boot/vmlinuz 或者 /boot/vmlinuz-version
核心解壓縮所須要的RAM DISK:/boot/initramfs (/boot/initramfs-version)
核心模塊:/lib/modules/version/kernel或者/lib/modules/$(unmae -r)/kernel
核心原始代碼:/usr/src/linux或者/usr/src/kernels/ 須要用戶安裝 默認不安裝
系統的信息記錄:/proc/version 核心版本
/proc/sys/kernel/ 系統核心功能
遇到新硬件的解決辦法
a 從新編譯核心 加入最新的硬件驅動程序源碼
b 將該硬件的驅動程序編譯成爲模塊 在開機的時候加載該模塊
核心模塊與依賴關係
相依賴性文件 /lib/modules/$(uname -r)/modules.dep 這個文件 記錄在覈心支持的模塊的各項相依性
創建此文件的命令 depmod
A 搜尋比此.dep文件內更新的模塊 找到新模塊纔會更新
n 不寫入.dep文件 而是將結果輸出到屏幕上
e 顯示出當前已經載入的 可是不可執行的模塊名稱
舉例
cp a.ko /lib/modules/$(uname -r)/kernel/drivers/net
depmod
核心模塊的觀察
lsmod 列出模塊的列表 包括名稱 大小 是否被其餘模塊使用
modinfo 單個模塊的詳細信息
核心模塊的加載與移除 手動加載模組
modprobe 比較簡單 解決依賴性問題 會主動的去搜尋moduels.dep的內容 建議
insmod 不會分析相依性 insmod 絕對路徑 參數
rmmod [-fw] module_name
f:強制
w:等待使用完成後 再刪除
核心模塊的額外參數設置 /etc/modprobe.d/*conf
針對模塊的特殊要求
Boot Loader : Grub2
此爲boot loader的程序
bootloader 的兩個stage 階段
在第一個開機裝置的MBR去讀取boot loader 446字節 第一個sector
stage1:執行boot Loader 主程序
必需要安裝在開機區 最小主程序
stage2:主程序加載配置文件
經過boot loader加載配置與相關的環境參數文件 包括系統定義與主要設定的文件grub.cfg 通常配置文件在/boot 下面
grub.cfg 是主要的配置文件 grub2認識的文件系統格式很是多
i386-pc x86架構的pc 所須要的grub2的相關模塊文件夾
grub2的配置文件 grub.cfg介紹
認識較多的文件系統 能夠利用grub2的主程序直接在文件系統中查找核心文件名
開機時 能夠自行編輯與修改開機設定的項目 相似bash的指令
動態查找配置文件,不須要再修改配置文件後從新安裝grub2 重啓便可生效
a 分區代號
三種模式
(hd0,1) 默認使用的語法 由grub2自動判斷分割格式
(hd0,msdos1) 磁盤分割爲傳統的MBR模式
(hd0,gpt1) 磁盤分割爲GPT模式
說明:小括號 hd表示 搜索順序爲硬盤的編號 第一個爲0 順延 每一個硬盤的第一個分區爲1 順延
硬盤從0開始 分區從1開始
注意與grub1版本是有區別的
b 配置文件
不建議自行修改配置文件的內容 可是能夠用grub2-mkconfig指令來產生新的grub.cfg文件
配置文件中的內容 比較重要的
set root='hd0,gpt2' 配置文件所在位置 /與/boot在不一樣的分區 因此hd0,2 又由於gpt的分區格式 因此使用(hd0,gpt2)
linux16 /vmlinuz-... root=/dev/mapper/centos-root ...
由於/與/boot不在同一個分區 因此會顯示/boot/vmlinuz-xxx--->(/boot)/vmlinuz-xxx--->(hd0,msdos1)/vmlinuz-xxx 用迭代的方式
initrd16 /initramfs-3.10...
此爲initramfs所在的文件名 與linux16那個vmlinuz-xxx相同 文件名須要搭配 set root=xxx 那個項目的裝置 纔會獲得正確的位置。
grub2配置文件的維護 /etc/default/grub 與 /etc/grub.d
不建議手動修改 應該要透過/etc/default/grub 這個主要環境配置文件與/etc/grub.d/目錄內的相關配置文件來處理
/etc/default/grub 主要環境配置文件
grub_timeout grub_timeout_style grub_terminal_output grub_default grub_cmdline_linux
舉例:
1
.vim /etc/default/grub
grub_timeout=40
grub_default=0
2.開始從新創建 grub.cfg
grub2-mkconfig -o /boot/grub2/grub.cfg
3.檢查是否真的改變
grep timeout /boot/grub2/grub.cfg
菜單創建的腳本 /etc/grub.d/*
grub2-mkconfig 會分析/etc/grub.d/*下面的文件 而後執行該文件來創建grub.cfg
grub.d/下面的文件包括:
00_header 創建初始的顯示項目 包括須要載入的模塊分析 tty的格式 秒數 菜單是否隱藏
10_linux 根據分析/boot底下的文件 嘗試找到正確的linux核心與讀取這個核心須要文件模塊與參數
30_os-prober 默認到系統上找到其餘的partition裏面可能含有的操做系統
40_custom 有其餘本身手動加上的菜單項目
直接指定核心開機
先到cfg配置文件中取得須要製做的核心菜單 而後將它複製的奧40_custom
再到40_custom當中根據需求修改便可
經過chainloader的方式移交Loader控制權
將控制權交給下一個boot loader而已 兩個參數 一個是前往的boot sector所在的分區代號 另外一個是設定chainloader在分區的boot sector上
舉例 假設系統分區在/dev/sda1 有且僅有一個硬盤 那麼要grub將控制權交給 windows的loader 只須要
menuentry "windows"{
insmod chain 載入chainloader的模塊
insmod ntfs 加載windows的文件系統模塊
set root=(hd0,1) 指定啓動的分區
chainloader +1 到boot sector 將loader軟件讀取出來
}
initramfs的重要性與創建新的initramfs文件
須要initramfs的時刻爲
根目錄所在的磁盤爲sata usb 或者 scsi等
根目錄所在文件系統爲lvm raid等特殊格式
根目錄所在文件系統爲非傳統linux認識的文件系統時候
其餘必需要在覈心載入時提供的模塊
通常發行版提供initramfs文件 可是若是有特殊的須要重作initramfs文件,可使用
dracut / mkinitrd來處理
語法:dracut [-fv] [--add-drivers 列表] initramfs文件名 核心版本
測試與安裝grub2
grub2-install [--boot-directory=DIR] INSTALL_DEVICE
DIR爲實際的目錄 grub2-install會默認將全部的文件都複製的奧/boot/grub2/* 若是想要複製到其餘目錄與裝置區 就要用到後面的參數
舉例 grub2-install /dev/vda
df -T | grep -i xfs
查看系統中是否有xfs文件系統
grub2-install
--skip-fs-probe /dev/vda4
強制安裝
grub2-install
--force --recheck --skip-fs-probe /dev/vda4
如此就將grub2這個主程序安裝到/dev/vda4以及MBR中
總結
a 若是從其餘的boot loader轉成grub2的時候 得先使用grub2-install 來安裝grub2
b 若是安裝到分區 須要加上額外的參數才能順利安裝上
c 開始編輯/etc/default/grub以及/etc/grub.d/* 這幾個重要的配置文件
d 使用grub2-mkconfig -o /boot/grub2/grub.cfg來創建開機的配置文件