Linux--引導過程與服務控制(linux操作系統引導過程詳解,MBR扇區故障,GRUB引導故障,root用戶密碼遺忘的修復,服務控制及切換運行級別,優化啓動過程)
前言
- 系統引導是操作系統運行的開始,在用戶能夠正常登錄到系統之前,Linux的引導過程完成了一系列的初始化任務,並加載必要的程序和命令終端,爲用戶登錄做好準備。
- CentOS7版本,系統啓動和服務管理都交給systemd進行管理
一:引導過程
- CentOS7系統中,由systemd掌管系統的初始化工作,系統的啓動過程與之前的版本相比有了新的變化。
1.1:引導過程總覽
1.1.1:開機自檢(BIOS)
- 服務器主機開機以後,將根據主板BIOS(Basic Input/Output System,基本輸入輸出系統)中的設置對CPU。內存。顯卡,鍵盤等設備進行初步檢測,並初始化部分硬件(加電自檢)
- 檢測成功後根據預設的啓動順序移交系統控制權,大多數時候會移交給本機硬盤(加載部分驅動)
- 自檢過程中可以根據主機的POST信息進入配置,通常按某一組合鍵進入,常用F2或者Delete
1.1.2:MBR引導
- 當從本機硬盤中啓動系統時,首先根據硬盤的第一個扇區中MBR(Master Boot Record,主引導記錄)的設置,將系統控制權傳遞給包含操作系統引導文件的分區
- 或者直接根據MBR記錄中的引導信息調用啓動菜單(CentOS7中爲grub2)
- 若安裝雙系統,則兩個系統需要分別安裝在不同的盤符當中
1.1.3:GRUB菜單
- 對於Linux系統來說,GRUB算是使用最廣泛的多系統引導器程序
- 系統控制權傳遞給GRUB以後,將會顯示啓動菜單提供給用戶選擇,並根據所選項(或採用默認值)加載Linux內核文件,然後將系統控制權轉交給內核
1.1.4:加載內核(Kernel)
- 系統引導器程序會從本地硬盤中加載內核以及內存文件系統(CentOS 7 中使用initramfs)
- Linux內核是一個預先編譯好的特殊二進制文件,介於各種硬件資源與系統程序之間,負責資源分配與調度
- 內核接過系統控制權以後,將完全掌控整個Linux操作系統的運行過程
內存文件系統initramfs 是經過gzip 的cpio歸檔,其中包含啓動時所有必要的硬件內核模塊,初始化腳本等。 - 內核放在/boot目錄下,/boot目錄相當於Windows的system32
1.1.5:init進程初始化
- 加載硬件驅動以及初始化進程(加載全部驅動)
- 由Linux內核加載運行/sbin/init程序
- 是系統中第一個進程
- PID(進程標記)號永遠爲1
- 內核初始化在initramfs中找到驅動程序的所有硬件,然後作爲PID1從initramfs執行/sbin/init,CentOS 7中將其複製爲systemd,systemd啓動initrd.target中所有單元,並掛載根文件系統/sysroot,內核與文件系統由內存文件系統切換至系統根文件系統,並重新運行 /sysroot.systemd。
- systemd啓動默認target(圖形或者字符終端),最後等待用戶進行登錄
1.2:systemd 進程
- Linux系統中的進程(運行中的程序)使用數字進行標記,每個進程的身份標記稱爲PID
- 從CentOS 7版本的系統開始systemd稱爲PID恆爲1的初始化進程,是內核第一個加載的程序
- systemd進程是維護整個Linux系統運行的所有進程的“始祖”,因此systemd進程是不允許被輕易終止的
- 需要切換不同的系統運行狀態時,可以向systemd進程發送正確的執行命令,由systemd自身來完成相關操作
- systemd誕生的主要目的是爲了將更多的服務併發啓動,從而提高系統啓動速度。其最大的優點在於具有提供按需啓動服務的能力,只有在某個服務被真正請求時才進行啓動。當服務結束時systemd就將其關閉,等待下次需要時啓動。
1.3:systemd單元類型
-
在systemd中不同類型的systemd對象被統一稱爲單元,是讓系統知道該如何進行操作和管理資源的主要對象,所以systemd有許多單元類型
-
systemd單元文件最初默認存放在/lib/systemd/system目錄中,每當安裝新的軟件都會自動在這個目錄中添加一個配置文件
-
systemctl 命令用於管理各種類型的systemd單元,可以使用“systemctl -t help”命令來查詢systemd支持的單元類型
[root@localhost ~]# systemctl -t help '//查詢systemd支持的單元類型'
Available unit types:
service //後綴標識爲.service最常用,代表系統服務
socket //後綴標識爲.socket代表套接字,表述進程間通信(IPC)
timer //後綴標識爲.timer用於定時器配置觸發用戶所定義的操作,取代了任務計劃
target //後綴標識爲.target用於代替舊版本中運行級別的存在
...此處省略部分內容
- Systemd 單元類型
單元類型 | 擴展名 | 說明 |
---|---|---|
Service | .service | 描述一個系統服務 |
Socket | .socket | 描述一個進程間通信的套接字(通信協議的載體) |
Device | .device | 描述一個內核識別的設備文件 |
Mount | .mount | 描述一個文件系統的掛載點 |
Automount | .automount | 描述一個文件系統的自動掛載點 |
Swap | .swap | 描述一個內存交換設備或目錄 |
Timer | .timer | 描述一個定時器(用於實現類似cron的調度任務) |
Path | .path | 描述一個文件系統中文件或目錄(path 路徑) |
Snapshot | .snapshot | 用於保存一個systemd的狀態(snapshot 快照) |
Scope | .scope | 使用systemd的總線接口以編程的方式創建外部進程 |
Slice | .slice | 描述居於Cgroup的一組通過層次組織的管理系統進程 |
Target | .target | 描述一組systemd的單元(target 目標) |
- Init運行級別所對應的Systemd目標
init運行級別 | Systemd 的 target | 說明 |
---|---|---|
0 | target | 關機狀態,使用該級別時會關閉主機 |
1 | rescue.target | 單用戶模式,不需要密碼驗證即可登錄系統,多用於系統維護 |
2 | multi-user.target | 用戶定義/域特定運行級別,默認等同於3 |
3 | multi-user.target | 字符界面的完整用戶模式,大多數服務器主機運行在此級別 |
4 | multi-user.target | 用戶定義/域特定運行級別,默認等同於3 |
5 | graphical.target | 圖形界面的多用戶模式,提供了圖形桌面操作環境 |
6 | reboot.target | 重新啓動,使用該級別時將會重啓主機 |
二:修復MBR扇區故障
MBR引導記錄位於物理硬盤的第一個扇區(512B),該扇區又稱爲主引導扇區(MBR扇區),除了包含系統引導程序的部分數據以外,還包含了整個硬盤的分區表記錄。
2.1:故障原因
-
病毒、木馬等造成的破壞
-
不正確分區操作,磁盤讀寫誤操作
2.2:故障現象
- 主引導扇區發生故障時,將可能無法進入引導菜單
- 無法找到正確的分區位置而無法加載系統,通過愛硬盤引導主機時很可能進入黑屏狀態
2.3:解決思路
第一步:提前做好備份文件
第二步:以安裝光盤引導進入急救模式
第三步:從備份文件中恢復
2.4:修復MBR扇區實驗
2.4.1:實驗環境
- VMware軟件,開centos 7,併爲其添加一塊硬盤(備份數據用的)
2.4.2:恢復步驟
-
1.備份已損壞MBR扇區數據(實際中我們都是備份整個文件)
加一塊磁盤做備份
-
2.模擬故障
-
3.加載系統鏡像文件中的急救模式
加載系統鏡像文件中的內核界面
-
將備份數據做恢復處理
2.4.3:修復實驗步驟
2.4.3.1:備份MBR扇區數據
-
由於MBR扇區中包含了整個硬盤的分區表記錄,因此該扇區的備份文件必須存放到其他的存儲設備中,否則在恢復時將無法讀取到備份文件。
-
例如,執行以下操作可以將第1塊硬盤(sda) 的MBR扇區備份到第2塊硬盤的sdb1分區中(掛載到/backup目錄)。
2.4.3.2:模擬MBR扇區故障
- 這裏仍然使用dd命令,人爲地將MBR扇區的記錄覆蓋,以便模擬出MBR扇區被破壞的故障情況(切記要先做好備份,而且將備份文件存放到其他硬盤)。
- 例如,執行以下操作可以從設備文件zero中讀取512字節的數據,將其覆蓋到第1塊硬盤(sda),從而破壞MBR扇區中的數據。
完成上述操作後重啓系統,將會出現“Operating system not found"的提示信息,表示無法找到可用的操作系統,因此無法啓動主機。
重啓reboot或者init 6 進入系統測試是否正常。
三:修復GRUB引導故障
GRUB是大多數linux系統默認使用的引導程序,可以通過啓動菜單的方式選擇進入不同的操作系統(如果有的話)
3.1:故障原因
-
當配置文件/boot/grub/grub.conf丟失
-
關鍵配置出現錯誤
-
MBR記錄中的引導程序遭到破壞時
3.2:故障現象
- 系統引導停滯,顯示“grub>”提示符,無法完成進一步的系統啓動過程
3.3:解決思路
第一步:嘗試手工輸入引導命令(成功率很低,不建議)
第二步:進入急救模式,重寫或者從備份中恢復grub.conf
第三步:向MBR扇區中重建grub程序
3.4:修復實驗步驟
- 進入救援模式後切根
chroot /mnt/sysimage/
四:遺忘root用戶的密碼
4.1:故障原因
- 遺忘root用戶的密碼
4.2:故障現象
- 無法進行需要root權限的管理操作
- 若沒有其他可用賬號,將無法登錄系統
4.3:解決思路
- 進入急救模式,重設密碼
4.4:修復實驗步驟
重啓之後直接選擇root 輸入新設置的密碼就OK
五:對於上述三個實驗的一些總結
- 選擇急救模式,進入救援centos系統的方式都是一樣的
- 加載鏡像系統命令
chroot /mnt/sysimage
- 重新構建grub菜單系統命令
grub2-install /dev/sda
grub2-mkconfig -o /boot/grub2/grub.cfg
六:系統服務控制–使用systemd管理系統
- systemd不是一個單獨的命令,而是一個集合體
- systemctl 是管理系統的主要命令,管理單個服務效率更高
- hostnamectl 是用於查看與修改當前主機信息的命令
6.1:系統服務控制
-
systemctl命令可以控制系統服務,此命令涵蓋了之前版本操作系統的service命令和chkconfig 命令兩者的功能
-
使用systemctl命令,可以省略服務單元名稱的標識.service,即:不輸入後綴標識,systemctl命令默認將後綴標識當做.service來處理
常用方式
systemctl 控制類型 服務名稱
常用控制類型
start 啓動
stop 停止
restart 重新啓動 '//重新啓動,會中斷服務,此服務的PID值會改變'
reload 重新加載 '//重新加載配置文件不會中斷服務,此服務的PID值會改變'
status 查看服務狀態
例如:
[root@localhost ~]# systemctl start postfix '//啓動postfix服務'
[root@localhost ~]# systemctl stop postfix '//停止postfix服務'
[root@localhost ~]# systemctl restart postfix '//重新啓動postfix服務'
[root@localhost ~]# systemctl reload postfix '//重新加載postfix服務配置文件'
生產環境中建議使用reload命令來重新加載服務
6.2:Linux系統的運行級別
6.2.1:查看運行級別
runlevel 命令
runlevel 只能查看切換運行級別與當前運行級別
例如
[root@localhost ~]# runlevel
N 5 '//N 是上一次運行的級別,5是這一次運行的級別。因爲是開機後就查看,所以上一次的運行級別顯示爲N(no)'
'若從init 5 切換到 init 3 ,在init3中輸入runlevel命令,則會顯示 5 3'
systemctl 工具
systemctl 能查看默認的運行級別
6.2.2:臨時切換運行級別
init 命令
init的命令參數是運行級別所對應的數字
init的命令參數有 0到6七個運行級別
init 0代表關機
init 3代表切換到字符界面
init 5代表切換到圖形界面
init 6代表重啓
init運行級別 | Systemd 的 target | 說明 |
---|---|---|
0 | target | 關機狀態,使用該級別時會關閉主機 |
1 | rescue.target | 單用戶模式,不需要密碼驗證即可登錄系統,多用於系統維護 |
2 | multi-user.target | 用戶定義/域特定運行級別,默認等同於3 |
3 | multi-user.target | 字符界面的完整用戶模式,大多數服務器主機運行在此級別 |
4 | multi-user.target | 用戶定義/域特定運行級別,默認等同於3 |
5 | graphical.target | 圖形界面的多用戶模式,提供了圖形桌面操作環境 |
6 | reboot.target | 重新啓動,使用該級別時將會重啓主機 |
systemctl 工具
systemctl 的命令參數是具體的target
進入init 3 = systemctl isolate multi-user.target (multi-user:多用戶)
進入init 5 = systemctl isolate graphical.target (graphical:圖形化的)
- 目標:原本開機自動進入圖形化界面,現在想變成字符化界面
[root@localhost ~]# systemctl get-default '查看現在開機默認的進入界面'
graphical.target '發現是圖形化模式'
[root@localhost ~]# find / -name multi-user.target '查詢multi-user.target在哪個目錄下'
/usr/lib/systemd/system/multi-user.target
[root@localhost ~]# find / -name default.target '查詢default.target在哪個目錄下'
/etc/systemd/system/default.target
/usr/lib/systemd/system/default.target
/usr/lib/systemd/user/default.target
[root@localhost ~]# ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target '創建multi-user.target的軟件了並刪除原本的鏈接,將文件存放在/etc/systemd/system/default.target中'
[root@localhost ~]# systemctl get-default '查詢現在開機默認的進入界面'
multi-user.target '已經修改成字符化界面'
[root@localhost ~]#
6.3:優化啓動過程(開機自啓)
6.3.1:系統服務的管理工具
-
ntsysv 工具
提供一個交互式,可視化窗口(僞圖形化界面)
可以在字符終端運行
便於集中管理多個服務
-
systemctl 工具
不提供交互式,可視化窗口
管理單個服務效率更高
6.3.2:ntsysv工具
[root@localhost ~]# ntsysv '//進入ntsysv僞圖形化界面'
*符號代表開機自啓
空格 代表開啓不自啓
Tab鍵 切換到選項(確定,取消)
空格鍵可以輸入 * 或者取消 *
6.3.3:systemctl 工具
[root@localhost ~]# systemctl enable httpd '//將httpd服務設置開機自啓'
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@localhost ~]# systemctl disable httpd '//將httpd服務設置關閉開機自啓'
Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
[root@localhost ~]#
6.4:系統服務的啓動和查看
6.4.1:設置開機啓動
- 在運行着的系統上啓動服務不能確保該服務在重啓後依然啓動
- 同理:在運行着的系統上關閉服務不能確保該服務在重啓後依然關閉
- 一般用systemctl 命令管理開機自啓動服務
命令基本格式
systemctl [enable|disable] name.service
例如
[root@localhost ~]# systemctl enable httpd '//將httpd服務設置開機自啓'
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@localhost ~]# systemctl disable httpd '//將httpd服務設置開啓不啓動,即禁用服務'
Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
- 從返回信息可以看出:
systemctl enable 命令相當於在 /etc/systemd/system目錄中添加一個軟鏈接,指
向/sur/lib/systemd/system 目錄中的.service文件
而systemctl disable 則是從 /etc/systemd/system目錄中移除該軟鏈接
開機時,systemd只執行啓動/etc/systemd/system目錄中的配置文件
6.4.2:查看服務啓動狀態
命令基本格式
systemctl status mame.service '//查看服務啓動狀態'
例如
[root@localhost ~]# systemctl status httpd
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since 三 2019-11-13 23:46:33 CST; 16min ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 2174 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
├─2174 /usr/sbin/httpd -DFOREGROUND
├─2176 /usr/sbin/httpd -DFOREGROUND
├─2177 /usr/sbin/httpd -DFOREGROUND
├─2178 /usr/sbin/httpd -DFOREGROUND
├─2179 /usr/sbin/httpd -DFOREGROUND
└─2180 /usr/sbin/httpd -DFOREGROUND
11月 13 23:46:33 localhost.localdomain systemd[1]: Starting The Apache HTTP Se....
11月 13 23:46:33 localhost.localdomain httpd[2174]: AH00558: httpd: Could not r...
11月 13 23:46:33 localhost.localdomain systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
服務狀態關鍵字
load 配置文件被處理
active(running) 一個或多個進程在持續運行
active(exited) 成功完成一個“一次性”配置
active(waiting) 運行但等待“事件”
inactive 未運行
enabled 開啓自啓
disable 開啓不自啓
static 不能自動啓動,只能隨其他單元啓動而啓動
查看服務狀態除了status選項,systemctl還提供了另外兩種查詢服務狀態的方法
[root@localhost ~]# systemctl is-active httpd '//查看httpd服務是否啓動成功狀態'
active '//啓動成功'
[root@localhost ~]# systemctl is-failed httpd '//查看httpd服務是否啓動失敗狀態'
active '//沒有啓動失敗'
查看服務自啓動狀態
[root@localhost ~]# systemctl is-enabled httpd '//查看httpd服務自啓動狀態'
disabled
netstat -ntap '查看所有tcp協議端口'
'netstat:查看網絡中正在跑的服務器端口,'
'n:以數字形式顯示,'
't:tcp,'
'a:all,'
'p:協議'
[root@localhost ~]# netstat -ntap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1310/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 985/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 986/cupsd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1286/master
以上表示IPV4的地址
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 :::22 :::* LISTEN 985/sshd
tcp6 0 0 ::1:631 :::* LISTEN 986/cupsd
tcp6 0 0 ::1:25 :::* LISTEN 1286/master
以上表示IPV6的地址