linux日常運維(三) GRUB 2的維護


GRUB 2簡介
GRUB

GRUB是linux系統默認的引導加載程序。linux加載一個系統前,它必須有一個引導加載程序中特定指令(比如MBR記錄)去引導系統。這個程序一般是位於系統的主硬盤驅動器或其他介質驅動器上。

linux安裝程序允許用戶快速、方便地配置引導加載程序,將其存放在主硬盤驅動的主引導記錄中來引導操作系統。

GUN GRUB是一個將引導加載程序安裝到主引導記錄的程序,主引導記錄是位於一個硬盤開始的扇區。它允許位於主引導記錄區中特定的指令來加載一個GRUB菜單或是GRUB的命令環境。這使得用戶能夠開始操作系統的選擇,在內核引導時傳遞特定指令給內核,或是在內核引導前確定一些系統參數(如可以的RAM大小)

GRUB支持直接和鏈式加載的引導方法。GRUB能用戶幾乎所有操作系統、絕大多數流行的文件系統以及幾乎所有的系統BIOS所能識別的硬盤。

GRUB 2

GRUB 2是GRUB的升級版,它實現了以下一些GRUB中所不具備的功能

  1. 圖形接口
  2. 使用模塊機制,通過動態加載需要的模塊來擴展功能。
  3. 支持腳本語言,比如條件判斷、循環、變量和函數
  4. 支持救援模式,可以用於系統無法引導的情況。
  5. 國際化語言。包括支持非ASCII額字符集和類似gettext的消息分類、字體、圖形控制台等。
  6. 有一個靈活的命令行接口。如更不存在配置文件,GRUB 2會自動進入命令模式。
  7. 針對文件系統、文件、設備、驅動、終端、命令、分區表、系統加載的模塊化、層次化、基於對象的框架。
  8. 支持多種文件系統格式。
  9. 可以訪問以及安裝設備上的數據。
  10. 支持自動解壓。

GRUB 2中設備和分區命名規則

GRUB 2同樣以fd表示軟盤,hd表示硬盤(包括IDE和SCSI硬盤)設備是從0開始編號、分區則是從1開始,主分區為1~4,邏輯驅動器從5開始。下面介紹設備和分區的使用方法:

  • (fd0):表示第一個軟盤
  • (hd0):表示第一個硬盤(大多數U盤與USB接口的移動硬盤以及SD卡也都被當作硬盤看待)
  • (hd0,msdos1):表示第一個硬盤的第一個分區
  • (hd0,msdos1)/boot/vmlinuz-3.10.0-327.e17.x86_64:表示第一個硬盤的第一個分區下的boot目錄下的vmlinuz-3.10.0-327.e17.x86_64文件
  • (hd1,msdos1):表示第二硬盤的第一個分區
  • (cd):啟動光盤(僅在從光盤啟動GRUB時可用)
  • (cd0):第一個光盤
GRUB 2主配置文件
  • /boot/grub2/grub.cfg文件(/etc/grub2.cfg文件是/boot/grub2/grub.cfg文件的軟鏈接)
  • /etc/grub.d目錄
  • /etc/default/grub文件(/etc/sysconfig/grub文件是/etc/default/grub文件的軟鏈接)

它們之間的關系是:/bot/grub2/grub.cfg文件里面通過"####BEGIN####"這種格式安裝順序調用/etc/grub.d目錄中的腳本實現不同的功能。/etc/grub.d目錄中有很多數字開頭的腳本,按照從小到大的順序執行。以00_header為例,它又會調用/etc/default/grub配置文件來實現最基本的開機界面配置。

比如在/boot/grub2/grub.cfg文件里面調用/etc/grub.d/10_linux來配置不同的內核,這里面有兩個menuentry(菜單項),所以開機的時候會看見兩個默認選項,一個是普通模式,一個是救援模式。

需要注意的是,最好不要直接去修改/boot/grub2/grub.cfg文件,這個是因為后期升級內核,所有 的配置都會失效。如更需要自定義這個文件,可以修改/etc/grub.d目錄中對應的腳本或者/etc/default/grub文件,然后通過使用grub2-mkconfig命令重新生成/boot/grub22/grub.cfg文件。

  1. /etc/grub.d目錄

定義每個菜單項的所有腳本都存放在/etc/grub.d目錄中,這些腳本的名稱必須有兩位的數字前綴,其目的是構建GRUB 2菜單時定義腳本的執行順序以及相應菜單項的順序,比如00_header文件首先被讀取。

在使用grub2-mkconfig命令生成配置文件時,需要加載/etc/grub.d目錄。該文件描述如下

文件 描述
00_header 設置grub默認參數
10_linux 系統中存在多個linux版本
20_ppc_terminfo 設置tty控制台
30_os_prober 設置其他分區中的系統(硬盤中有多個操作系統時設置)
40_custom和41_custom 用戶自定義的配置
  1. /etc/default/grub是一個文本文件,可以在該文件中設置通用配置變量和GRUB2菜單的其他特性。在更改/etc/default/grub文件后,需要使用grub2-mkconfig命令更新GRUR2配置文件才能使更改生效。

/etc/sysconfig/grub文件是根據/etc/default/grub文件生成的軟鏈接文件,兩者文件內容是一樣的。

[root@localhost ~]# ls -l /etc/sysconfig/grub lrwxrwxrwx. 1 root root 15 Jun 9 14:17 /etc/sysconfig/grub -> ../default/grub [root@localhost ~]# cat /etc/default/grub GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet" GRUB_DISABLE_RECOVERY="true" 

(一)GRUB_TIMEOUT=5 該參數用於設置進入默認啟動項的等待實際,默認值5秒。可以設置為-1,這樣就無限等待。

(二)GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" 該參數由GRUB 的發布者設置它們的標識名。這用於產生更具信息量的菜單項名稱。

(三)GRUB_DEFAULT=saved 該參數用於設置默認啟動項。比如要默認從第1個菜單項啟動設置為0;要默認從第2個菜單項啟動,設置為1;如果設置為saved,則默認為上次啟動項。

(四)GRUB_TERMINAL_OUTPUT="console" 該參數用於選擇終端輸出設備。在這可能可以選擇多個設備,以空格分開。有效的終端輸出名依賴於平台,不過可能包括console(PC BIOS及EFI控制台)、serial(串行終端)、gfxterm(圖形模式輸出)、ofconsole(開放固件控制台)或vga_text(VGA文本輸出,主要用在Coreboot)

(五)GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet" 該參數用於手動添加內核啟動參數。

(六)GRUB_DISABLE_RECOVERY="true" 該參數用於設置是否啟用修復模式。

(七)GRUB_DISABLE_LINUX_RECOVERY="true" 該參數用於設置是否創建修復模式菜單項。

(八)GRUB_HIDDEN_TIMEOUT=0 該參數不顯示菜單,但會顯示空白界面,設置實際內按任意鍵出現菜單。

(九)GRUB_HIDDEN_TIMEOUT_QUIET=true 該參數用於顯示空白界面時是否不出現倒計時。

(十)GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" 該參數用於添加默認內核啟動參數

(十一)GRUB_TERMINAL=console 該參數用於設置使用終端還是圖形界面來引導。

(十二)GRUB_GFXMODE=640x480 該參數用於設置圖形界面分辨率。只能使用顯卡支持的分辨率,具體可以在grub模式下輸入vbeinfo查看。

(十三)GRUB_DISABLE_LINUX_UUID=true 該參數用於設置是否使用UUID引導,即使用root=/dev/sdax h還是root=UUDI=XXX

(十四)GRUB_INIT_TUNE="480 440 1" 該參數用於在GRUB啟動時,調整揚聲器的音量。

設置GRUB 2加密

由於GRUB 2負責引導linux系統,其作為系統中的第一道屏障的安全性非常重要,對GRUB 2進行加密可以實現安全性。

在默認情況下,GRUB 2對所有可以在物理上進入控制台的人都是可訪問的。任何人都可以選擇並編輯任意菜單項,並且可以直接訪問GRUB命令行。要啟用認真支持,必須將環境變量超級用戶設置為一組用戶名(可以使用空格、逗號、分號作為分隔符)這樣就只允許超級用戶使用GRUB命令行、編輯菜單項以及執行任意菜單項。

GRUB 2密碼支持以下兩種格式

  • 明文密碼:密碼數據沒有經過加密,安全性差
  • PBKDF2加密密碼:密碼經過PBKDF2哈希算法進行加密,在文件中存儲的是加密后的密碼數據,安全性較高。
設置GRUB 2PBKDF2加密口令

先要使用grub2-mkpasswd-pbkdf2命令生成PBKDF2加密口令,然后在/etc/grub.d/00_header文件中添加超級用戶和PBKDF2加密口令,最后使用grub2-mkconfig命令生成grub配置文件。

在/etc/grub.d/00_header文件中添加用戶和PBKDF2加密口令的格式如下。

cat << EOF set superusers="用戶" password_pbkdf2 用戶 加密密碼 EOF 
  1. 生成加密口令
[root@localhost ~]# grub2-mkpasswd-pbkdf2 
  1. 編輯/etc/grub.d/00_header文件
  2. 生成GRUB 2配置文件
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg 
設置GRUB 2明文密碼
  1. 修改/etc/grub.d/00_header文件在文件末尾添加以下內容
cat << EOF set superusers="zhangsan" password zhangsan redhatlinux EOF 
  1. 生成GRUB 2配置文件 使用以下命令生成GRUB 2配置文件/boot/grub2/grub.cfg
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg 
GRUB 2解鎖
  1. 重啟linux系統,按e鍵編輯啟動菜單項,此時提示輸入"Enter username",輸入上面加密的zhangsan用戶和密碼,解鎖成功。
  2. 才可以進入啟動菜單項的編輯界面。
GRUB 2配置案例

一.破解root用戶密碼

centos7

方法一:

  1. 在啟動linux系統時按e鍵開始編輯GRUB 2配置文件。
  2. 將"ro crashkernel=auto rhgb quiet"可讀屬性更改為可寫模式"rw crashkernel=auto rhgb quiet",並在其后加上"rd.break enforcing=0";按住Ctrl+x鍵進入命令行模式。
  3. 顯示命令行模式"switch_root:/#"
  4. 重新掛載文件系統
switch_root:/# mount -o remount, rw /sysroot 

改變根目錄

switch_root:/# chroot /sysroot 

會發現命令提示符變成

sh-4.2# 

就可以使用命令更改root密碼了

sh-4.2# passwd 

按提示輸入兩遍,提示

passwd:all authentication tokens updated successfully. 

說明root密碼已經更改成功。 為了使selinux生效,必須執行/.autorelabel命令

sh-4.2# /.autorelabel 

最后重啟即可。

sh-4.2# exec /sbin/reboot 

方法二

  1. 同上1
  2. 將"ro crashkernel=auto rhgb quiet"可讀屬性更改為可寫模式"rw crashkernel=auto rhgb quiet",並在其后加上"init=/bin/sh";按住Ctrl+x鍵進入命令行模式。(注意必須在quiet后空格且在同一行增加)
  3. 顯示命令行模式"sh-4.2#"
  4. 重新掛載文件系統
sh-4.2# mount -o remount, rw / 

更改root密碼

sh-4.2# passwd root sh-4.2# touch /.autorelabel 

按提示輸入兩遍密碼,提示成功。為了使selinux生效,必須執行touch /.autorelabel命令,輸入exec /sbin/init或者exec /sbin/reboot重啟即可。

sh-4.2# exec /sbin/init 

二. 修改網卡名稱

  1. 修改/etc/default/grub文件,在GRUB_CMDLINE_LINUX中添加net.ifnames=0 biosdevname=0。如下圖
[root@localhost ~]# vi /etc/default/grub [root@localhost ~]# cat /etc/default/grub GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet net.ifnames=0 biosdevname=0" GRUB_DISABLE_RECOVERY="true" 
  1. 生成GRUB 2配置文件
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-3.10.0-957.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-957.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-7ad525c9157940e3847220b1bdb8be06 Found initrd image: /boot/initramfs-0-rescue-7ad525c9157940e3847220b1bdb8be06.img 
  1. 查看網卡名稱(先重啟再查看)
[root@localhost ~]# ip addr list 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:11:59:7c brd ff:ff:ff:ff:ff:ff inet 192.168.64.148/24 brd 192.168.64.255 scope global noprefixroute dynamic eth0 valid_lft 1599sec preferred_lft 1599sec inet6 fe80::93e0:500f:62fc:c2a0/64 scope link noprefixroute valid_lft forever preferred_lft forever 

centos7 運行ifconfig提示命令不存在,而又想使用該命令時

  1. 查看ifconfig命令是否存在 說明命令存在
[root@localhost ~]# ls /sbin/ifconfig /sbin/ifconfig 

如果ifconfig命令存在,查看環境變量設置

[root@localhost ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/sbin 

如果環境變量中沒有包含ifconfig命令的路徑 臨時修改環境變量:在shell中輸入

[root@localhost ~]# $export PATH=$PATH:/sbin 

然后再輸入ifconfig命令即可,但是這只是臨時更改了shell中的PATH,如果關閉shell,則修改消失,下次還需要重復如上操作

永久修改PATH變量使之包含/sbin路徑:

打開/etc/profile文件,在其中輸入export PATH=$PATH:/sbin,保存並重啟即可,這樣一來,PATH路徑永久修改成功,以后任何時候只輸入ifconfig命令即可

  1. 如果命令不存在
[root@localhost ~]# ifconfig -bash: /usr/sbin/ifconfig: No such file or directory [root@localhost ~]# yum install net-tools [root@localhost ~]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.64.148 netmask 255.255.255.0 broadcast 192.168.64.255 inet6 fe80::93e0:500f:62fc:c2a0 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:11:59:7c txqueuelen 1000 (Ethernet) RX packets 87945 bytes 127182988 (121.2 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8930 bytes 1058671 (1.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 

摘自:《Linux實用教程》人民郵電出版社出版發行 於岳編著


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM