1. 程式人生 > >Centos-7.5Linux系統啟動原理及故障排除

Centos-7.5Linux系統啟動原理及故障排除

本節所講內容:

- 17.1  centos6系統啟動過程及相關配置檔案
- 17.2  centos7系統啟動過程及相關配置檔案
- 17.3  實戰-加密grub防止***通過單使用者系統破解root密碼
- 17.4  實戰-通過liveCD進入救援模式-重灌grub修復損壞的系統

17.1 centos6系統啟動過程及相關配置檔案

17.1.1 centos6系統啟動過程

  • 載入 BIOS 的硬體資訊,跟據設定取得第一個可開機引導設定,如:光碟機,硬碟,網路,USB; 如果是硬碟為第一引導。

  • 讀取硬碟中 MBR 的 boot Loader 就是 grub引導 GRUB(GRand Unified
    Bootloader簡稱“GRUB”)是一個來自GNU專案的多作業系統啟動程式。
  • MBR的硬碟的0柱面、0磁頭、1扇區稱為主引導扇區(也叫主引導記錄MBR)。它由三個部分組成,主載入程式、硬碟分割槽表DPT(Disk
    Partition table)和硬碟有效標誌(55AA)。

互動:為什麼MBR分割槽表,只能分4個主分割槽?

  • 注:磁碟預設一個扇區大小為:512位元組。MBR由以下3部分組成: 第一部分是:主載入程式(boot
    loader)佔446個位元組。主載入程式,它負責從活動分割槽中裝載,並執行系統載入程式。

  • 第二部分是Partition
    table區(分割槽表),即DPT,佔64個位元組,硬碟中分割槽有多少以及每一分割槽的大小都記在其中。每個分割槽表項長16個位元組,16*4=64位元組。為分割槽項1、分割槽項2、分割槽項3、分割槽項4。64位元組只存4個分割槽表。

  • 第三部分是MBR有效標識位,佔2個位元組,固定為55AA。如果這個標誌位0xAA55,就認為這個是MBR。

*所以:164+446+2=512**

3. 依據 boot loader 的設定,到引導分割槽載入 Kernel ,Kernel 會開始偵測硬體並載入驅勱程式;  
4. 在硬體驅動成功後,Kernel 會主動執行 init 程式,而 init 會取得 run-level 資訊;
5. init 執行 /etc/rc.d/rc.sysinit 檔案來準備軟體執行的作業環境 (如網路、時區等); 
6. init 執行 run-level 下各個服務並啟動 (script 方式); 
7. init 執行開機後自動執行指令碼 /etc/rc.d/rc.local 檔案; 
8. init 執行虛擬終端機控制程式 mingetty 來啟動 login 程式,最後就等待使用者登入啦;

如圖:
在這裡插入圖片描述

17.1.2 centos6啟動相關的配置檔案

[[email protected] Desktop]# vim /boot/grub/grub.conf
default=0    設定預設啟動選單項,當系統中有多個核心時,0表示預設載入第1個,1表示第2個核心
timeout=5    選單項等待選項時間為5s
splashimage=(hd0,0)/grub/splash.xpm.gz    指明選單背景圖片路徑為
hiddenmenu  隱藏選單
title CentOS (2.6.32-358.6.1.el6.x86_64)  定義選單項
    root (hd0,0)  grub查詢stage2及kernel檔案所在裝置分割槽,grub的根
    kernel /vmlinuz-2.6.32-358.6.1.el6.x86_64 ro root=/dev/vg_have/lv_root rd_NO_LUKS LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 crashkernel=auto rhgb quiet      啟動的核心
    initrd /initramfs-2.6.32-358.6.1.el6.x86_64.img      核心匹配的ramfs檔案

修改系統啟動級別:

[[email protected] Desktop]# vim /etc/inittab
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
id:3:initdefault:    #這裡決定系統啟動的級別

/etc/rc.d/rc.sysinit  shell指令碼 作用:系統初始化: 像:主機名 和/etc/fstab 都在這裡指定了,完成了包括mount分割槽 啟用swap 載入modules等重要的工作.

啟動對應級別下的服務如: init 3 級別
/etc/rc.d/rc3.d/(這裡的程式/服務S開頭的全部開機執行;K開頭的表示開機不執行,表明了關機時順序)
rcn.d (n為1到6) 是對應於不同的runlevel下起不同的服務. 這些目錄下都是一些符號連線, 連線到/etc/rc.d/init.d下的一些檔案.以S開頭的表示要啟動, 以K開頭的不啟動. 
第一個字母后面的數值是一個優先順序.
[[email protected] ~]# ll /etc/rc.d/rc3.d/ | grep network
lrwxrwxrwx. 1 root root 17 Dec 18  2012 S10network -> ../init.d/network   #表示network是第10個啟動的服務。 所以init是順序啟動系統,需要一個一個服務啟動成功,再執行下一步操作,啟動系統比較慢。而centos7中的systemd可以並行啟動多個服務,啟動比較快。
例:
[[email protected] rc3.d]# vim /etc/init.d/network
#! /bin/bash
#
# network       Bring up/down networking
#
# chkconfig: 2345 10 90
看有chkconfig的那一行, 2345表示在runlevel 2 3 4 5下被啟動, 10是為此服務的啟動順序, 90為關機時,關閉此服務的順序。

[[email protected] ~]# chkconfig --list  | grep network
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
[[email protected] ~]# ll /etc/rc.d/rc3.d/ | grep network
lrwxrwxrwx. 1 root root 17 Dec 18  2012 S10network -> ../init.d/network  #開機順序
[[email protected] ~]# chkconfig network off
[[email protected] ~]# ll /etc/rc.d/rc3.d/ | grep network
lrwxrwxrwx  1 root root 17 May 23 21:17 K90network -> ../init.d/network #只顯示k90關機順序了
[[email protected] rc3.d]# chkconfig --list network
network         0:off   1:off   2:off   3:off   4:off   5:off   6:off

所有服務都執行成功後,設定開機自動執行某個命令: /etc/rc.local
[[email protected] rc3.d]# vim /etc/rc.local 
[[email protected] rc3.d]# ll !$
ll /etc/rc.local
lrwxrwxrwx. 1 root root 13 Dec 18  2012 /etc/rc.local -> rc.d/rc.local
[[email protected] rc3.d]# ll /etc/rc.d/rc.local 
-rwxr-xr-x. 1 root root 240 Feb  5 21:17 /etc/rc.d/rc.local

執行mingetty命令,開啟tty1-6
[[email protected] rc3.d]# ps -axu | grep ming
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root      2346  0.0  0.0   4116   548 tty2     Ss+  20:55   0:00 /sbin/mingetty /dev/tty2
root      2348  0.0  0.0   4116   548 tty3     Ss+  20:55   0:00 /sbin/mingetty /dev/tty3
root      2350  0.0  0.0   4116   544 tty4     Ss+  20:55   0:00 /sbin/mingetty /dev/tty4
root      2352  0.0  0.0   4116   544 tty5     Ss+  20:55   0:00 /sbin/mingetty /dev/tty5
root      2354  0.0  0.0   4116   544 tty6     Ss+  20:55   0:00 /sbin/mingetty /dev/tty6
[[email protected] ~]# runlevel   #檢視系統啟動級別
N 5
[[email protected] ~]# init 3
[[email protected] ~]# runlevel  
5 3   #由5啟動級別進入3級別
[[email protected] ~]# init 5
[[email protected] ~]# runlevel  
3 5    #由3啟動級別進入5級別

17.2 centos7系統啟動過程及相關配置檔案

17.2.1 centos7系統啟動過程

CentOS7引導順序

  1. UEFi或BIOS初始化,執行POST開機自檢
  2. 選擇啟動裝置
  3. 引導裝載程式, centos7是grub2
  4. 載入裝載程式的配置檔案:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
  5. 載入核心選項
  6. 載入initramfs初始化偽檔案系統
  7. 核心初始化,centos7使用systemd代替init
  8. 執行initrd.target所有單元,包括掛載/etc/fstab
  9. 從initramfs根檔案系統切換到磁碟根目錄
  10. systemd執行預設target配置,配置檔案/etc/systemd/system/default.target
  11. systemd執行sysinit.target初始化系統及basic.target準備作業系統
  12. systemd啟動multi-user.target下的本機與伺服器服務
  13. systemd執行multi-user.target下的/etc/rc.d/rc.local
  14. Systemd執行multi-user.target下的getty.target及登入服務
  15. systemd執行graphical需要的服務
    centos7啟動過程:

    [[email protected] logs]# find /boot/ -name img
    /boot/grub2/i386-pc/core.img
    /boot/grub2/i386-pc/boot.img

17.2.2 Systemd執行原理-瞭解一下

Systemd概述:systemd即為system daemon [ˈdi:mən] 守護程序,是linux下的一種init軟體,開發目標是提供更優秀的框架以表示系統服務間的依賴關係,並依此實現系統初始化時服務的並行啟動,同時達到降低Shell的系統開銷的效果,最終代替現在常用的System V與BSD風格init程式。

  • 與多數發行版使用的System V風格init相比,systemd採用了以下新技術: (1)
    採用Socket啟用式與匯流排啟用式服務,以提高相互依賴的各服務的並行執行效能; (2)
    用Cgroups代替PID來追蹤程序,以此即使是兩次fork之後生成的守護程序也不會脫離systemd的控制。

    unit物件:unit表示不同型別的systemd物件,通過配置檔案進行標識和配置;檔案中主要包含了系統服務、監聽socket、儲存的系統快照以及其它與init相關的資訊
    Systemd配置檔案:
    • /usr/lib/systemd/system/ #這個目錄儲存每個服務的啟動指令碼,類似於之前的/etc/init.d/
    • /run/systemd/system/ #系統執行過程中所產生的服務指令碼,比上面目錄優先執行
    • /etc/systemd/system/ #管理員建立的執行指令碼,類似於/etc/rc.d/rcN.d/Sxx類的功能,比上面目錄優先執行

注意: 對於新建立的unit檔案,或者修改了的unit檔案,要通知systemd過載此配置檔案,而後可以選擇重啟

[[email protected] ~]# systemctl daemon-reload

總結:centos5-6-7 3個系統版本啟動過程:
CentOS 5: SysV init ; CentOS 6: Upstart ;CentOS 7: Systemd

在這裡插入圖片描述

17.2.3 管理系統服務

命令: systemctl COMMAND  name.service
-   centOS6 CentOS7
啟動  service name start  systemctl start name.service
停止  service name stop   systemctl stop name.service
重啟  service name restart    systemctl restart name.service
狀態  service name status systemctl status name.service
過載或重啟服務(先載入,再啟動)    -   systemctl reload-or-restart name.service

chkconfig命令的對應關係

-   centOS6 CentOS7
設定某服務開機自啟   chkconfig name on   systemctl enable name.service
設定某服務開機禁止啟動 chkconfig name off  systemctl disable name.service
檢視所有服務的開機自啟狀態   chkconfig --list    systemctl list-unit-files --type service
用來列出該服務在哪些執行級別下啟用和禁用    chkconfig sshd –list    ls /etc/systemd/system/*.wants/sshd.service
檢視服務是否開機自啟  -   systemctl is-enabled name.service

服務狀態

[[email protected] ~]# systemctl list-unit-files      #顯示狀態
•   loaded:Unit配置檔案已處理
•   active(running):一次或多次持續處理的執行
•   active(exited):成功完成一次性的配置
•   active(waiting):執行中,等待一個事件
•   inactive:不執行
•   enabled:開機啟動
•   disabled:開機不啟動
•   static:開機不啟動,但可被另一個啟用的服務啟用

17.2.4 執行級別

centos6下Linux執行級別0-6的各自含義
0: 關機模式
1:單使用者模式 ,用於破解root密碼
2:無網路,支援的多使用者模式
3:有網路支援的多使用者模式(一般叫字元介面,工作中最長使用的模式)
4:保留,未使用
5:有網路支援,支援圖形介面,支援的多使用者模式(圖形介面)
6:重新引導系統,及重啟

  • 可以在不同級別下,設定服務是否隨系統啟動執行。在centOS7上執行級別的含義已經和之前不同了,已由.target來代替執行級別,我們可以稱target為目標態,我們可以通過target定製更符合我們工作執行環境。

    [[email protected] ~]# ls /usr/lib/systemd/system/*.target #檢視我們的機器上有多少個target

    [[email protected] ~]# ll /usr/lib/systemd/system/*.target | grep runlevel
    lrwxrwxrwx. 1 root root 15 9月 19 2017 /usr/lib/systemd/system/runlevel0.target -> poweroff.target
    lrwxrwxrwx. 1 root root 13 9月 19 2017 /usr/lib/systemd/system/runlevel1.target -> rescue.target
    lrwxrwxrwx. 1 root root 17 9月 19 2017 /usr/lib/systemd/system/runlevel2.target -> multi-user.target
    lrwxrwxrwx. 1 root root 17 9月 19 2017 /usr/lib/systemd/system/runlevel3.target -> multi-user.target
    lrwxrwxrwx. 1 root root 17 9月 19 2017 /usr/lib/systemd/system/runlevel4.target -> multi-user.target
    lrwxrwxrwx. 1 root root 16 9月 19 2017 /usr/lib/systemd/system/runlevel5.target -> graphical.target
    lrwxrwxrwx. 1 root root 13 9月 19 2017 /usr/lib/systemd/system/runlevel6.target -> reboot.target
    注: 發現在runlevel2-4 都是呼叫multi-user.target這個unit。所以在centos7上runlevel2-4是一個意思

    [[email protected] ~]# systemctl list-unit-files --type target #檢視所有target的狀態
    [[email protected] ~]# systemctl list-dependencies runlevel3.target #檢視3級別Unit 的所有依賴。Unit 之間存在依賴關係:A 依賴於 B,就意味著 Systemd 在啟動 A 的時候,同時會去啟動 B。也可以理解也3執行級別下都開啟哪些服務
    在centOS7上所謂的目標態,其實就是由各種指定的服務和基礎target組合而成的。
    總結:centos6和7執行級別的變化
    6 7
    init systemd
    Traditional runlevel | New target name Symbolically linked to...
    Runlevel 0 | runlevel0.target -> poweroff.target
    Runlevel 1 | runlevel1.target -> rescue.target
    Runlevel 2 | runlevel2.target -> multi-user.target
    Runlevel 3 | runlevel3.target -> multi-user.target
    Runlevel 4 | runlevel4.target -> multi-user.target
    Runlevel 5 | runlevel5.target -> graphical.target
    Runlevel 6 | runlevel6.target -> reboot.target
    Init 0  systemctl poweroff 關機
    Init 1  systemctl isolate rescue.target 單使用者
    Init 3  systemctl isolate multi-user.target 字元介面
    Init 5  systemctl isolate graphical.target 圖形化
    Init 6  systemctl reboot 重啟

17.2.5 執行級別的切換

1、在centOS6上,我們切換級別使用init,在centOS7上雖然也能使用,但是呼叫的不再是原來的程式了。centos7使用systemctl isolate name.target來切換target。 # isolate [ˈaɪsəleɪt] 分離,隔離

例1:在centos6/7下切換到字元介面:

[[email protected] ~]# init 3   #切換到字元介面
[[email protected] ~]# init 5   #切換到圖形介面

例2:centos7切換到字元介面

[[email protected] ~]# systemctl isolate multi-user.target
或:
[[email protected] ~]#  systemctl isolate runlevel3.target

2、centos7設定預設系統預設啟動級別

systemctl set-default name.target來修改我們的目標態。
我們看一下我們的預設目標態究竟為何物。
[[email protected] ~]# ll /etc/systemd/system/default.target

注:它其實就是建立了一個軟連結到指定的target上去了 

例1:預設系統啟動使用3級別字元介面

[[email protected] ~]# systemctl set-default multi-user.target
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.
[[email protected] ~]#  ll /etc/systemd/system/default.target  #檢視連結
lrwxrwxrwx 1 root root 41 5月  23 19:08 /etc/systemd/system/default.target -> /usr/lib/systemd/system/multi-user.target

例2:預設系統啟動使用5級別圖形介面

[[email protected] ~]# systemctl set-default  graphical.target

17.2.6 grub2和grub區別-瞭解

在centOS6上,我們的grub檔案是/boot/grub/grub.conf 
在centOS7使用grub2,配置檔案改成/boot/grub2/grub.cfg了,但是功能還是大致一樣的都是用於載入核心的,不過在centOS7上設定預設啟動項發生了一些變化。
互動:如果我們的系統中有兩個核心?改變預設啟動的核心順序?
例1: centos7修改核心啟動順序
[[email protected] ~]# vim /etc/default/grub
GRUB_TIMEOUT=5   #開機時 grub 預設5秒後啟動核心
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
改:GRUB_DEFAULT= saved   
為:GRUB_DEFAULT= 1   #這裡我們改成1,0代表第一個核心,1代表第二個,以此類推。
UB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet net.ifnames=0"
GRUB_DISABLE_RECOVERY="true"

[[email protected] ~]# grub2-mkconfig -o /boot/grub2/grub.cfg  #修改完成後,並沒有立即生效,使用此命令來生成grub.cfg檔案,我們在下次啟動的時候就會預設選擇新的預設核心。
[[email protected] ~]# uname -r   #查當前系統核心
3.10.0-693.2.2.el7.x86_64
[[email protected] ~]# reboot
[[email protected] ~]# uname  -r    #重啟成功後, 發現載入的核心變了
3.10.0-693.el7.x86_64

例2: centos6修改核心啟動順序-瞭解

[[email protected] ~]# vim /boot/grub/grub.conf
改:10 default=0
為:10 default=1
[[email protected] ~]# reboot

Linux架構師高薪入口:
1.學神IT教育官方網站: http://xuegod.ke.qq.com
2.10年行業資深老鳥MK:QQ2659153446
3.加入Linux技術交流QQ群:722287089,即可獲得以下福利:
①定期分享免費學習資料與視訊(工具+筆記+拓展實戰)
②10年行業資深老鳥線上答疑:技能+實戰+專案分享+高薪就業
③有機會免費領取Linux雲端計算叢集架構師4冊書籍

17.3 實戰-加密grub防止***通過單使用者系統破解root密碼

實戰場景:如何防止別人惡意通過單使用者系統破解root密碼,進入系統竊取資料?
給grub加密,不讓別人通過grub進入單使用者。

17.3.1 基於centos6進行grub加密

[[email protected] ~]# grub-md5-crypt 
Password: 123456
Retype password: 123456
$1$oaqo5$3d/cmTosm68jTw6o1wCu31
[[email protected] init]# vim /boot/grub/grub.conf
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
password --md5 $1$oaqo5$3d/cmTosm68jTw6o1wCu31
title Red Hat Enterprise Linux (2.6.32-220.el6.x86_64)
        root (hd0,0)

如圖:

在這裡插入圖片描述
重啟測試:
編輯grub時,需要按下p鍵,然後輸入密碼:123456

17.3.2 基於centos7進行grub加密

生成密碼
[[email protected] ~]# grub2-mkpasswd-pbkdf2 
輸入口令: 123456
Reenter password:  123456
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.8F355BAB512AFB7B8C990A1FEB887B8F2F3F1C54467E9B9F0535F2268E1FFC5F4E8D33F7633D7FBEC25B2039C6D8B3226A90528D4883AB9B99E391A4965D069F.DDE992693BE2C09FFEEC1149120B6B84DBAB933DE6CF7BFF718E1DDC858AB73EE32CFF45EB7F06AC45AA6792E91C4CD09E2B445FC288C47E79F537DBBABAD756

[[email protected] ~]# vim /etc/grub.d/00_header    #在最後後面新增如下內容,注mk這個使用者名稱可以換成自己的使用者名稱
cat <<EOF
set superusers='mk'
password_pbkdf2  mk grub.pbkdf2.sha512.10000.8F355BAB512AFB7B8C990A1FEB887B8F2F3F1C54467E9B9F0535F2268E1FFC5F4E8D33F7633D7FBEC25B2039C6D8B3226A90528D4883AB9B99E391A4965D069F.DDE992693BE2C09FFEEC1149120B6B84DBAB933DE6CF7BFF718E1DDC858AB73EE32CFF45EB7F06AC45AA6792E91C4CD09E2B445FC288C47E79F537DBBABAD756
EOF

如下圖:
在這裡插入圖片描述

 [[email protected] ~]# grub2-mkconfig -o /boot/grub2/grub.cfg  #更新grub資訊
    重啟驗證:

    輸入使用者名稱和密碼

    看到可以進入GRUB選單,就證明你加密成功了

    按ctrl-x 開始啟動

17.4 實戰-通過liveCD進入救援模式-重灌grub修復損壞的系統

 實戰:使用系統光碟進入救援模式拯救壞掉的系統
    實戰場景:當系統壞了,進不去了,還需要把裡面的資料複製出來,怎麼辦?
    可以進入救援模式拷貝資料

17.4.1 基於6版本系統進入救援模式

修改BIOS啟動順序,直接以光碟引導系統

ramfs  : 記憶體檔案系統
chroot  /mnt/sysimage   # 切換檔案系統根

17.4.2 實戰-當MBR引導記錄損壞後-重灌grub進行修復

使用場景: 修復MBR,主要出現在安裝雙系統時,後安裝的系統把原來系統的MBR刪除了,需要修復。
第一步:在centOS7下破壞硬碟的前446位元組: 
[[email protected] ~]#dd if=/dev/zero of=/dev/sda bs=1 count=446
446+0 records in
446+0 records out
446 bytes (446 B) copied,0.000758682 s,588 kB/s
第二步:將centos7系統光碟掛載到虛擬機器光碟機上,,重啟計算機,修改BIOS引導順序,讓光碟啟動。

進入啟動的介面 

上面有三項,我們選擇第三項進入troubleshooting故障排除介面 ,進入第三項後,點選第二項,進入救援模式的centos的系統 

然後我們進入如下模式,選擇1,繼續進行,接下來,我們就會進入到一個shell模式中,需要切換根目錄,進行系統修復: 

先退一下,再重啟,修復完成

Linux架構師高薪入口:
1.學神IT教育官方網站: http://xuegod.ke.qq.com
2.10年行業資深老鳥MK:QQ2659153446
3.加入Linux技術交流QQ群:722287089,即可獲得以下福利:
①定期分享免費學習資料與視訊(工具+筆記+拓展實戰)
②10年行業資深老鳥線上答疑:技能+實戰+專案分享+高薪就業
③有機會免費領取Linux雲端計算叢集架構師4冊書籍
微信公眾號:
在這裡插入圖片描述
MK老師微訊號:
在這裡插入圖片描述

總結:

  • 17.1 centos6系統啟動過程及相關配置檔案
  • 17.2 centos7系統啟動過程及相關配置檔案
  • 17.3 實戰-加密grub防止***通過單使用者系統破解root密碼
  • 17.4 實戰-通過liveCD進入救援模式-重灌grub修復損壞的系統