linux啓動和grub修復

CentOS 5和6的啓動流程

linux組成

  • linux:是有kernel和+rootfs (linux內核加應用程序)
    • kernel :進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能
    • rootfs: 程序和glibc(庫)
    • 庫:函數計劃,function,調用接口(頭文件負責描述)
      • 過程調用: procedure,無返回值
      • 函數調用: function(一堆命令的集合)
    • 程序:二進制執行文件
  • 內核設計流派
    • 單內核(monolithic kernel);linux
      • 把系統最重要的東西放在一個單一的文件中
      • 把所有功能集成於同一個程序
      • 當某個功能出現問題則導致其它功能可能也無法使用
    • 微內核(micro kernel):Windows ,solaris
      • 每種功能使用一個單獨子系統實現
      • 當某一個功能出現問題則對其它功能不好產生太壞的影響

linux內核特點

  • 支持模塊化:.ko (內核對象),每一個ko文件對應的都是一個功能模塊。如文件系統,硬件驅動,網絡協議等。
  • 支持內核模塊的動態裝載和卸載,就是會自動根據設備的類型裝載驅動,如當我們插入u盤時內核會自動加載u盤驅動模塊,當我們拔掉u盤則自動的卸載u盤驅動模塊
    • 當然管理員手動裝載和卸載也是可以的
      • modprobe - r 卸載模塊
  • 模塊文件存放路徑
    • /lib/modules/[內核版本]/

組成部分

linux最核心的文件

  • 核心文件:/boot/vmlinuz- VERSION -release(linux kernel)
[root@centos6 boot]# ls vmlinuz-2.6.32-696.el6.x86_64 
vmlinuz-2.6.32-696.el6.x86_64
  • ramdisk : 輔助的僞根系統,和linux 內核有關聯,裏面存放着必要的驅動模塊,如果這裏文件破壞,也會造成系統無法啓動
    • CentOS 5: /boot/initrd- VERSION -release.img
    • CentOS 6,7: /boot/initramfs- VERSION -release.img
  • 模塊文件 :/bin/modules/VERSION-release

驅動模塊存放在哪裏

  1. 最核心最重要的在linux內核文件中存放vmlinuz- VERSION-release
  2. 有一小部分重要的在initramfs- VERSION -release.img中存放的是和啓動相關的驅動模塊
  3. 還有一些在/bin/modules/VERSION-release,絕大部分的驅動模塊在這裏

CentOS6,5啓動流程

啓動流程圖
1. 首先POST加電自檢,主要是檢查計算機硬件是否存在,或者損壞
2. MBR引導,第1塊磁盤的第0個扇區中前446個字節中,存放着於計算機啓動的相關程序,在centos6中叫GRUB,GRUB的一部分就是存放在446個字節中,還有一部分在別的地方
3. GRUB在加載啓動完後
4. 加載內核,就是boot下的vmlinuz-版本號

[root@centos6 boot]# ls vmlinuz-2.6.32-696.el6.x86_64 
vmlinuz-2.6.32-696.el6.x86_64
  1. 內核加載完後就啓動系統的第一個進程,init進程,centos7是systemctl
  2. init進程啓動後會讀取它的核心配置文件就是/etc/inittab文件,/etc/init/*.conf文件
    7.使用/etc/rc.d/rc/sysinit初始化腳本
  3. 執行/etc/rc.d/rc 腳本
    • 會加載/etc/rc#,#爲默認級別要啓動的服務
  4. 執行/etc/rc.d/rc.local腳本(管理員想要某個服務在那個級別開機啓動時放進就會開機啓動,最後一個加載)

10. 執行/bin/login程序,進入登錄狀態

  1. 加載BIOS的硬件信息,獲取第一個啓動設備
  2. 讀取第一個啓動設備MBR的引導加載程序(grub)的啓動信息
  3. 加載核心操作系統的核心信息,核心開始加壓縮,並嘗試驅動所有的硬件設備
  4. 核心執行init程序,並獲取默認的運行信息
  5. init程序執行/etc/rc.d/rc.sysyinit文件
  6. 啓動核心的外掛模塊
  7. init執行運行的各個批處理文件(腳本文件)
  8. init執行/etc/rc.d/rc.local
  9. init執行/etc/login程序,等待用戶信息
  10. 登錄之後開始以shell控制主機

啓動流程詳細過程描述

post

  • power-on-self-test,加電自檢,是BIOS功能的一個主要部分。負責完成對cpu、主板、內存、硬盤子系統顯示子系統、串並行接口、鍵盤、CD-ROM光驅等硬件情況檢查
  • ROM:BIOS,Basic Input and Output System,保存着有關計算機系統最重要的基本輸入出程序,系統信息設置、開機加電自檢程序和系統啓動自舉程序等
  • RAM:CMOS互補金屬氧化物半導體,保存各項參數的設定
  • 按次序查找引導設備,第一個有引導程序的設備爲本次啓動設備

bootloader:引導加載器,引導程序

  • Windows:ntloader ,僅啓動OS,不可以啓動linux
  • linux:功能豐富,提供菜單,允許用戶選擇要啓動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓、展開,並把系統控制權移交給內核,可以啓動Windows
    • LILO:linux loader 很早以前centos5開始不使用
    • GRUB : grand unified bootloader
    • grub 0.x :grub legacy,grub2
      • centos 5 和6 都是0.97版本
      • centos 7 是2.02版

MBR

  • 446字節:bootloader,64字節:分區,2字節:55aa結束位
    • 當系統啓動時會加載bootloader

GRUB

  • GRUB 分爲3個階段
    • 1階段是MBR的446個字節中
      • 當我們執行完1階段後,不屬於文件,就是以二進制存放
    • 1.5階段是集成了必要的驅動模塊,當我們執行完一階段後,會執行1.5階段,因爲1.5階段所對應的文件是/boot/initramfs文件,這是一個壓縮文件,是一個僞根系統,因爲系統要訪問文件必須要有文件系統纔可以,在我們第一階段只有446個字節不可能存放着文件系統,如果這樣就無法進入到根下,也無法啓動系統,但是intramfs這個文件是僞根系統,而訪問系統是不需要文件系統的,這樣就可以執行

kernel 加載內核

  • 自身初始化
    • 探測可識別到的所有硬件設備
    • 加載硬件驅動程序(藉助ramdisk加載驅動)
    • 以只讀方式掛載根文件系統
    • 運行用戶空間的一個應用程序:/sbin/init

ramdisk :

  • 內核中的特性之一:使用緩衝和緩衝來加速對磁盤上的文件訪問,並加載相應的硬件驅動
    • ramdisk —> ramfs 提高速度
    • centos 5 :initrd
      • 工具程序:mkinitrd
    • centos 6,7 :initramfs
      • 工具程序:mkinitrd ,dracut(用於修復的命令)

系統初始化

  • POST—> bootsequence(BIOS)—> Bootloader(MBR)—> Kelner(加載內核)—> rootfs(只讀) –> init(systemd)

如果把initramfs 文件刪除如何修復,沒有重啓機器情況下

[root@centos6 boot]# rm initramfs-2.6.32-696.el6.x86_64.img 
rm: remove regular file `initramfs-2.6.32-696.el6.x86_64.img'? yes
[root@centos6 boot]# ls initramfs-2.6.32-696.el6.x86_64.img   
ls: cannot access initramfs-2.6.32-696.el6.x86_64.img: No such file or directory
[root@centos6 boot]# mkinitrd initramfd-`uname -r`.img `uname -r` (後面跟的是內核版本號)
[root@centos6 boot]# ls initramfd-2.6.32-696.el6.x86_64.img 
initramfd-2.6.32-696.el6.x86_64.img

把initramfd 刪除後重啓修復

  • 當我們把initramfs 這個文件刪除也就是1.5階段的grub然後重啓
  • 重啓後會會出現這樣的畫面
    黑屏
  • 機器起不來,重啓用光盤進入救援模式
    光盤進入救援模式
  • 都選擇默認的選項回車,由於這個不需要配置網絡所有就 不配網絡了
    mark
  • 進入命令行後首先要確認那個是boot目錄,由於根和boot目錄是在一個分區上所以先找到根分區用df命令
    mark
  • 我們可以看到/mnt/sysimage這個分區是根分區,用chroot命令切換到根分區中
    mark
  • 在用mkinitrd /boot/initramfs-uname -r.img uname -r執行這條命令修復grub文件
    mark
  • 修復完後不要急着重啓,需要等待幾分鐘讓數據寫入磁盤中,然後重啓
    mark
  • 在重啓會比以前重啓慢一些是正常的
    mark
    mark
  • 這樣系統就正常啓動了

啓動系統的第一個進程

  • post–mbr—grub—kernel—init
  • init程序的類型
    • sysV:init,Centos 5之前的版本
      • 配置文件:/etc/inittab
    • upstart:init,Centos 6
      • 配置文件:/etc/inittab,/etc/init/*.conf
    • sysytemd:sysytemd,centos 7
      • 配置文件:/usr/lib/systemd/system
      • /etc/sysytemd/sysytem

/sbin/init Centos6之前

  • 運行級別:爲系統運行或維護等目的而設定;0-6;7個級別
    • 0 : 關機
    • 1 :單用戶模式(root自動登錄),single,維護模式
    • 2 :多用戶模式,啓動網絡功能,但不會啓動NFs;維護模式
    • 3 :多用戶模式,正常模式,文本界面
    • 4 :預留級別;可同3級別
    • 5 : 多用戶模式,正常模式;圖形界面
    • 6 :重啓
  • 默認級別是:3,5
  • 切換級別 : init #
  • 查看級別 : runlevel ;who -r

init 初始化

init讀取其初始化文件;/etc/inittab
1. 初始運行級別(RUN)
2. 系統初始化腳本
3. 對應運行級別的腳本目錄
4. 捕獲某個關鍵字順序
5. 定義UPS電源終端/恢復腳本
6. 在虛擬控制檯生產getty
7. 在運行級別5初始化X

CentOS 5的/etc/inittab文件

  • 配置文件: /etc/inittab
  • 每一行定義一種action以及與之對應的process
    • id : runlevel:action:process (啓動時默認運行級別)
    • action
      • wait:切換至此級別運行一次
      • respawn:此process終止,就重新啓動之
      • initdefault :設定默認運行級別;process省略
      • sysinit:設定系統初始化方式,此處一般爲指定 /etc/rc.d/rc.sysinit
      • ca::ctrlaltdel:/sbin/shtdown -t3
    • id:3:initdefault:
    • si::sysinit:/etc/rc.d/rc.sysinit
    • lO:O:wait:/etc/rc.d/rc 0
    • l1:1:wait:/etc/rc.d/rc 1 (這裏表示1級別所要開機啓動的服務進程和關閉的服務進程)
      .
      .
    • l6:6:wait:/etc/rc.d/rc 6
      mark
  • 這裏的每個級別對應着每個rc文件,裏面存放着開機啓動時要運行和要停止的服務,它們都是軟連接/etc/init.d目錄中,以K開頭的都是stop要停止的,而已S開頭的都是要系統啓動時要運行。這告訴我們如果你想要某個服務在某個模式下啓動就在那個模式的/etc/rc.d/rc#.d 目錄中把這個服務以S命名。而這些字母后面的數字是服務啓動時安裝一定順序啓動,不是按數字排序,是安裝字符大小。而這些定義都是在/etc/rc.d/rc腳本文件定義的
    mark

ntsysv 查看當前模式下開機所啓動的服務

  • 如果要看其它模式開機啓動服務有哪些 ntsysv –level=#
  • 如果要看某個服務在哪些模式下啓動 chkconfig –list 服務名
[root@centos6 ~]# chkconfig --list atd
atd             0:off   1:off   2:on    3:on    4:on    5:on    6:off
  • 也可以定義某個服務在那幾個模式下開啓或者關閉
    • chkconfig –level 35 atd off # 表示在模式3和5下服務atd關閉
[root@centos6 ~]# chkconfig --level 35 atd off
[root@centos6 ~]# chkconfig --list atd        
atd             0:off   1:off   2:on    3:off   4:on    5:off   6:off
  • 當這些服務變成off後/etc/rc.d/rc3.d 對應的文件也會改變變成以K開頭的
  • 如果我們不加那個模式則是2345模式 chkconfig atd on 表示2.3.4.5模式都是on

編寫一個開機啓動的服務

  • 這個和寫腳本一樣,但是還是有些區別,要注意的一下幾點



#!/bin/bash #chkconfig: 35 99 00 這表示在3.5模式下開機啓動,99表示在/etc/rc.d/rc3.d和rc5.d中的文件已s開頭的編號,值越大越最後啓動,00 表示以K開頭的文件在關機中越小越最早關閉 #description:描述 這三行必須要寫不然會出錯,這是服務腳本格式 用 chkconfig --add 服務名,將某個服務添加系統
  • 計算機啓動時要加載很多進程和服務,版本5是按順序執行的,當一個進程結束後才能運行,這樣影響效率,在6的時候有依賴關係的是順序執行的,沒有依賴關係的則並行啓動centos7 是所有的都是並行啓動
  • etc/inittab 文件內容
    • 指定啓動時默認模式
      • 0 關機
      • 1 單用戶
      • 2 多用戶(NFS)
      • 3 多用戶字符界面
      • 4 未使用
      • 5 圖形界面
      • 6 重啓
[root@centos6 ~]# cat /etc/inittab 
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# 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:
這裏是設置默認啓動時幾模式,不要設置06
  • 如果設置了0或者6如果修復,在啓動時按任意鍵進入內核選擇,選擇內核按a鍵
    mark
  • 在後面輸入要以哪個模式啓動
    mark
  • 這樣系統就會以哪個模式啓動
  • 這是centos 6的文件,我們研究一下centos5的因爲centos5都是放在一個文件,centos6的配置文件是分開的

centos 6的/etc/inittab

  • 當系統啓動完後會啓動第一個腳本路徑/etc/rc.d/rc.sysinit是初始化腳本
  • /etc/inittab
    • 設置系統默認的運行級別
       
      id:3:initdefault:

      mark
  • 示列:
    • 破解centos5和centos6的root口令
  • /etc/init/control-alt-delete.conf
    • 這個文件可以設定是否啓用Ctrl+alt+delete 功能鍵是否啓用,按着三個鍵是重啓計算機,當然也可以自己定義其它動作
[root@centos6 ~]# cat /etc/init/control-alt-delete.conf 
# control-alt-delete - emergency keypress handling
#
# This task is run whenever the Control-Alt-Delete key combination is
# pressed.  Usually used to shut down the machine.
#
# Do not edit this file directly. If you want to change the behaviour,
# please create a file control-alt-delete.override and put your changes there.

start on control-alt-delete

exec /sbin/shutdown -r now "Control-Alt-Delete pressed"
  • /etc/init/tty.conf
    • 這是守護這些終端,如果被殺死則會啓動終端
  • /etc/init/start-ttys.conf
  • /etc/init/rc.conf
    • 系統啓動的第一個腳本文件,系統初始化腳本
  • /etc/init/prefdm.conf

/etc/rc.d/rc.sysinit:系統初始化腳本

  1. 設置主機名
  2. 設置歡迎信息
  3. 激活udev和seLinux
  4. 掛載/etc/fstab文件中定義的文件系統
  5. 檢測根文件系統,並以讀寫方式重新掛載根文件系統
  6. 設置系統文件
  7. 激活swap分區
  8. 根據/etc/sysctl.conf文件設置內核參數
  9. 激活lvm及software raid 設備
  10. 加載額外設備的驅動程序
  11. 清理操作
    • 說明:rc N —> 意味讀取/etc/rc.d/rcN.d/
    • K* : K##*:##運行次序;數字越小,越先運行;數字越小的服務,通常爲依賴到別的服務
    • S* : S##*:##運行次序;數字越小,越先運行;數字越小的服務,通常爲依賴到別的服務
for srv in /etc/rc.d/rcN.d/K*; do
    $srv stop
done
for srv in /etc/rc.d/rcN.d/S*; do
    $srv start
done
  • 注意:正常級別下,最後啓動一個服務S99local沒有鏈接至/etc/rc.d/init.d一個服務腳本,而是指向/etc/rc.d/rc.local腳本
  • 不便或不需要寫爲服務腳本放置於/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可直接放置/etc/rc.d/rc.local文件中
    • /etc/rc.d/rc.local 在指定運行級別腳本後運行
    • 可以根據情況,自定義修改

chkconfig 命令

  • chkconfig 命令
  • 查看服務在所有級別的啓動或關閉設定情形
[root@centos6 ~]# chkconfig   //默認不添加--list 和服務名是列出系統中所有的服務
NetworkManager  0:off   1:off   2:on    3:off   4:on    5:on    6:off
abrt-ccpp       0:off   1:off   2:off   3:on    4:off   5:on    6:off
abrtd           0:off   1:off   2:off   3:on    4:off   5:on    6:off
acpid           0:off   1:off   2:on    3:on    4:on    5:on    6:off
atd             0:off   1:off   2:on    3:off   4:on    5:off   6:off
auditd          0:off   1:off   2:on    3:on    4:on    5:on    6:off
autofs          0:off   1:off   2:off   3:on    4:on    5:on    6:off
blk-availability        0:off   1:on    2:on    3:on    4:on    5:on    6:off
bluetooth       0:off   1:off   2:off   3:on    4:on    5:on    6:off
certmonger      0:off   1:off   2:off   3:on    4:on    5:on    6:off
cpuspeed        0:off   1:on    2:on    3:on    4:on    5:on    6:off
crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off
cups            0:off   1:off   2:on    3:on    4:on    5:on    6:off
dnsmasq         0:off   1:off   2:off   3:off   4:off   5:off   6:off
firstboot       0:off   1:off   2:off   3:off   4:off   5:off   6:off
haldaemon       0:off   1:off   2:off   3:on    4:on    5:on    6:off
htcacheclean    0:off   1:off   2:off   3:off   4:off   5:off   6:off
[root@centos6 ~]# chkconfig --list httpd   //查看單獨的某個服務
httpd           0:off   1:off   2:off   3:off   4:off   5:off   6:off
  • 添加自己編寫的服務腳本到系統中
  • SysV的服務腳本放置於/etc/rc.d/init.d (/etc/init.d)
chkconfig --add name
#!/bin/bash
#LLLL 表示初始在哪個級別下啓動,-表示都不啓動
# chkconfig: LLLL nn nn
  • 刪除
    • chkconfig –del name
  • 修改指定的鏈接類型
chkconfig [--level levels] name <on|off|reset>
            --level LLLL: 指定要設置的級別;省略時表示2345
[root@centos6 ~]# chkconfig --list httpd
httpd           0:off   1:off   2:off   3:off   4:off   5:off   6:off
[root@centos6 ~]# chkconfig --level 345 httpd on
[root@centos6 ~]# chkconfig --list httpd        
httpd           0:off   1:off   2:off   3:on    4:on    5:on    6:off
  • 圖形命令 ntsysv命令

xinetd管理的服務

  • service 命令:手動管理服務
    • service 服務 start|stop|restart
    • service – status-all
[root@centos6 ~]# service httpd stop  //停止httpd服務
Stopping httpd:                                            [  OK  ]
[root@centos6 ~]# service httpd start //啓動httpd服務
[root@centos6 ~]# service httpd restart //重啓httpd服務
[root@centos6 ~]# service --status-all  //顯示系統中的全部狀態信息
  • 瞬態(Transient) 服務被xinetd進程所管理,就是將很少用,有時候還要用的服務由xinetd進程來管理,當不用時候停止服務,當有用戶訪問時則開啓服務。這樣可以節省資源,只有xinetd進程來監管
  • 進入的請求首先被xinetd代理
  • 配置文件:/etc/xinetd.conf、/etc/xinetd.d/ 與libwrap.so文件鏈接
  • 用chkconfig控制服務:
    • chkconfig tftp on

/etc/inittab 文件詳情

  • 設置登錄終端
1:2345:respawn:/usr/sbin/mingetty tty1
2:2345:respawn:/usr/sbin/mingetty tty2
...
6:2345:respawn:/usr/sbin/mingetty tty6
mingetty會自動調用login程序
x:5:respawn:/etc/X11/prefdm -nodaemon

啓動過程總結

  • 總結
    • /sbin/init–>(/etc/inittab)–>設置默認運行級別–> 運行系統初始化腳本、完成系統初始化–(關閉對應級別下需要關閉的服務)啓動需要啓動的服務–> 設置登錄終端
  • centos6 init程序爲:upstart ,其配置文件
    • /etc/inittab,/etc/init/*.cong,配置文件的語法遵循upstart配置文件語法格式,和centos不同

grub legacy

  • centos 6 啓動流程
    POST --> boot sequence(BIOS) --> boot loader --> kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init --> (/etc/inittab,/etc/init/*.conf) --> 設定默認運行級別 --> 系統初始化腳本rc.sysinit --> 關閉或啓動對應級別的服務 --> 啓動終端 
  • grub : GRand Unified Bootloader
    • grub 0.97 : grub legacy (centos 6)
    • grub 2.x : grub2 (centos 7)
    • grub legacy :
      • stage1:mbr
      • stage1.5 : mbr之後的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統
      • stage2:磁盤上分區(/boot/grub/)

grub 0.97中分爲三個階段

  • 第一階段就是mbr中
[root@centos6 ~]# hexdump -C -n 512 /dev/sda
00000000  eb 48 90 10 8e d0 bc 00  b0 b8 00 00 8e d8 8e c0  |.H..............|
00000010  fb be 00 7c bf 00 06 b9  00 02 f3 a4 ea 21 06 00  |...|.........!..|
00000020  00 be be 07 38 04 75 0b  83 c6 10 81 fe fe 07 75  |....8.u........u|
00000030  f3 eb 16 b4 02 b0 01 bb  00 7c b2 80 8a 74 03 02  |.........|...t..|
00000040  80 00 00 80 68 13 05 00  00 08 fa 90 90 f6 c2 80  |....h...........|
00000050  75 02 b2 80 ea 59 7c 00  00 31 c0 8e d8 8e d0 bc  |u....Y|..1......|
00000060  00 20 fb a0 40 7c 3c ff  74 02 88 c2 52 f6 c2 80  |. ..@|<.t...R...|
00000070  74 54 b4 41 bb aa 55 cd  13 5a 52 72 49 81 fb 55  |tT.A..U..ZRrI..U|
00000080  aa 75 43 a0 41 7c 84 c0  75 05 83 e1 01 74 37 66  |.uC.A|..u....t7f|
00000090  8b 4c 10 be 05 7c c6 44  ff 01 66 8b 1e 44 7c c7  |.L...|.D..f..D|.|
000000a0  04 10 00 c7 44 02 01 00  66 89 5c 08 c7 44 06 00  |....D...f.\..D..|
000000b0  70 66 31 c0 89 44 04 66  89 44 0c b4 42 cd 13 72  |pf1..D.f.D..B..r|
000000c0  05 bb 00 70 eb 7d b4 08  cd 13 73 0a f6 c2 80 0f  |...p.}....s.....|
000000d0  84 f0 00 e9 8d 00 be 05  7c c6 44 ff 00 66 31 c0  |........|.D..f1.|
000000e0  88 f0 40 66 89 44 04 31  d2 88 ca c1 e2 02 88 e8  |[email protected].1........|
000000f0  88 f4 40 89 44 08 31 c0  88 d0 c0 e8 02 66 89 04  |[email protected].1......f..|
00000100  66 a1 44 7c 66 31 d2 66  f7 34 88 54 0a 66 31 d2  |f.D|f1.f.4.T.f1.|
00000110  66 f7 74 04 88 54 0b 89  44 0c 3b 44 08 7d 3c 8a  |f.t..T..D.;D.}<.|
00000120  54 0d c0 e2 06 8a 4c 0a  fe c1 08 d1 8a 6c 0c 5a  |T.....L......l.Z|
00000130  8a 74 0b bb 00 70 8e c3  31 db b8 01 02 cd 13 72  |.t...p..1......r|
00000140  2a 8c c3 8e 06 48 7c 60  1e b9 00 01 8e db 31 f6  |*....H|`......1.|
00000150  31 ff fc f3 a5 1f 61 ff  26 42 7c be 7f 7d e8 40  |1.....a.&B|..}.@|
00000160  00 eb 0e be 84 7d e8 38  00 eb 06 be 8e 7d e8 30  |.....}.8.....}.0|
00000170  00 be 93 7d e8 2a 00 eb  fe 47 52 55 42 20 00 47  |...}.*...GRUB .G|
00000180  65 6f 6d 00 48 61 72 64  20 44 69 73 6b 00 52 65  |eom.Hard Disk.Re|
00000190  61 64 00 20 45 72 72 6f  72 00 bb 01 00 b4 0e cd  |ad. Error.......|
000001a0  10 ac 3c 00 75 f4 c3 00  00 00 00 00 00 00 00 00  |..<.u...........|
000001b0  00 00 00 00 00 00 00 00  36 4e 0d 00 00 00 80 20  |........6N..... |
000001c0  21 00 83 aa 28 82 00 08  00 00 00 00 20 00 00 aa  |!...(....... ...|
000001d0  29 82 83 fe ff ff 00 08  20 00 00 80 1a 06 00 fe  |)....... .......|
000001e0  ff ff 83 fe ff ff 00 88  3a 06 00 00 71 02 00 fe  |........:...q...|
000001f0  ff ff 05 fe ff ff 00 88  ab 08 00 78 54 10 55 aa  |...........xT.U.|
00000200
  • 在mbr中的446個字節是啓動引導,還有64字節是存放分區表信息的,還有2字節的55a
  • 因爲只有446個字節不能存放太多的東西,而系統啓動要進入/boot下要進入boot下就要能識別分區系統,但是446個字節不可能存放分區系統驅動,在啓動中並不是先找根,而是先找/BOOT/內核 在進根分區
  • 而/boot的文件系統驅動放在1.5階段,就mbr之後的扇區中。當加載完1.5階段之後就可以加載對應的驅動,就可以進入boot中加載kernel,加載內核之後就加載initramfs-內核版本號.img ,就可以找到掛載根了
  • 而掛載根就要知道根分區在哪,存放根就在/boot/grub/grub.conf
00000200
[root@centos6 ~]# vim /boot/grub/grub.conf 
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-696.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=03352018-7cef-4ee3-9a05-b0833b67da19 rd_NO_LUKS rd_NO_L
VM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb
 quiet
        initrd /initramfs-2.6.32-696.el6.x86_64.img
  • root=UUID=03352018-7cef-4ee3-9a05-b0833b67da19 這個就是根分區UUID
  • 在/boot/grub/ 這個文件是grub2階段中要加載的,但是我們看到裏面有很多1階段,1.5階段的文件,如果我們把這些文件都移走,只留下grub.conf文件
[root@centos6 grub]# ls
device.map     ffs_stage1_5      jfs_stage1_5    reiserfs_stage1_5  stage2           xfs_stage1_5
e2fs_stage1_5  grub.conf         menu.lst        splash.xpm.gz      ufs2_stage1_5
fat_stage1_5   iso9660_stage1_5  minix_stage1_5  stage1             vstafs_stage1_5
  • 把這些都移到別的地方,只留下grub.conf然後重啓,發現系統可以正常啓動,所有默認這裏的文件都不會起作用的,只有grub.conf文件起作用

grub安裝

  • grub安裝
    1. grub-install
      • 安裝grub stage1和stage1_5到/dev/disk磁盤上,並複製grub相關文件到dir/boot目錄下
      • grub-install –root-directory=DIR /dev/disk
      • 這個命令可以修復grub1/1.5/2階段的grub
      • 這種是非交互式安裝,–root這一個選項是指定/boot目錄的上一級目錄,如果是根可以不寫,默認是根. /dev/disk這是硬盤,不是分區,因爲mbr是不屬於任何分區的
    2. grub 交互式安裝
       
      grub> root (hd#,#)
      grub> setup (hd#)
  • 配置文件:/etc/grub/grub.conf.con <– /etc/grub.conf
  • stage2及內核的那個通常放置於一個基本磁盤分區中
  • 功能
    1. 提供啓動菜單、並提供交互式接口
      • a:內核參數
      • e:編輯 模式
      • c:命令模式
    2. 加載用戶選擇的內核或操作系統
      • 允許傳遞參數給內核
      • 可以隱藏啓動菜單
    3. 爲菜單提供保護機制
      • 爲編輯啓動菜單進行認證
      • 爲啓動內核或者操作系統進行認證
  • grub的命令行接口
    • help:獲取幫助列表
    • help KEYWORD :詳細幫助信息
    • find(hd#,#)/PATH/TO/SOMEFILE:
    • root (hd#,#)
    • kernel /PATH/TO/KERNEL_FILE: 設定本次啓動時用到的內核文件;額外還可添加許多內核支持使用的cmdline參數
      • 例如:max_loop=100 selinux=0 init=/path/to/init
    • initrd /PATH/TO/INITRAMFS_FILE: 設定爲選定的內核提供額外文件的ramdisk
    • boot: 引導啓動選定的內核
  • cat /proc/cmdline 內核參數
  • 內核參數文檔:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt
  • 識別硬盤設備
    • (hd#,#)
    • hd#:磁盤編號,用數字表示;從0開始編號
    • #:分區編號,用數字表示;從0開始編號
    • (hd0,0)第一塊硬盤,第一個分區
  • 手動在grub命令行接口啓動系統
grub> root (hd#,#)
grub> kernel /vimlinuxz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot

配置文件:/boot/grub/grub.conf

  • default=#: 設定默認啓動的菜單項;落單項(title)編號從0開始
  • timeout=#:指定菜單項等待選項選擇的時長
  • splashimage=(hd#,#)/PATH/XPM_FILE:菜單背景圖片文件路徑
  • password [–md5] STRING: 啓動菜單編輯認證
  • hiddenmenu:隱藏菜單
  • title TITLE:定義菜單項“標題”, 可出現多次
  • root (hd#,#):查找stage2及kernel文件所在設備分區;爲grub的根
  • kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:啓動的內核
  • initrd /PATH/TO/INITRAMFS_FILE: 內核匹配的ramfs文件
  • password [–md5|–encrypted ] STRING: 啓動選定的內核或操作系統時進行認證

kernel這一段的信息含義

  • mark
 root (hd0,0)
        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=03352018-7cef-4ee3-9a05-b0833b67da19 rd_NO_LUKS rd_NO_L
VM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
         initrd /initramfs-2.6.32-696.el6.x86_64.img
  • root (hd0,0)這是指boot掛載點第一個硬盤的第一個分區
  • kernel /vmlinuz-2.6.32-696.el6.x86_64 內核名稱和版本號 /這裏的根是boot下
  • ro root=UUID=03352018-7cef-4ee3-9a05-b0833b67da19 在啓動時以只讀方式掛載
    操作系統的根
  • d_NO_LUKS rd_NO_L
    VM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet 內核的一些參數,是否支持邏輯卷,加密。rhgb是啓動時圖形界面,不寫也不會影響啓動。quiet是在啓動過程中不顯示內核參數,如果不寫則會顯示啓動參數
  • initrd /initramfs-2.6.32-696.el6.x86_64.img 是磁盤虛擬的磁盤文件系統,這裏面是一個小型linux可以加載必要的驅動模塊,如果這個文件丟失則無法掛載根文件系統

- grub不是內核,是告訴內核在哪

操作一下吧rhgb和quiet刪掉
- mark
- 然後啓動
mark
- 在綠色ok之前的都是啓動內核參數,而其是以字符方式啓動的,並沒有用圖形狀態啓動
- /proc/cmdline是存放內核參數的內容

[root@centos6 ~]# cat /proc/cmdline 
ro root=UUID=03352018-7cef-4ee3-9a05-b0833b67da19 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16   KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM 
  • 添加內核參數是直接在grub.conf文件中kernel段最後面添加,內核參數生效是在啓動時纔會生效

把grub文件全部刪除然後修復

  • 刪除grub目錄中的文件全部刪除,然後重啓
[root@centos6 ~]# rm -f /boot/grub/*
[root@centos6 ~]# ls /boot/grub/
[root@centos6 ~]# 
[root@centos6 ~]# reboot
  • 錯誤15代碼,如圖
  • mark
  • 進入光盤救援模式
  • 這裏修復分爲2部分
    • 第一步用grub-install 修復grub1,1.5,2階段文件,
    • grub-install只能修復grub文件但是有一個grub.conf文件是無法修復,可以用網絡將相同主版本的系統是上的/boot/grub/grub.conf文件複製一份,進行修改。也可以手寫一份
  • 首先修復grub文件
  • mark
  • 如果報這種警告也不影響
  • mark
  • 查看一下grub目錄裏的文件是否存在
  • mark
  • 第一步就修復完成了,發現grub.conf文件沒有,這需要我們手動創建,也可以從網上覆制模本,或者從相同的系統機器中cp一份,現在如何從別的機器上覆制一份
    • 首先給機器設置一個ip,並且可以ping通對方的機器
    • mark
    • 用scp命令複製一份文件,由於沒有相同的機器,所以那其它文件代替,當把文件複製到本地時需要修改rootuuid
    • mark
    • 然後就是修改了
  • 由於沒有相同版本的系統型號,所以我們手寫一份
  • mark
  • 文件名一定是grub.conf文件
  • mark
  • 這樣就啓動成功了,root推薦用UUID寫,也可以用上圖所寫的

grub加密

  • grub-md5-crypt
  • grub-crypt sha512加密

破解root口令:

  • 啓動系統時,設置其運行級別1
    • 進入單用戶模式:
  • 編輯grub菜單(選定要編輯的title,而後使用e命令)
  • 在選定的kernel後附加
    • 1, s, S或single都可以
  • 在kernel所在行,鍵入“b”命令

實驗

修復grub1階段就是mbr中的446個字節
- 首先用dd命令破壞系統中的446個字節
1. 交互式修復

[root@centos6 grub]# 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.000677783 s, 658 kB/s
[root@centos6 grub]# 
  • 如果重啓就不會有任何問題,因爲系統已經加載到內存中了,現在重啓
[root@centos6 grub]# reboot
  • 就會出現這種錯誤
  • mark
  • mark
  • 現在用光盤進入救援模式,選項都默認進入shell中
  • 首先要切根,因爲grub-install 命令會讀取根下的文件內容,如果不切的話會報錯無法運行
  • mark
  • 用chroot切根
  • mark
  • 然後在運行grub-install命令
  • mark
  • 在用hexdump 這個命令查看2進制的來查看一下512字節是否恢復了
  • mark
  • 這樣我們用grub-install 命令就把grub第一階段修復完成了
  • 重啓計算機
  • mark
    主意
    1. 在這裏要注意grub-install 這個命令必須要在系統根上運行,進入光盤時是在光盤目錄上,要用chroot切根
    2. grub-install 在上面命令我們沒有用–root-directory= 這個選項,這裏=號後面要跟/boot目錄的上一級目錄,如果是在根上默認可以不寫。
    3. 運行完成後不要急着去重啓等待一會,因爲可能系統沒有把緩衝的數據寫入磁盤中,而導致出錯

4. 把selinux 關閉

  1. 交互式命令修改grub1
    • 刪除446字節
[root@centos6 ~]# 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.000546253 s, 816 kB/s
  • 剛剛我們知道/grub目錄中除了gurb.conf這個文件有用其它是沒有用的,我們把它移到別的地方
[root@centos6 app]# mv /boot/grub/* .
[root@centos6 app]# ls
device.map     ffs_stage1_5      jfs_stage1_5  menu.lst           splash.xpm.gz  ufs2_stage1_5    xfs_stage1_5
e2fs_stage1_5  grub.conf         lost+found    minix_stage1_5     stage1         vstafs_stage1_5
fat_stage1_5   iso9660_stage1_5  lv0           reiserfs_stage1_5  stage2 
  • 在運行grub命令交互式完成
[root@centos6 app]# grub
Probing devices to guess BIOS drives. This may take a long time.
Unknown partition table signature

grub> root (hd0,0)   //hd 後面跟第塊硬盤,和扇區
root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83
 grub> setup (hd0) 
setup (hd0)
 Checking if "/boot/grub/stage1" exists... no   //這裏報錯了需要/boot/grub/stage1這個文件
 Checking if "/grub/stage1" exists... no

Error 15t: File not found
  • 所有/grub/裏面的文件是用於grub修復用的,我們在移動回來
[root@centos6 app]# grub
Probing devices to guess BIOS drives. This may take a long time.
Unknown partition table signature


    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]
grub> root (hd0,0)
root (hd0,0)    
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  27 sectors are embedded.
succeeded //這裏說明了1.5階段所在的位置,就是0扇區後的27個扇區,是存放/boot文件驅動的
 Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded 
Done.
grub> quit
  • 這樣就成功了
    刪除1.5階段然後恢復
  • 不刪除前512個字,刪除0個扇區之後到27個扇區
[root@centos6 app]# dd if=/dev/zero of=/dev/sda bs=1 count=5120 skip=512 seek=512
5120+0 records in
5120+0 records out
5120 bytes (5.1 kB) copied, 0.00458081 s, 1.1 MB/s
  • 重啓計算機
  • mark
  • 這裏什麼也沒有卡着不動,並不向1階段哪些,當插入光盤後會自動拿光盤引導,因爲這裏的1階段啓動成功了,但是進入1.5階段加載失敗,導致卡着不動,也無法進入2階段,就無法顯示菜單
  • 光盤啓動進入救援模式,切根,用grub-install修復
    mark
    mark
  • 修復完成,重啓計算機

gurb 2階段的配置文件/boot/grub/grub.conf

  • 配置文件:/boot/grub/grub.conf <– /etc/grub.conf
  • 詳細介紹
#boot=/dev/sda
default=0
timeout=5 
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-696.el6.x86_64)  //這個title 後面跟的就是啓動菜單名
        root (hd0,0)
        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=03352018-7cef-4ee3-9a05-b0833b67da19 rd_NO_LUKS rd_NO_ //grub 眼裏boot纔是根
LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rh 
gb quiet
        initrd /initramfs-2.6.32-696.el6.x86_64.img  //grub 眼裏boot纔是根
  • grub 眼裏boot纔是根
  • root (hd0,0) 這個可以不寫,着相當於一個變量,告訴root根在哪, 不寫的話可以直接這樣寫
kernel  (hd0,0)/vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=03352018-7cef-4ee3-9a05-b0833b67da19 rd_NO_LUKS rd_NO_
  • 我們可以加一個菜單 只需要在添加一個title 名字
default=0   //如果有多個系統,默認是0第一個title系統啓動
timeout=5   //菜單超時時間
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-696.el6.x86_64)  //這個title 後面跟的就是啓動菜單名
        root (hd0,0)
        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=03352018-7cef-4ee3-9a05-b0833b67da19 rd_NO_LUKS rd_NO_ //grub 眼裏boot纔是根
LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rh 
gb quiet
        initrd /initramfs-2.6.32-696.el6.x86_64.img  //grub 眼裏boot纔是根
title centos10  //這是我們剛剛添加
root (hd0,0)
        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=03352018-7cef-4ee3-9a05-b0833b67da19 rd_NO_LUKS rd_NO_ //grub 眼裏boot纔是根
LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rh 
gb quiet
        initrd /initramfs-2.6.32-696.el6.x86_64.img  //grub 眼裏boot纔是根
  • 重啓一下看看菜單
  • mark
    如果我們要把initrd 放在kernel 前會導致系統啓動不了
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-696.el6.x86_64)
        root (hd0,0)
        initrd /initramfs-2.6.32-696.el6.x86_64.img
        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=03352018-7cef-4ee3-9a05-b0833b67da19 rd_NO_LUKS rd_NO_
LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rh
gb quiet
  • 重啓後出現19的錯誤
  • mark
  • 解決方法
    1. a任意鍵進菜單中
      • mark
    2. 按e進入內核選項
      • mark
      • 在按o添加一個新行進行編輯,進行添加編輯,一定要在kernel下面
      • mark
    3. 在按e編輯這個空行
      • mark
    4. 把initrd 重新寫一邊,可以用tab鍵補全
      • mark
      • mark
    5. 在按b啓動
      • mark
    6. 這裏只是臨時修改,文件裏並沒有更改,所有進去系統後要把文件改掉

centos6 破解root口令

  • 重啓機器
  • 進入菜單選項 輸入a鍵
  • mark
  • 在這個後面輸入1 ,這裏是進入單用戶模式 或者輸入S 或 single ,進入單用戶是不用密碼的
  • mark
  • 進入單用戶在重新設置密碼
  • mark
  • 重啓就可以了

如何將菜單設置密碼

  • 需要在/etc/grub/grub.conf文件中添加一個新行password
  • 這裏是明文口令當然可以加密的 需要在–md5 後面跟加密的密碼, 生成md5加密口令 grub-md5-crypt
  • 如果要用512sha加密算法 –encrypted 加密後的密碼 ; 生成sha512密碼口令 grub-crypt
  • mark
  • 重新啓動
  • 進入菜單後發現按什麼鍵都進入不了內核,單是可以按P輸入剛剛的密碼
  • mark
  • mark
  • 這樣就可以了

在/boot/grub/文件夾裏除了grub.conf配置文件在啓動時有效,其它的文件都是在啓動中沒有起到任何作用,因爲我們之前把除了grub.conf文件留下,但是系統還是可以正常啓動。有一種特殊的方式會導致grub目錄裏的文件都生效

  • 現在把/boot/grub目錄中除了grub.conf文件都刪掉
[root@centos6 grub]# ls
grub.conf
  • 現在重啓,將啓動不了報錯誤15如下圖
  • mark
  • 出現這種情況說明grub目錄中除了grub.conf文件外其它文件都生效了,如果是一個乾淨系統沒有做過grub修復的系統是不會生效這些文件,由於之前我們做了大量的破壞修復了grub,所有現在的系統不是乾淨的,我們在刪除grub目錄中的其它文件會導致系統無法重啓,解決就是之前的修修復grub
    用光盤引導進入救援模式。在修復之前grub2階段是在磁盤的某個位置上,但是修改grub之後grub2階段就在grub目錄中。
  • mark
  • 這樣grub文件就有了,修復成功等待一會然後重啓
  • mark
  • 啓動成功mark
  • 但是在啓動過程中會有一個錯誤提示但是不影響啓動
[root@centos6 ~]# ls /app/
device.map     ffs_stage1_5      lost+found  minix_stage1_5     stage1   ufs2_stage1_5    xfs_stage1_5
e2fs_stage1_5  iso9660_stage1_5  lv0         reiserfs_stage1_5  stage2   vstafs_stage1_5
fat_stage1_5   jfs_stage1_5      menu.lst    splash.xpm.gz     www
[root@centos6 ~]# ls /boot/grub/
device.map     fat_stage1_5  grub.conf         jfs_stage1_5    reiserfs_stage1_5  stage2         vstafs_stage1_5
e2fs_stage1_5  ffs_stage1_5  iso9660_stage1_5  minix_stage1_5  stage1             ufs2_stage1_5  xfs_stage1_5
[root@centos6 ~]# 
  • 少了一個叫splash.xpm.gz文件這是一個菜單背景圖片,在grub.conf裏面有定義
  • mark
  • 是一個黑色的背景

把boot文件清空後修復

  • 把boot目錄刪除,因爲boot是掛載點所以無法刪除但是裏面的內容已經空了
[root@centos6 ~]# rm -fr /boot/
rm: cannot remove `/boot': Device or resource busy
[root@centos6 ~]# ls /boot/    
[root@centos6 ~]# 
  • mark
  • 進入光盤救援模式,然後用chroot切根,然後將光盤掛載到一個目錄中
  • mark
  • 在用rpm 安裝kernel包,如果不加–force強制安裝選項 會顯示kernel已經安裝,所以必須用這個選項,但是我們只刪除了boot中部分內核文件,所以系統認爲我們已經安裝了kernel
  • mark
  • mark
  • 安裝完成後,boot下除了grub目錄沒有其它都生成了。在用grub-install命令修復grub
  • mark
  • 現在看一下grub和kernel文件都有了,但是在grub目錄中沒有grub.conf配置文件,我們可以手寫,也可以不寫,重啓機器,當我們用grub-install 修復好文件後一定要等待幾分鐘,讓緩衝裏的內容寫到磁盤中,如果立即重啓很可能會報錯。
  • 我們不寫grub.conf文件重啓機器
  • mark
  • 這就是不寫grub.conf啓動的界面。我們可以直接在這上面寫grub.conf的內容直接從內核段開始寫
  • mark
  • boot重啓
  • mark
  • 這種只是臨時的,下次啓動還是要這樣,所有我們要進系統後把grub.conf文件創建並寫好

把boot刪掉,和/etc/fstab文件也刪除修復

  • 刪除/boot文件和/etc/fasta文件
[root@centos6 ~]# rm -rf /boot
rm: cannot remove `/boot': Device or resource busy
[root@centos6 ~]# ls /boot/
[root@centos6 ~]# rm -f /etc/fstab 
[root@centos6 ~]# cat /etc/fstab
cat: /etc/fstab: No such file or directory
[root@centos6 ~]# 
  1. 進入光盤救援模式,這裏會出現掛載不上根
    • mark
    • 這顯示數要把根掛載到/mnt/sysimage上,我們回車
    • mark
    • 按OK,出現一個新的shell
    • mark
    • 進入shell後用df命令查看掛載點,發現沒有掛載到根,這樣我們就無法修復grub文件,我們先要修復fstab文件
    • mark
    • 要修復fstab文件就要知道根在哪,所有我們要把這幾個分區都掛一下看裏面的內容是什麼來判斷哪個是根
    • mark
    • 剛剛排除了兩個,現在我們可以根據大小或裏面的內容來判斷,創建一個目錄把這些文件都掛載上去
    • mark
    • 把根掛到目錄上,然後創建fstab文件
    • 這裏一定要寫全路徑然後用vi寫,不支持vim,也可以用cat命令寫
    • mark
    • 然後重啓,必須讓救援模式自己掛載根
    • 這樣救援模式就重新掛載了
    • mark
    • 然後就是之前的操作了
  2. 先切根然後創建一個目錄掛載光盤
    • mark
  3. 安裝kernel
    • mark
  4. 修復grub目錄
    • mark
  5. 修復grub.conf文件
    • mark
  6. 重新啓動,就可以了,在修復fstab時一定要把路徑寫全,和把有的分區都掛載上去

init進程被刪除如何修復

  • init是系統中第一個進程,上帝進程,如果把init刪掉也是無法啓動系統
  • 刪除init文件
[root@centos6 ~]# which init
/sbin/init
[root@centos6 ~]# 
[root@centos6 ~]# rm -f /sbin/init
[root@centos6 ~]# ls /sbin/init
ls: cannot access /sbin/init: No such file or directory
  • 重新啓動後系統會卡在這
  • mark
  • 修復步驟
    1. 在啓動時進入菜單按e選擇內核,按e進入編輯模式
  • mark
  • mark
  • 在這後面輸入 init=/bin/bash 我們用bash來代替init進程
  • 這裏寫圖片描述
  • 按按回車會返回到內核中,在按b進入引導啓動,啓動後是這樣的畫面
  • mark
  • 現在我們就可以輸入命令,我們把光盤掛載一下,把init包安裝一下
  • 由於現在的根是隻讀模式,所有要重新掛載一下
  • mark
    1. 掛載光盤
  • mark
    1. 用rpm安裝init包, 包名是upstart,要加–force選項,強制安裝
  • mark
  • mark

邏輯卷的破壞和修復

  • 把/etc/fstab和boot目錄清空
  • mark
  • 重啓後會出現這樣的錯誤
  • mark
    1. 進入救援模式
  • 這裏也會找不到根,求援模式無法掛載到根
  • 首先也是找到根是哪個邏輯卷分區用lvs查看
  • mark
    1. 創建一個文件夾掛載root這個邏輯卷
  • mark
  • 但是會報錯,而且用teb鍵是補不全的,也找不到邏輯卷,我們用lvdisplay查看邏輯卷,發現這兩個都不是活動狀態
  • mark
  • 故障狀態邏輯卷是不會被激活的,用vgchange -ay 激活所有卷組
  • mark
  • mark
  • 然後在重新掛載一下邏輯卷,掛載成功
  • mark
    1. 修復fstab文件
  • 用mount查看當前掛載情況
  • mark
  • 因爲我們把根掛載到/mntroot上了,所有也可把boot掛載到其它目錄上,然後取最後2行到/mntroot/etc/fstab中。當然也可以手寫,只是覺得設備名記不住所以這樣
  • mark
  • mark
  • 現在開始修改fstab配置文件
  • mark
  • 這裏的swap文件寫不寫都可以不影響啓動,也可以進入系統在寫
    1. 現在重新啓動進入救援模式自動掛載根然後修復kernel和grub文件
  • mark
  • 切根掛載光盤
  • mark
  • 用rpm安裝內核
  • mark
  • 修復grub文件
  • mark
  • 修復/boot/grub/grub.conf文件
  • mark
  • 重啓
  • 成功
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章