GRUB 2簡介
GRUB
GRUB是linux系統默認的引導加載程序。linux加載一個系統前,它必須有一個引導加載程序中特定指令(比如MBR記錄)去引導系統。這個程序一般是位於系統的主硬盤驅動器或其他介質驅動器上。
linux安裝程序允許用戶快速、方便地配置引導加載程序,將其存放在主硬盤驅動的主引導記錄中來引導操作系統。
GUN GRUB是一個將引導加載程序安裝到主引導記錄的程序,主引導記錄是位於一個硬盤開始的扇區。它允許位於主引導記錄區中特定的指令來加載一個GRUB菜單或是GRUB的命令環境。這使得用戶能夠開始操作系統的選擇,在內核引導時傳遞特定指令給內核,或是在內核引導前確定一些系統參數(如可以的RAM大小)
GRUB支持直接和鏈式加載的引導方法。GRUB能用戶幾乎所有操作系統、絕大多數流行的文件系統以及幾乎所有的系統BIOS所能識別的硬盤。
GRUB 2
GRUB 2是GRUB的升級版,它實現了以下一些GRUB中所不具備的功能
- 圖形接口
- 使用模塊機制,通過動態加載需要的模塊來擴展功能。
- 支持腳本語言,比如條件判斷、循環、變量和函數
- 支持救援模式,可以用於系統無法引導的情況。
- 國際化語言。包括支持非ASCII額字符集和類似gettext的消息分類、字體、圖形控制台等。
- 有一個靈活的命令行接口。如更不存在配置文件,GRUB 2會自動進入命令模式。
- 針對文件系統、文件、設備、驅動、終端、命令、分區表、系統加載的模塊化、層次化、基於對象的框架。
- 支持多種文件系統格式。
- 可以訪問以及安裝設備上的數據。
- 支持自動解壓。
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文件。
- /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 | 用戶自定義的配置 |
- /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
- 生成加密口令
[root@localhost ~]# grub2-mkpasswd-pbkdf2
- 編輯/etc/grub.d/00_header文件
- 生成GRUB 2配置文件
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
設置GRUB 2明文密碼
- 修改/etc/grub.d/00_header文件在文件末尾添加以下內容
cat << EOF set superusers="zhangsan" password zhangsan redhatlinux EOF
- 生成GRUB 2配置文件 使用以下命令生成GRUB 2配置文件/boot/grub2/grub.cfg
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
GRUB 2解鎖
- 重啟linux系統,按e鍵編輯啟動菜單項,此時提示輸入"Enter username",輸入上面加密的zhangsan用戶和密碼,解鎖成功。
- 才可以進入啟動菜單項的編輯界面。
GRUB 2配置案例
一.破解root用戶密碼
centos7
方法一:
- 在啟動linux系統時按e鍵開始編輯GRUB 2配置文件。
- 將"ro crashkernel=auto rhgb quiet"可讀屬性更改為可寫模式"rw crashkernel=auto rhgb quiet",並在其后加上"rd.break enforcing=0";按住Ctrl+x鍵進入命令行模式。
- 顯示命令行模式"switch_root:/#"
- 重新掛載文件系統
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
- 將"ro crashkernel=auto rhgb quiet"可讀屬性更改為可寫模式"rw crashkernel=auto rhgb quiet",並在其后加上"init=/bin/sh";按住Ctrl+x鍵進入命令行模式。(注意必須在quiet后空格且在同一行增加)
- 顯示命令行模式"sh-4.2#"
- 重新掛載文件系統
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
二. 修改網卡名稱
- 修改/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"
- 生成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
- 查看網卡名稱(先重啟再查看)
[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提示命令不存在,而又想使用該命令時
- 查看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命令即可
- 如果命令不存在
[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實用教程》人民郵電出版社出版發行 於岳編著