centos5,6的GRUB簡介

来源:https://www.cnblogs.com/xiaoshiwang/archive/2020/02/22/12346441.html
-Advertisement-
Play Games

grub:GRand Unified Bootloader grub 0.x:grub legacy(centos5,6) grub 1.x:grub2(centos7) grub legacy(grub 0.x) stage1:mbr stage1_5:mbr之後的扇區,讓stage1中的boot ...


grub:GRand Unified Bootloader

  • grub 0.x:grub legacy(centos5,6)
  • grub 1.x:grub2(centos7)

grub legacy(grub 0.x)

stage1:mbr

stage1_5:mbr之後的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統

stage2:磁碟分區(/boot/grub/)

centos6:

# ls /boot/grub/
device.map     fat_stage1_5  grub.conf         jfs_stage1_5  minix_stage1_5     splash.xpm.gz  stage2         vstafs_stage1_5 e2fs_stage1_5  ffs_stage1_5  iso9660_stage1_5  menu.lst      reiserfs_stage1_5  stage1         ufs2_stage1_5  xfs_stage1_5

stage2和內核,通常放置於基本的磁碟分區,不可以是lvm和軟raid。讀取lvm和軟raid分區,是需要根文件系統里的驅動程式的,這時根文件系統還沒有載入。

根文件系統,一般都是邏輯分區,以方便擴容和管理,如果/boot也和根文件系統在同一個分區里的話,由於grub程式無法載入邏輯分區里的文件,所以就無法訪問/boot目錄,也就不能載入內核,系統就無法啟動了。所以這就是/boot獨立分區的原因。

如果根文件系統不使用邏輯捲,那麼/boot是可以不獨立分區的。

安裝centos6操作系統時,如果不是手動分區的話,會自動把/boot獨立出來成一個分區;而把/和swap它們2個做成邏輯分區.

驗證一下centos6:

首先使用fdisk,可以看出/dev/sda2是Linux LVM(邏輯分區);而/dev/sda1是普通分區。

再用pvs,可以看出/dev/sda2里的vg的名字是vg_c610

再用vgs,可以看出vg_c610里有2個LV

再用lvs,可以看出vg_c610里的2個LV分別是lv_root和lv_swap

再用mount,可以看出邏輯分區lv_root的掛載點是/;/dev/sda1掛載到了/boot

# fdisk -l /dev/sda
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              64        1045     7875584   8e  Linux LVM
# pvs
  PV         VG      Fmt  Attr PSize PFree
  /dev/sda2  vg_c610 lvm2 a--u 7.51g    0
# vgs
  VG      #PV #LV #SN Attr   VSize VFree
  vg_c610   1   2   0 wz--n- 7.51g    0
# lvs
  LV      VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv_root vg_c610 -wi-ao----   6.71g
  lv_swap vg_c610 -wi-ao---- 816.00m
# mount | grep "^/dev"
/dev/mapper/vg_c610-lv_root on / type ext4 (rw)
/dev/sda1 on /boot type ext4 (rw)

stage2的作用:

1,提供菜單,並提供互動式介面

  • 按e鍵:進入編輯模式,用於編輯菜單
  • 按c鍵:命令模式,進入互動式界面。

2,載入用戶選擇的內核或操作系統

  • 允許傳遞參數給內核
  • 可以隱藏此菜單

3,為菜單提供了保護機制

  • 為編輯菜單提供密碼保護
  • 為啟動內核提供密碼保護

grub命令使用:

  • help獲取幫助;help KEYWORD 某個命令的詳細信息

  • 識別設備:root (hd#,#):hd和外面的括弧是固定的。第一個數字標識是第幾塊磁碟;第二個數字標識是第幾個分區。數字從0開始。從grub2開始就是從1開始編號了。

    (hd0,0):第一個磁碟的第一個分區。

  • 查找命令:find

    查找時,必須指明在哪個磁碟的哪個分區。

    查找內核,知道內核文件的名字,但不知道在磁碟的哪個分區啊,但查找時還必須指明磁碟和分區,太坑了,只能瞎試了。在(hd0,0)里找到了內核文件。

    grub> find (hdx,y)/vmlinuz-3.10.0-957.el7.x86_64

    從網上找到的磁碟和grub命令里的hd(#,#)的對應關係,不知道對不對了

    • sda1表示第一塊硬碟第1個主分區=hd(0,0)
    • sda2表示第一塊硬碟第2個主分區=hd(0,1)
    • sdb1表示第二塊硬碟第1個主分區=hd(1,0)
    • sdb2表示第二塊硬碟第2個主分區=hd(1,1)
  • 進入選定磁碟:root

    grub> root hd(0,0)
    grub> find /vmlinuz-2.6.32-754.el6.x86_64
     hd(0,0)

    進入磁碟後,使用find命令時,就不用加磁碟了。

    註意:如果/boot是和根文件系統放在了一個文件系統上了的話,路徑就要加上/boot。grub> find /boot/vmlinuz-2.6.32-754.el6.x86_64

  • 選擇要啟動的內核:kernel /PATH/TO/KERNEL_FILE

    內核的文件名:vmlinuz*

    額外還可以指定許多內核參數。

    例如:

    • selinux=0(不啟用selinux功能)
    • init=/sbin/init(第一個用戶空間的程式)
  • 選擇要內核要使用的ramdisk文件:initrd /PATH/TO/RAMDISK_FLLE

    centos6:initramfs.img。

    註意:ramdisk文件的版本號要和內核的版本號完全一樣

  • 啟動選定的內核:boot

操作系統啟動的內幕:

1,顯示可啟動的操作系統列表。

2,選擇要啟動的系統後,按e鍵,進入下麵的畫面。

第一行(root (hd0,0)):指定內核vmlinuz-2.6.32-754.el6.x86_64所在的磁碟和分區

第二行:vmlinuz-2.6.32-754.el6.x86_64的位置,和內核啟動的參數。ro:是只讀。root是根文件系統所在的分區。

第三行:內核啟動時,使用的ramdisk文件的位置

當在選擇要啟動的操作系統的界面,敲回車後,實際允許的就是這3行指令。

手動啟動系統

控制上圖顯示的內容的配置文件:/etc/grub.conf,損壞了的時候,就不知道要用哪個內核和ramdisk等啟動系統了,但啟動後,能進入grub命令行界面,這時可以手動指定內核,ramdisk後,執行開機。

1,選定要啟動的kernel

grub> root (hd0,0)
grub> kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/vg_c610-lv_root

2,選定kernel要使用的ramdisk文件

grub> initrd /initramfs-2.6.32-754.el6.x86_64.img

3,啟動選定的kernel

grub> boot

grub配置文件說明

/etc/grub.conf文件的內容:

  • default:多個操作系統的時候,讓哪個操作系統被預設選擇上。
  • timeout:等用戶5秒,如果用戶沒有操作,則啟動預設選項上的操作系統。
  • splashimage:選擇操作系統界面的圖片。
  • title:顯示的內容
    • root:指定內核vmlinuz-2.6.32-754.el6.x86_64所在的磁碟和分區
    • kernel:vmlinuz-2.6.32-754.el6.x86_64的位置,和內核啟動的參數。
    • initrd:內核啟動時,使用的ramdisk文件的位置
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-754.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/vg_c610-lv_root rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us LANG=\
en_US.UTF-8 rd_NO_MD rd_LVM_LV=vg_c610/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg_c610/lv_root rd_NO_DM rh\
gb quiet
        initrd /initramfs-2.6.32-754.el6.x86_64.img

手動加一個操作系統:添加title和其下麵的root等。

當按e鍵後,需要輸入密碼:password --md5 $1$jXrWo0$YF3q8/FNPT7rR8xkgKKhj0。寫在hiddenmenu上面。

當按回車鍵後,需要輸入密碼:password --md5 $1$jXrWo0$YF3q8/FNPT7rR8xkgKKhj0,才能啟動系統。寫在initrd下麵。

生成md5密碼的命令:grub-md5-crypt

default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
password --md5 $1$jXrWo0$YF3q8/FNPT7rR8xkgKKhj0
hiddenmenu
title CentOS 6 (2.6.32-754.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/vg_c610-lv_root rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us LANG=\
en_US.UTF-8 rd_NO_MD rd_LVM_LV=vg_c610/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg_c610/lv_root rd_NO_DM rh\
gb quiet
        initrd /initramfs-2.6.32-754.el6.x86_64.img

title CentOS 6 (my test)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/vg_c610-lv_root rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us LANG=\
en_US.UTF-8 rd_NO_MD rd_LVM_LV=vg_c610/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg_c610/lv_root rd_NO_DM rh\
gb quiet
        initrd /initramfs-2.6.32-754.el6.x86_64.img
        password --md5 $1$jXrWo0$YF3q8/FNPT7rR8xkgKKhj0

啟動時的menu圖:

進入單用戶模式的方法

1,在選定的操心系統上,按e鍵

2,在選定的kernel上,按e鍵,然後在顯示的kernel參數後面,按空格 ,在按1或s或S鍵,然後回車,最後按b鍵。

grub壞了,修複grub

損壞情況1:/boot所在的分區里的內容,被誤刪除了,而且已經關機了,如何修複?

下麵模擬這種損壞的情形,把損壞的grub的磁碟拆下來,連到另一個主機上,這個主機上有一個磁碟是/dev/sda,連上損壞的磁碟後,損壞的磁碟是/dev/sdb。修好後,拆下原來的/dev/sda,所以修好的磁碟就變成了/dev/sda。

1,找個新的磁碟,模擬成grub損壞的磁碟,分3個區,/dev/sdb1放/boot,/dev/sdb3放根文件系統,/dev/sdb2放swap

# fdisk -l /dev/sdb
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1          14      112423+  83  Linux
/dev/sdb2              15          40      208845   82  Linux swap / Solaris
/dev/sdb3              41         105      522112+  83  Linux
# mke2fs -t ext4 /dev/sdb1
# mke2fs -t ext4 /dev/sdb3
# mkswap /dev/sdb2

2,掛載分區

# mount /dev/sdb1 /mnt/boot/
# ls /mnt/boot/
lost+found

3,使用grub-install安裝grub

選項--root-directory:告訴grub-install去哪個目錄找/boot;後面的分區是告訴grub-install去哪個分區找/boot。

執行成功後,在/mnt/boot/grub目錄下,創建出了stage文件。

# grub-install --root-directory=/mnt /dev/sdb1
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /mnt/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.

(fd0)   /dev/fd0
(hd0)   /dev/sda
(hd1)   /dev/sdb
# ls /mnt/boot/grub/
device.map     grub.conf         minix_stage1_5     ufs2_stage1_5
e2fs_stage1_5  grub.conf~        reiserfs_stage1_5  vstafs_stage1_5
fat_stage1_5   iso9660_stage1_5  stage1             xfs_stage1_5
ffs_stage1_5   jfs_stage1_5      stage2

4,安裝grub後,/boot目錄下沒有內核和ramdisk,所以從別的地方複製內核和ramdisk過來

# cp /boot/vmlinuz-2.6.32-754.el6.x86_64 /mnt/boot/
# cp /boot/initramfs-2.6.32-754.el6.x86_64.img /mnt/boot
# ls /mnt/boot/
grub  initramfs-2.6.32-754.el6.x86_64.img  lost+found  vmlinuz-2.6.32-754.el6.x86_64

5,創建/boot/grub/grub.conf文件

註意:kernel和initrd放在(hd0,0)里了;而且假設根文件系統在/dev/sda3上。

default=0
timeout=5
title CentOS 6 (test)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/sda3
        initrd /initramfs-2.6.32-754.el6.x86_64.img

6,由於/dev/sda3里沒有根文件系統,手動創建

# mkdir /mnt/sysroot
[root@c610 ~]# mount /dev/sdb3 /mnt/sysroot/
[root@c610 ~]# cd /mnt/sysroot/
[root@c610 sysroot]# mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr bome root mnt media

7,內核啟動後,要啟動init程式,創建能夠啟動init的環境太複雜,簡單點,就讓內核啟動後,不啟動init,而是啟動bash程式。

把bash的可執行文件和所依賴的庫都拷貝到/dev/sda3.

用ldd命令可以知道可執行文件都依賴了哪些庫文件。

測試bash是否可用,使用chroot命令切換根文件系統。切換後,直接進入了bash,說明bash可以正常運行。嘗試運行ls命令,ls命令沒有,因為沒把ls的可執行文件和庫拷貝過來。cd和pwd是bash的內建命令,所以可以正常使用。

[root@c610 sysroot]# cp /bin/bash /mnt/sysroot/bin
[root@c610 sysroot]# ldd /bin/bash
        linux-vdso.so.1 =>  (0x00007ffeb5542000)
        libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00000030ab800000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00000030a9000000)
        libc.so.6 => /lib64/libc.so.6 (0x00000030a9400000)
        /lib64/ld-linux-x86-64.so.2 (0x000056492e521000)
[root@c610 sysroot]# cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64/
[root@c610 sysroot]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64/
[root@c610 sysroot]# cp /lib64/libc.so.6 /mnt/sysroot/lib64/
[root@c610 sysroot]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/
[root@c610 sysroot]# chroot /mnt/sysroot/
bash-4.1# ls
bash: ls: command not found
bash-4.1# cd /tmp
bash-4.1# pwd
/tmp
bash-4.1# exit
exit
[root@c610 sysroot]#

8,修改/boot/grub/grub.conf文件

由於內核啟動後,預設是啟動init程式,所以必須修改內核預設啟動的程式,修改成bash

而且還要指明參數:selinux=0,放在init參數前面

default=0
timeout=5
title CentOS 6 (test)
      root (hd0,0)
      kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/sda3 selinux=0 init=/bin/bash
      initrd /initramfs-2.6.32-754.el6.x86_64.img

9,拆下原來的/dev/sda,所以修好的磁碟就變成了/dev/sda,用修改的磁碟系統系統。

正常啟動了:

損壞情況2:/boot所在的分區里的內容,被誤刪除了,還好沒有關機,如何修複?

不用拆硬碟了,直接在當前系統,恢復就好了。修複方法和上面差不多。

使用光碟,進入救援模式

也可以修複上述的損壞情況1。

光碟救援模式的原理是,光碟里有能運行的bash程式,通過bash程式,調用grub-install命令就完成了修複grub,如果/boot里的內核文件也損壞了,光碟里也有內核,可以複製過去。但是如果ramdisk壞了,就不能修複了。ramdisk是按照操作系統時生成的,所以光碟里沒有。但可以在同一臺機器上再安裝一次,再生成一個ramdisk文件。

c/c++ 學習互助QQ群:877684253

本人微信:xiaoshitou5854


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一談到如何在.Net中進行對象映射,可能大部分同學都會脫口而出:“使用AutoMapper!”。 是的,AutoMapper 是一個非常成熟的對象映射器。截至到寫這篇文章,您能在Nuget上下載到的AutoMapper包的版本為:v9.0.0,而對應的 Github 的 star 已經高達7K。然後... ...
  • 通過前面的文章的學習,我們已經有實現了使用ABP提供的WebAPI方式+EasyUI來實現增刪改查的功能。之前我們把一些基本的信息已經完成了,如貨物信息,供應商信息。有了前面的基礎信息,我們可以實現入庫管理功能。從本章開始我們來學習一個入庫單功能,這個將會涉及DataGrid的主從功能。 一... ...
  • 本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/8109100.html,記錄一下學習過程以備後續查用。 一、引言 今天我們要講行為型設計模式的第八個模式--職責鏈模式。讓我們看看現實生活中某公司採購流程的例子吧,理解起來可能更容易。某公司的規章制度 規定,採 ...
  • 本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/8057654.html,記錄一下學習過程以備後續查用。 一、引言 今天我們要講行為型設計模式的第七個模式--策略模式。在現實生活中,策略模式的例子也非常常見,例如:在一個公司中,會有各種工作人員:有普 通員工、 ...
  • 本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/8032683.html,記錄一下學習過程以備後續查用。 一、引言 今天我們要講行為型設計模式的第六個模式--狀態模式。無論是現實世界,還是面向對象的OO世界,裡面都有一個東西,那就是對象。有對象當然就有 狀態了 ...
  • 抗疫時期,想到弄個微信程式用於社區出入和復工復產人員流動登記,老早就買的盛派的書和視頻,一直沒時間看,趁這個需求,下載盛派weixinDSK開始學習,先是打開盛派的網站陸續無法打開, 幫助文檔也沒能搶救性下載,估計是盛派在遷移啥東西。項目生成工具也不能用了 試著把GitHub上下載的sample部署 ...
  • 本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/7966240.html,記錄一下學習過程以備後續查用。 一、引言 今天我們要講行為型設計模式的第五個模式--中介者模式,先從名字上來看。中介者模式可以理解為在兩個或多個對象中間增加一個“中間對象”,由增加 的“ ...
  • SecureCRT的下載、安裝( 過程非常詳細!!值得查看) 簡單介紹下SecureCRT 一、SecureCRT的下載 二、SecureCRT的安裝 簡單介紹下SecureCRT SecureCRT是一款支持SSH(SSH1和SSH2)的終端模擬程式,簡單地說是Windows下登錄UNIX或Lin ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...