第五部分 linux系統管理員 開機流程 模組管理 與loader

第五部分   linux系統管理員  開機流程  模組管理  與loaderlinux

 
開機流程分析
cmos保存電腦硬件的參數
bios 基本的輸入輸出系統  讀取硬件的軟件
MBR  master boot record  主要的開機記錄扇區  裏面能夠安裝開機管理程序  例如grub  pfdisk等有446字節
partition table   分區表  記錄硬盤分割的狀態64字節
其中上面的mbr和分區表都記錄在硬盤的第一個扇區  大小爲512字節
主分區最多4個p1-p4 primary
擴展分區最多一個   擴展分區要佔據1個主分區的盤號的位置    擴展分區中能夠創建多個邏輯分區   並口硬盤邏輯分區(63)多餘串口硬盤的邏輯分區數量(15個)
windows和linux操做系統又有所不一樣
mbr  沒法安裝2.2t以上的容量    分區表只有16個字節
GPT    GUID partition table 磁盤分區表
MBR爲512字節大小    而 GPT爲4k大小的塊大小   爲了兼容磁盤  因此定義上gpt將區塊易LBA 512字節來規劃   最前面的34個LBA 組成分區磁塊的信息記錄   最後面的33個LBA做爲備份
boot loader   每一個分區的第一個部分都會預留一塊給系統引導程序 
MBR中能夠安裝引導程序  windows默認安裝   linux可手動安裝   因此先安裝windows 再裝linux
1.BIOS讀取cmos的設置 進行自我檢測  並依據設置取得第一個可開機的裝置
2.讀取並執行第一個開機裝置內的MBR的boot loader   也就是grub2     spfdisk等程序
3.根據boot loader的設置 載入操做系統的kernel    內核會檢測硬件而且加入驅動程序
4.驅動完成以後   kernel會主動呼叫 systemd程序  而且以default.target流程開機
systemd執行syssinit.target初始化系統以及basic.target準備系統       系統初始化包括運行環境
systemd啓動multi-user.target下的本機與服務器服務 操做系統的基本服務和網絡服務
systemd執行multi-user.target下的/etc/rc.d/rc.local文件 自定義本機自啓服務
systemd執行multi-user.target下的getty.target及登陸服務 終端環境
systemd執行graphical須要的服務 圖形界面服務
 
BIOS boot loader 與kernel載入
boot loader 的功能 認識操做系統的文件格式而且將核心加載到內存中去執行,因爲不一樣的操做系統的文件格式不一樣 ,因此每種操做系統都有本身的boot loader
 

 

  圖中的藍色塊爲boot  sector      扇區    
boot loader程序安裝到此扇區或者mbr中
·此程序提供以下功能
a 菜單    多重開機選項
b 載入核心文件 直接指向可開機的程序區段來開始操做系統
c 轉交給其餘的loader 將開機管理功能轉交給其餘的loader負責
須要注意的是windows的loader默認沒有控制權轉交的功能,因此不能使用windows的loader來載入linux的loader
 

 

  如圖中所示  
菜單一 MBR grub2----kernel file----booting
menu2 MBR grub2----boot sector(Windows loader)----Windows kernel----booting
menu3 MBR grub2----boot sector(grub2)----kernel file(linux)----booting
載入的核心kernel偵測硬件與initramfs的功能
boot loader 讀取核心   linux將核心解壓到內存中  而且利用核心的功能,開始測試驅動和周邊的裝置,linux核心會議本身的功能從新檢測一次硬件,而不必定會使用BIOS檢測的硬件信息  此時核心已經接管bios後的工做了
核心文件的位置:/boot   取名爲/boot/vmlinuz
核心模塊放在/lib/modules/目錄當中  由於模組要放到磁盤的根目錄內因此分區時要注意  /和/lib在同一個分區
通常的非必要的功能且能夠編譯爲模塊的核心功能   因此usb sata   scsi等磁盤裝置的驅動程序一般都是以模組的方式來存在的。

 

  bios    ----boot loader ----kernel    ---檢測硬件掛在根目錄取得驅動程序
可是kernel不認識sata硬盤  因此須要載入sata的驅動程序  不然沒法掛在根目錄    可是驅動程序在/lib/modules內  沒法掛在根目錄的狀況下如何讀取/lib/modules/內的驅動呢?  此時就須要經過虛擬的文件系統 來掛在目錄
虛擬文件系統 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來創建開機的配置文件
相關文章
相關標籤/搜索