@
系統初始化
啟動流程
1)讀取BIOS,根據BIOS加載硬件信息和硬件系統自檢;
2)根據BIOS讀取第一個可啟動設備中MBR的啟動引導程序(Boot Loader);
3)根據啟動引導程序,將指定內核(Kernel)文件加載至內存中解壓和執行;
4)待內核檢測硬件和加載驅動程序完畢,系統即可運行。
//內核文件一般為壓縮文件,使用前需解壓縮,才能加載到內存中
在驅動程序加載完成后,Kernel會主動調用Systemd程序進行default.target流程:
1)Systemd執行sysinit.target初始化系統;
2)Systemd執行basic.target設計運行環境;
3)Systemd啟動multi-user.target下的本機/服務器的服務;
4)Systemd執行multi-user.target的/etc/rc.d/rc.local、getty.target和登錄服務
//若是圖形界面,Systemd還需執行graphical.target所需的服務
BIOS(基礎輸入輸出系統):提供系統最底層和最直接的硬件設置和控制
1)不論BIOS還是UEFI BIOS都統稱為BIOS(固化在主板上)
MBR(主引導記錄):磁盤中的Boot Loader區塊
1)系統的MBR一般指的是第一個啟動設備中的MBR
2)只要BIOS可檢測到磁盤(不論任何格式),都可通過硬件的INT 13中斷功讀取磁盤內的第一個扇區內的MBR
Boot Loader
Boot Loader(啟動引導程序):識別內核文件格式並加載至內核中執行
1)Boot Loader程序安裝在MBR中(磁盤的第一個扇區)
//不同的操作系統的Boot Loader不同,且內核需對應的Boot Loader才可加載,所以每個文件系統都會保留一塊啟動扇區(Boot Loader)用於安裝Boot Loader
如:系統中有多個文件系統時的boot loader
//Windows安裝時,默認將在MBR和boot sector上都裝上boot loader
//Linux可選擇是否安裝選擇在MBR,若不選擇在MBR上安裝boot loader,則boot loader僅在boot sector上安裝(反之亦然)
boot loader功能:
1)提供多重引導啟動功能(加載指定的內核文件);
//實現一台電腦安裝多個操作系統
2)直接加載內核文件;
//默認會加載至boot sector內的啟動引導程序(如:grub2)
3)將啟動管理功能轉交至其他boot loader
//Windows的boot loader默認不具有控制權轉交功能,所以不能實現在啟動Windows后的boot loader后再加載Linux的boot loader(這也是系統安裝多重引導時,需先裝Windows再裝Linux)
如:Windows、Linux和直接加載內核
1)MBR(grub2)Linux Kernelbooting
2)MBR(grub2)boot sectore(Windows Loader)Windows Kernelbooting
3)MBR(grub2)boot sectore(grub2)Linux Kernelbooting
內核文件存儲在:/boot/vmlinuz-版本號
//不同版本系統的內核版本和版本號不同,所以沒有具體路徑
如:查看/boot目錄下的文件
Linux內核是通過動態加載內核模塊實現多個功能加載
1)Linux發行版都將非必要且可編譯的內核功能編譯成模塊
//如:USB、SATA和SCSI等磁盤設備的驅動程序都是以模塊方式加載內核模塊都存儲在:/lib/modules
//因為動態加載,所以“/”和“/lib”必須放在同一個硬盤分區
如:查看/lib/module目錄下存放的內核模塊
//若含有多個內核,則以內核版本號命名的目錄存儲其內核模塊
//雖然設備的驅動程序在/lib/modules目錄下,但內核並不能掛載該目錄(也讀取不到該目錄下的驅動程序),且內核不能識別具體設備,只能通過加載具體設備的驅動程序將其掛載至根目錄
初始化文件系統
初始化文件系統(Initial Ram Filesystem):內存中模擬文件系統以提供執行程序
1)虛擬文件系統通過boot loader加載至內存中,並被解壓縮(壓縮文件)在內存中模擬成一個根目錄使用;
2)通過虛擬文件系統提供的程序加載啟動程序中需要的內核模塊,模塊通常為文件系統設備的驅動程序;
3)加載完成后,再幫助內核重新調用Systemd完成后續的啟動流程;
//初始化文件系統也可稱為虛擬文件系統
如:BIOS、boot loade和內核加載流程
//boot loader加載Kernel和initramfs(Initial RAM Filesystem),在內存中將initramfs解壓縮成根目錄,由此加載所需的驅動程序,加載完成后釋放initramfs並掛載實際的根目錄文件系統
如:查看系統的虛擬文件系統(initramfs)
//initramfs就是一個小型的根目錄,且由Systemd管理initramfs通過initrd.target啟動
initramfs存在原因:內核模塊都存儲在/lib/modules/$(uname-r)/kernel目錄下,則內核想讀取這些模塊就需先將其在根目錄掛載,而內核本身不具備磁盤的驅動程序,所以不能掛載到根目錄,進而不能讀取到模塊
initramfs具體操作:
1)將/lib/modules目錄下內核啟動過程所需的模塊打包成一個文件(initramfs);
2)在啟動過程中就通過INT 13硬件中斷的功能將文件解壓縮;
3)initramfs在內存中模擬成根目錄,且包含磁盤驅動程序和文件系統的模塊;
4)內核通過initramfs就可識別實際的磁盤,進而將實際的根目錄掛載;
dracut命令:建立/重置initramfs文件
指令格式1:dracut 選項 initramfs文件名
選項 | 含義 |
---|---|
-f | 強制編譯initramfs 若initramfs文件已存在,則覆蓋 |
-v | 顯示dracut運行過程 |
//各個發行版的內核都默認提供initramfs文件
指令格式2:dracut 選項 initramfs文件名
選項 | 含義 |
---|---|
--add-drivers | 添加指定內核模塊到initramfs文件中 指定的內核需在/lib/modules/$(uname -r)/kernel存在 |
--filesystems | 添加指定額外的文件系統到initramfs文件中 |
--gzip --bzip2 --xz | 指定initramfs文件壓縮方式 默認為gzip |
第一個程序
待內核加載完成、硬件檢測和驅動程序加載都完成后,內核會自動調用第一個程序“Systemd”(所以Systemd的PID是1)
1)Systemd功能:通過default.target設計軟件運行的環境
2)Systemd的默認啟動服務集合:/etc/systemd/system/default.target
//如:系統的主機名、網絡設置、文件系統格式和其他服務的啟動等
如:查看/etc/systemd/system/default.target
當內核完成/etc/systemd/systemd/default.target的默認啟動服務集合后,就會鏈接到/usr/lib/systemd/system目錄下加載multi-user.target或graphical.target
//加載graphical.target相當於也加載了multi-user.target(graphical.target在multi-user.target加載完成后通過加載其他服務而完成)
如:繼續加載multi-user.target(graphical.target同理)流程
1)查看multi-user.target配置文件
//multi-user.target需在basic.target加載完畢后再加載很多服務
2)查看multi-user.target加載的其他服務
//其中/usr/lib/systemd/multi-user.target.wants代表系統設置加載的服務,/etc/systemd/system/multi-user.target.wants代表用戶設置加載的服務
Systemd啟動流程:
1)local-fs.target:掛載系統/etc/fstab規范的文件系統;
2)swap.target:配置內存交換分區;
3)sysinit.target:檢測硬件和加載內核所需模塊等;
4)basic.target:加載主要設備的驅動程序和防火牆等;
5)multi-user.target:加載普通系統服務和網絡服務
//若系統為圖形界面,還需執行graphical.target完成界面化服務
sysinit.target:提供系統基本的內核功能、文件系統和設備驅動等(初始化系統)
sysinit.target主要實現功能如下:
sysinit.target主要實現功能 |
---|
特殊文件系統設備的掛載 如:dev-hugepages.mount和dev-mqueue.mount等掛載服務; |
特殊文件系統的啟用 如:磁盤陣列(RAID)、網絡驅動器(iscsi)和文件系統對照服務等; |
系統啟動過程中信息傳遞和畫面展示 如:plymouthd服務和plymouth命令來傳遞動畫和信息; |
日志文件服務的啟動 如:systemd-journald服務的啟用; |
加載額外的內核模塊 如:通過/etc/modules-load.d/模塊名.conf文件實現加載內核額外功能; |
加載額外的內核參數設置 如:讀取/etc/sysctl.conf和/etc/sysctl.d/模塊名.conf |
啟動系統的隨機數生成器 如:幫助系統進行密碼加密演算功能; |
設置終端字體 如:配置終端顯示的字體形式 |
啟動動態設備管理器 如:通過udevd程序,動態對應實際設備讀寫和設備文件名 |
//不論任何運行級別,sysinit.target都是必須工作的
basic.target:完善初始化后系統的其他服務(操作系統)
basic.target主要實現功 |
---|
加載alsa音效驅動程序 如:alsa是音效相關的驅動程序,使系統有音效效果 |
加載firewalld防火牆 CentOS7后用firewalld替代iptables(依然是iptables框架),設置有差異 |
加載root指定的模塊 如:模塊存儲在/etc/sysconfig/modules/模塊名.modules和/etc/rc.modules |
啟動/配置SELinux安全上下文 如:root可強制重新設置SELinux的安全上下文 |
加載CPU微指令功能 |
加載Systemd支持的timer功能 |
將啟動過程所產生的數據寫入到/var/log/dmesg |
/etc/systemd/system/multi-user.target.wants:通過鏈接文件控制服務開機自啟
//系統在啟動時,會自動啟動該目錄下的所有文件,若讓一個服務開機自啟,只需將在該目錄下做個鏈接文件
如:取消cups服務的開機自啟,再設置其為開機自啟
//通過systemctl建立/刪除鏈接文件實現是否開機自啟
/etc/systemd/system目錄:存儲系統啟動需執行的程序/腳本文件
//實現效果同/etc/rc.d/rc.local文件一致,兩者不同處在於:前者屬於Systemd,后者屬於System V
rc-local.service:為兼容System V的rc.local
//該服務是否啟動成功,與/etc/rc.d/rc.local是否具有可執行權限有關;若rc.local具有可執行權限,systemctl重讀配置文件后則可啟動該服務;若rc.local不具有可執行權限,則rc-local.service無法啟動
如:啟動rc-local.service服務
1)查看/etc/rc.d/rc.local權限,並啟動rc-local.service服務;
2)使/etc/rc.d/rc.local具有可執行權限,並啟動rc-local.service服務
/etc/modules-load.d/模塊名.conf:存儲內核需加載的模塊
1)內容格式:一行即代表一個需加載的內核模塊
2)sysinit.target加載模塊時默認調用該目錄下的文件
/etc/modprobe.d/模塊名.conf:存儲內核模塊的配置參數
1)內核模塊的參數配置文件一般與該內核模塊同名
/etc/sysconfig目錄:存儲系統服務的腳本文件
//雖然Systemd已擁有其他的配置文件處理方式,但為了兼容System V,系統啟動時還是會讀取/etc/sysconfig目錄下的文件
如:/etc/sysconfig目錄下常用的腳本文件
1)authconfig:規范用戶的身份認證功能、/etc/passwd、/etc/shadow使用權限和/etc/shadwon的密碼加密算法(Centos7默認使用SHA-512加密算法);
2)cpupower:規范Linux內核操作CPU的原則和啟動cpupower.service;
//cpupower.service可讓系統以CPU最大性能的方式來運行
3)firewalld:與防火牆相關的配置;
//與防火牆相關的還有:iptables-config、ip6tables-config和ebtables-config
4)network-scripts:網卡配置參數相關
內核模塊
內核相關配置文件 |
---|
/boot/vmlinuz-內核版本號:存儲內核文件 |
/boot/initramfs-內核版本號:存儲內核運行時所需的RAM Disk |
/usr/src/kernels:存儲內核源代碼(默認不安裝) |
/proc/version:存儲內核加載至內存后,內核版本相關信息 |
/proc/sys/kernel:存儲內核加載至內存后,內核功能相關文件 |
/lib/modules/內核版本號/kernel:存儲內核模塊 |
如:查看/lib/modules/$(uname-r)/kernel目錄
7)/lib/modules/內核版本號/modules.dep:記錄內核模塊依賴性
//內核模塊的啟動/運行類似服務一樣具有依賴性
depmod命令:分析當前內核模塊依賴性並寫入默認文件中
//默認文件:/lib/modules/內核版本號/modules.dep
指令格式:depmod 選項
//不加選項時,默認分析當前內核模塊依賴性,並重新寫入默認文件中
選項 | 含義 |
---|---|
-a | 檢查所有模塊依賴性,並寫入默認文件中 |
-A | 檢查是否有模塊比默認文件中的模塊新 若存在,則更新默認文件(反之,不更新) |
-e | 顯示當前已加載卻不可執行的模塊 |
-n | 將分析結果輸出到終端(不寫入默認文件) |
lsmod命令:查看當前內核加載模塊數量
指令格式:lsmod
如:查看當前內核加載了多少模塊
內容格式:模塊名稱(Module) 模塊大小(Size) 模塊是否被引用(Used by)
modinfo命令:顯示指定內核模塊的信息
//modinfo不僅可查看內核模塊,還可查看具體模塊文件
指令格式:modinfo 選項 模塊名
選項 | 含義 |
---|---|
-n | 僅顯示指定模塊的絕對路徑 |
-d | 僅顯示指定模塊的說明 |
-p | 僅顯示指定模塊的參數說明 |
-a | 僅顯示指定模塊的開發人員 |
如:查看ip_tables模塊的信息
rmmod命令:從內核中刪除指定模塊
指令格式:rmmod 選項 模塊名
選項 | 含義 |
---|---|
-f | 強制刪除 |
-w | 等待模塊能被刪除時再刪除該模塊 |
insmod命令:添加指定模塊到內核中
//insomd可添加模塊到內核中,但不能解決模塊依賴性問題
指令格式:insmod 選項 內核模塊的絕對路徑
選項 | 含義 |
---|---|
-v | 顯示執行過程 |
-p | 測試模塊是否能添加Kernel中 |
-f | 強制添加 不檢查當前Kernel版本和模塊編譯時的Kernel版本是否一致 |
modprobe命令:根據modules.dep文件添加/刪除內核中的模塊
//modprobe可添加一個/一組相依的模塊,modprobe根據modules.dep文件中的依賴關系,決定添加哪些模塊,且不需指定模塊的絕對路徑,因為modules.dep已記錄該模塊的絕對路徑,若添加過程中發生錯誤,modprobe會刪除整組模塊
指令格式:modprobe 選項 模塊名
選項 | 含義 |
---|---|
-c | 列出當前系統中所有的模塊 |
-f | 強制添加模塊 |
-r | 刪除指定模塊 |
Grub2
Grub2:Centos7使用的一種boot loader
grub2的優點如下:
1)識別和支持較多的文件系統,且grub2可直接在文件系統中查找內核文件;
2)系統啟動時,可自行編譯和修改啟動設置選項(類似bash命令行模式);
3)動態查找配置文件
//只需修改/boot/grub2/grub.cfg的設置參數后,下次重啟自動生效
grub2-install命令:將grub2安裝到指定設備下
指令格式:grub2-install 選項 安裝設備
選項 | 含義 |
---|---|
--force | 強制安裝 |
--recheck | 若安裝設備上已存在,則刪除后再安裝 |
--skip-fs-probe | 忽略該設備上的文件系統影響 |
--boot-directory=目錄路徑 | 安裝到指定設備的目錄上 |
//grub2-install默認將grub2所有的文件都安裝到/boot/grub2目錄下
//grub2-install僅能安裝grub2主程序和相關配置文件到/boot/gurb2目錄下
//若將grub2安裝到磁盤分區下時,需添加許多選項才能安裝,且不能用grub2-install將主程序寫入到啟動扇區(導致無法啟動)
配置Grub2
Linux將grub2分為兩個階段(stage)進行保存和運行:
//由於MBR是硬盤的第一個扇區的一個區塊,容量僅446B,故不能存儲下類似grub2這種復雜功能的grub2(GPT也不能)
1)Stage1:運行grub2主程序,主程序被安裝在啟動區(MBR或boot sector),並不安裝其相關的配置文件;
2)Stage2:主程序加載配置文件,通過grub2加載所有配置文件和相關的環境參數文件(文件系統定義和主要配置文件grub.cfg)
/boot/grub2目錄:存儲grub2相關配置文件
如:查看/boot/grub2
grub2的磁盤命名格式:
// grub2通過對磁盤命名,識別不同磁盤和磁盤分區
1)磁盤名以小括號括起來;
2)磁盤以“hdN”表示,N代表該磁盤的被查找到的順序;
//第一個查找的磁盤為0,第二個為1,以此類推;
//由於BIOS可動態調整磁盤的啟動順序,則磁盤被查找的順序不固定,所以N是可能會變動的
3)每個磁盤的第一個分區為1,以此類推
如:系統中含有三塊磁盤,其在grub2的中命名如下
磁盤被查找到的順序 | 在grub2中的命名 |
---|---|
第一塊(MBR) | (hd0)、(hd0,msdos1)、(hd0,msdos2)…… |
第二塊(GPT) | (hd1)、(hd1,gpt1)、(hd1,gpt2)…… |
第三塊 | (hd2)、(hd2,1)、(hd2,2)…… |
//第一塊磁盤的第一個邏輯分區的啟動扇區命名應為:(hd0,msdos5)
//在命名格式中,msdos和gpt可省略
/boot/grub2/grub.cfg文件:grub2的主要配置文件
//由於該文件內容太過復雜,數據量過多,所以不建議修改該文件,而是通過grub2-mkconfig命令產生新的grub.cfg文件
如:查看/boot/grub2/grub.cfg內容
//grub.cfg內容可分為兩部分,第一部分為:其他腳本文件的執行和基礎運行環境的設計;第二部分(menuentry)為:設計針對具體Linux內核文件運行的環境
//配置文件中有幾個menuentry配置,啟動時就有幾個選項
/boot/grub2/grub.cfg中特殊設置:
1)set root:指定在Linux文件系統中,根目錄在那個磁盤上
2)linux16 /vmlinuz-內核版本號:指定Linux內核文件和內核執行時的參數設置
//由於系統在啟動過程中,內核文件需掛載根目錄並從根目錄中讀取配置文件,所以需搭配“set root”在配置中內核文件后一定要指定根目錄所在的磁盤
3)initrd16 /initramfs-內核版本號:指定虛擬文件系統
//與linux 16同理,需搭配“set root”在配置中指定具體設備,才能讀取到正確的虛擬文件系統
/etc/default/grub文件:提供用戶修改grub2默認環境配置文件
如:查看/etc/default/grub內容
設置項 | 含義 |
---|---|
GRUB_TIMEOUT | 指定默認倒數讀秒的秒數 若取消等待,則設置為0(直接為默認項) 若強制用戶選擇,則設置為-1 |
GRUB_TIMEOUT_STYLE | 指定默認是否顯示啟動選項 menu:顯示(默認項) countdown:取消顯示,但顯示等待秒數 hidden:取消所有顯示(包括秒數) |
GRUB_TERMINAL_OUTPUT | 指定默認信息輸出終端 可設置為:console(默認項)、serial、gfxterm和vag_text |
GRUB_DEFAULT | 指定默認啟動選項 指定哪一個menuentry作為默認啟動項 默認第一個啟動選項為默認啟動項 |
GRUB_CMDLINE_LINUX | 指定內核運行的額外參數 實現類似linux16后的內核參數設置 |
//可通過menuentry的saved、數字、title名和ID名指定默認啟動項
如:當系統含有3個menuentry時,指定默認啟動項
1)查看3menuentry的title名和ID名;
2)指定編號是1的menuentry為默認啟動項;
3)指定ID名是“3rd-win-system”為默認啟動項;
4)指定saved為默認啟動項;
僅修改/etc/default/grub並不能更改grub2的配置,配置/etc/default/grub文件后還需通過grub2-mkconfig命令使/boot/grub2/grub.cfg文件建立/更新
如:使啟動選項時等待10秒;默認選用第一個選項;且選項是顯示的;內核外帶“elevator=deadline”參數
1)配置/etc/default/grub文件;
2)更新grub.cfg文件;
3)檢驗是否配置成功
grub2-mkconfig命令:通過多個腳本文件輔助建立/更新grub.cfg文件
指令格式:grub2-mkconfig -o /boot/grub2/grub.cfg
//grub2-mkconfig本質是分析/etc/grub.d目錄下的文件和/etc/default/grub文件,再通過執行這些文件來建立/更新grub.cfg文件
/etc/grub.d目錄:存儲輔助建立/更新grub.cfg的腳本文件
如:查看/etc/grub.d
文件名 | 作用 |
---|---|
00_header | 初始化grub2配置 (分析需加載的模塊和屏幕終端的格式等) 通過調用/etc/default/grub來建立/更新grub.cfg文件 |
01_users | 管理gurb2在線編輯 |
10_linux | 分析/boot目錄的所有文件,找到正確的Linux內核、讀取該內核需要的文件系統模塊和參數等; 並將以上這些設置到grub.cfg文件中 |
30_os-prober | 分析並找到其他分區含有的操作系統, 並將這些操作系統寫入到grub.cfg中 以作為啟動選項處理 |
40_custom | Shell文件 root通過配置該文件實現其他選項/需求 |
//若有其他需配置的選項,都應該通過配置40_custom文件實現,通過配置/etc/grub.d/40_custom可實現功能如下:
//在配置/etc/grub.d/40_custom后都需通過grub2-mkconfig命令使其生效
1)自定義內核:若直接啟動普通內核,可通過grub2-mkconfig獲取10_linux腳本文件而制作;但要帶自定義的內核,就需使用grub2-mkconfig獲取40_custom腳本文件而制作
制作步驟:
(1)從grub.cfg當中復制指定內核選項(menuentry)到40_custom;
(2)在40_custom中配置帶有自定義的內核
2)轉交控制權:通過chainloader實現boot loader控制權的轉交
chainloader(啟動引導程序的鏈接):將控制權轉交給其他boot loader
//所以grub2就不需要識別每個內核的文件名,只將控制權轉交給下一個boot loader或MBR中的boot loader即可
(也不需要識別下一個boot loader的文件系統)
制作步驟:
(1)加載chainloader模塊;
(2)指定轉交至的文件系統;
(3)指定轉交至的硬盤分區;
(4)設置系統去啟動扇區讀取boot loader軟件
如:設置兩個啟動選項,取得Windows 7啟動選項和回到MBR默認環境的選項
1)查看當前MBR設備分區信息
2)配置/etc/grub.d/40_custom文件
啟動管理
配置grub2完成各個配置文件后,其啟動效果如下:
1)系統啟動時,當進行到該界面時就是已經由grub2管理
//設置默認顯示選項,所以可在5個選項中選擇其中一個內核運行
//在該界面按“e”進入對應選項內核的grub2在線編輯,按“c”進入grub提供的shell模式
2)按“e”進入grub2在線編輯后,顯示該界面;上方;grub.cfg文件的內容,可通過方向鍵查看/編輯;下方;編輯說明/幫助
//取消當前操作並回到前一個畫面:ESC或Ctrl和C,直接啟動:Ctrl和X
如:在啟動過程以圖形過程顯示,且顯示中文
1)編輯/etc/default/grub文件,並grub2-mkconfig
2)再在grub2配置文件的中文,啟動時可顯示如圖
grub2用戶:grub2有同Linux的用戶管理架構,其用戶身份分為兩種
//grub2默認允許任何人修改和選擇的,且沒有設置任何用戶身份
//通過grub2用戶管理可實現內核使用和修改的權限配置
1)superusers(管理員用戶):在grub2下具有修改和選擇所有內核的權限
//設置superusers后,所有的命令修改都會成受限制的
2)users(普通用戶):在grub2下僅能選擇指定選項,不能修改任何內核
通過配置/etc/grub.d/40_custom文件實現grub2用戶的管理
//配置/etc/grub2/grub.cfg也可實現grub2用戶的管理(不建議)
如:當前系統配置三個操作系統,分別安裝在(hd0,1)、(hd0,2)和(hd0,3),其中
(hd0,1)是所有人都可使用的系統;
(hd0,2)是僅系統管理員可使用的系統;
(hd0,3)是僅系統管理員和指定用戶可使用的系統
1)配置/etc/grub.d/40_custom文件,並grub2-mkconfig更新grub.cfg文件;
//password也可替換為password_pbkdf2(密文密碼)
//若內核配置中加入“--unrestricted”參數代表該內核啟動時不需要grub2的用戶驗證,但進入內核在線編輯時,需grub2的用戶驗證
2)啟動時,多出三個選項
grub2-mkpasswd-pbkdf2命令:根據輸入的密碼,生成密文密碼
指令格式:grub2-mkpasswd-pbkdf2
如:將密碼“123456789”加密成密文密碼
grub2在線編輯能夠實現修改root密碼和修改系統等對系統影響巨大的功能,所以需要通過設置grub2進入在線編輯驗證登陸,提高系統安全性
//優先級:grub2管理員用戶驗證 > grub2驗證登錄,若/etc/grub.d/40_custom和/etc/grub.d/01_users同時存在驗證登錄,則以/etc/grub.d/40_custom的管理員用戶驗證登錄為准
通過配置/etc/grub.d/01_users文件實現grub2在線編譯的驗證登錄
//也可配置/etc/grub.d/00_header實現,但該文件較為重要(不建議配置)
//由於/etc/grub.d目錄下的文件都是被其他腳本所執行的文件,所以不能直接寫入用戶名和密碼,而是通過cat和echo等命令將用戶名和密碼寫入到文件中
如:配置grub2在線編輯驗證登錄用戶名為“mwl3”,密碼為“123456789”
1)配置/etc/grub.d/01_users文件;
2)重啟再次進入grub2在線編輯模式時
修改root密碼
通過grub2在線編輯功能實現root密碼的修改,步驟:
1)在grub2選項界面時,按“e”進入在線編輯;
//若grub2設置密碼,輸入密碼進入
2)在內核參數設置中添加“rd.break”內核參數;
3)按下“Ctrl和X”,等待系統進入rd.break系統狀態(緊急救援模式);
4)輸入以下指令:
掛載/sysroot目錄:mount -o remount,rw /sysroot
切換到實際系統的根目錄:chroot /sysroot
修改root密碼:echo “root密碼” | passwd --stdin root
恢復SELinux上下文:touch /.autorelabel
退出系統實際目錄:exit
重啟:reboot
//由於autorelabel使系統重新寫入每個文件的SELinux類型,所以啟動時間較長
chroot命令:切換系統根目錄為指定目錄
指令格式:chroot 掛載目錄
修改root密碼的步驟原理:
1)rd.break內核參數可使系統進入RAM Disk操作系統狀態(擁有root權限);此時,所有的目錄都屬於RAM Disk(原系統根目錄掛載在/sysroot目錄下);
2)需要將/sysroot目錄掛載,並具有可讀寫權限;用chroot命令切換到/sysroot目錄下,並修改root密碼;
//切換到原系統根目錄下,就可處理原系統的文件系統和用戶管理等
3)由於在rd.break系統狀態下,系統不具有SELinux功能,而修改root密碼導致/etc/shadow文件的SELinux安全上下文被取消,就需通過/.autorelabe使系統在啟動時使用默認的SELinux類型重新配置每個文件的SELinux安全上下文
//若不恢復該文件的SELinux安全上下文會導致啟動無法正常啟動
另一種恢復SELinux安全上下文步驟:
1)在rd.break系統狀態下,修改root密碼后,修改SELinux的運行模式為“permissive;
2)重啟,以root身份登錄系統並輸入“restorecon -Rv /etc”恢復/etc目錄下所有文件的SELinux安全上下文
3)再將SELinux的運行模式改為Enforcing
另一種修改root密碼的步驟:
1)在grub2選項界面時,按“e”進入在線編輯;
2)在內核參數設置中添加“init=/bin/bash”內核參數;
//系統提供一個bash,同時不需輸入root密碼也具有root權限
由於是默認bash環境,其PATH僅有/bin(也沒有Syetemd或init),所以在執行各種命令時,需輸入絕對路徑
3)輸入以下指令:
掛載/目錄:mount -o remount,rw /
修改root密碼:echo “root密碼” | passwd --stdin root
恢復SELinux上下文:touch /.autorelabel
重啟:硬件強制重啟(斷電)
//Linux不能隨意關機,容易導致文件系統錯亂或某些服務無法啟動