1、boot loader的两个stage
在BIOS读取完信息后,接下里就是到第一个开机装置的MBR去读取boot lodaer。
Linux将boot loader将程序代码执行与设定值加载分成两个阶段来执行(stage)
(1)stage1:执行boot loader主程序
第一阶段为执行boot loader的主程序,这个过程必须安装在开机区,即使MBR或者是boot sector 。但如前所述,因为 MBR 实在太小了,所以,MBR 或 boot sector 通常仅安装 boot loader 的最小主程序, 并没有安装 loader 的相关配置文件;
(2)Stage 2:主程序加载配置文件:
第二阶段为透过 boot loader 加载所有配置文件与相关的环境参数文件 (包括文件系统定义与主要配置文件
grub.cfg), 一般来说,配置文件都在 /boot 底下。
[root@study ~]# ls -l /boot/grub2
-rw-r--r--. device.map <==grub2 的装置对应文件(底下会谈到)
drwxr-xr-x. fonts <==开机过程中的画面会使用到的字型数据
-rw-r--r--. grub.cfg <==grub2 的主配置文件!相当重要!
-rw-r--r--. grubenv <==一些环境区块的符号
drwxr-xr-x. i386-pc <==针对一般 x86 PC 所需要的 grub2 的相关模块
drwxr-xr-x. locale <==就是语系相关的数据啰
drwxr-xr-x. themes <==一些开机主题画面数据
[root@study ~]# ls -l /boot/grub2/i386-pc
-rw-r--r--. acpi.mod <==电源管理有关的模块
-rw-r--r--. ata.mod <==磁盘有关的模块
-rw-r--r--. chain.mod <==进行 loader 控制权移交的相关模块
-rw-r--r--. command.lst <==一些指令相关性的列表
-rw-r--r--. efiemu32.o <==底下几个则是与 uefi BIOS 相关的模块
-rw-r--r--. efiemu64.o
-rw-r--r--. efiemu.mod
-rw-r--r--. ext2.mod <==EXT 文件系统家族相关模块
-rw-r--r--. fat.mod <==FAT 文件系统模块
-rw-r--r--. gcry_sha256.mod <==常见的加密模块
-rw-r--r--. gcry_sha512.mod
-rw-r--r--. iso9660.mod <==光盘文件系统模块
-rw-r--r--. lvm.mod <==LVM 文件系统模块
-rw-r--r--. mdraid09.mod <==软件磁盘阵列模块
-rw-r--r--. minix.mod <==MINIX 相关文件系统模块
-rw-r--r--. msdospart.mod <==一般 MBR 分区表
-rw-r--r--. part_gpt.mod <==GPT 分区表
-rw-r--r--. part_msdos.mod <==MBR 分区表
-rw-r--r--. scsi.mod <==SCSI 相关模块
-rw-r--r--. usb_keyboard.mod <==底下两个为 USB 相关模块
-rw-r--r--. usb.mod
-rw-r--r--. vga.mod <==VGA 显示适配器相关模块
-rw-r--r--. xfs.mod <==XFS 文件系统模块
2、grub2 的配置文件 /boot/grub2/grub.cfg 初探
grub2 的优点:
· 认识与支持较多的文件系统,并且可以使用 grub2 的主程序直接在文件系统中搜寻核心档名;
· 开机的时候,可以『自行编辑与修改开机设定项目』,类似 bash 的指令模式;
· 可以动态搜寻配置文件,而不需要在修改配置文件后重新安装 grub2 。亦即是我们只要修改完/boot/grub2/grub.cfg 里头的设定后,下次开机就生效了!
<1>磁盘与分区槽在 grub2 中的代号
安装在 MBR 的 grub2 主程序,最重要的任务之一就是从磁盘当中加载核心文件, 以让核心能够顺利的驱动整个系统的硬件。所以啰, grub2 必须要认识硬盘才行啊!那么 grub2 到底是如何认识硬盘的呢?grub2 对硬盘的代号设定与传统的 Linux 磁盘代号可完全是不同的!grub2 对硬盘的识别使用的是如下的代号:
(hd0,1) # 一般的默认语法,由 grub2 自动判断分区格式
(hd0,msdos1) # 此磁盘的分区为传统的 MBR 模式
(hd0,gpt1) # 此磁盘的分区为 GPT 模式
注意:
· 硬盘代号以小括号 ( ) 包起来;
· 硬盘以 hd 表示,后面会接一组数字;
· 以『搜寻顺序』做为硬盘的编号!(这个重要!)
· 第一个搜寻到的硬盘为 0 号,第二个为 1 号,以此类推;
· 每颗硬盘的第一个 partition 代号为 1 ,依序类推。
所以说,第一颗『搜寻到的硬盘』代号为:『(hd0)』,而该颗硬盘的第一号分区槽为『(hd0,1)』,这样说了解了吧? 另外,为了区分不同的分区格式,因此磁盘后面的分区号码可以使用类似 msdos1 与gpt1 的方式来调整! 最终要记得的是,磁盘的号码是由 0 开始编号,分区槽的号码则与 Linux 一样,是由 1 号开始编号!两者不同
硬盘搜寻顺序 | 在 Grub2 当中的代号 |
---|---|
第一颗(MBR) | (hd0) (hd0,msdos1) (hd0,msdos2) (hd0,msdos3).... |
第二颗(GPT) | (hd1) (hd1,gpt1) (hd1,gpt2) (hd1,gpt3).... |
第三颗 (hd2) | (hd2,1) (hd2,2) (hd2,3).... |
3、grub2 配置文件维护 /etc/default/grub 与 /etc/grub.d
前一个小节我们谈到的是 grub2 的主配置文件 grub.cfg 约略的内容,但是因为该文件的内容太过复
杂,数据量非常庞大,grub2 官方说明不建议我们手动修改! 而是应该要透过 /etc/default/grub 这个
主要环境配置文件与 /etc/grub.d/ 目录内的相关配置文件来处理比较妥当! 我们先来聊聊
/etc/default/grub 这个主要环境配置文件好了!
<1>/etc/default/grub 主要环境配置文件
[root@study ~]# cat /etc/default/grub
GRUB_TIMEOUT=5 # 指定预设倒数读秒的秒数
GRUB_DEFAULT=saved # 指定预设由哪一个选单来开机,预设开机选单之意
GRUB_DISABLE_SUBMENU=true # 是否要隐藏次选单,通常是藏起来的好!
GRUB_TERMINAL_OUTPUT="console" # 指定数据输出的终端机格式,默认是透过文字终端机
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap crashkernel=auto rhgb quiet"
# 就是在 menuentry 括号内的 linux16 项目后续的核心参数
GRUB_DISABLE_RECOVERY="true" # 取消救援选单的制作
o 倒数时间参数: GRUB_TIMEOUT
这个设定值相当简单,后面就是接你要倒数的秒数即可~例如要等待 30 秒,就在这边改成『GRUB_TIMEOUT=30』即可!如果不想等待则输入 0 , 如果一定要使用者选择,则填 -1 即可!
o 是否隐藏选单项目:GRUB_TIMEOUT_STYLE
这个项目可选择的设定值有 menu, countdown, hidden 等等。如果没有设定,预设是 menu 的意思。这个项目主要是在设定要不要显示选单! 如果你不想要让使用者看到选单,这里可以设定为countdown!那 countdown 与 hidden 有啥差异呢?countdown 会在屏幕上显示剩余的等待秒数,而 hidden 则空空如也~除非你有特定的需求,否则这里一般鸟哥建议设定为 menu 较佳啦!
o 讯息输出的终端机模式:GRUB_TERMINAL_OUTPUT
这个项目是指定输出的画面应该使用哪一个终端机来显示的意思,主要的设定值有『 console, serial, gfxterm, vga_text 』等等。 除非有特别的需求,否则一般使用 console 即可!
o 默认开机选单项目:GRUB_DEFAULT
这个项目在指定要用哪一个选单 (menuentry) 来作为默认开机项目的意思。能使用的设定值包括有『 saved, 数字, title 名, ID 名』等等。 假设你有三笔 menuentry 的项目大约像这样:
menuentry '1st linux system' --id 1st-linux-system { ...}
menuentry '2nd linux system' --id 2nd-linux-system { ...}
menuentry '3rd win system' --id 3rd-win-system { ...}
几个常见的设定值是这样的:
[root@study ~]#
GRUB_DEFAULT=1
代表使用第二个 menuentry 开机,因为数字的编号是以 0 号开始编的!
GRUB_DEFAULT=3rd-win-system
代表使用第三个 menuentry 开机,因为里头代表的是 ID 的项目!它会找到 --id 喔!
GRUB_DEFAULT=saved
代表使用 grub2-set-default 来设定哪一个 menuentry 为默认值的意思。通常预设为 0
一般来说,预设就是以第一个开机选单来作为默认项目,如果想要有不同的选单设定,可以在这个项目填选所需要的 --id 即可。
o 核心的外加参数功能:GRUB_CMDLINE_LINUX
如果你的核心在启动的时候还需要加入额外的参数,就在这里加入吧!举例来说,如果你除了预
设的核心参数之外,还需要让你的磁盘读写机制为 deadline 这个机制时, 可以这样处理:
GRUB_CMDLINE_LINUX="..... crashkernel=auto rhgb quiet elevator=deadline"
假设你需要 (1)开机选单等待 40 秒钟、 (2)预设用第一个选单开机、 (3)选单请显示出来不要隐藏、 (4)核心外带
『elevator=deadline』的参数值, 那应该要如何处理 grub.cfg 呢?
答:直接编辑主要环境配置文件后,再以 grub2-mkconfig 来重建 grub.cfg 喔!
# 1. 先编辑主要环境配置文件:
[root@study ~]# vim /etc/default/grub
GRUB_TIMEOUT=40
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=menu
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap crashkernel=auto rhgb
quiet elevator=deadline"
GRUB_DISABLE_RECOVERY="true"
# 2. 开始重新建置 grub.cfg !
[root@study ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-229.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-229.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-309eb890d09f440681f596543d95ec7a
Found initrd image: /boot/initramfs-0-rescue-309eb890d09f440681f596543d95ec7a.img
done
# 3. 检查看看 grub.cfg 的内容是否真的是改变了?
[root@study ~]# grep timeout /boot/grub2/grub.cfg
set timeout_style=menu
set timeout=40
[root@study ~]# grep default /boot/grub2/grub.cfg
set default="0"
[root@study ~]# grep linux16 /boot/grub2/grub.cfg
linux16 /vmlinuz-3.10.0-229.el7.x86_64 root=/dev/.... elevator=deadline
linux16 /vmlinuz-0-rescue-309eb890d09f440681f5965.... elevator=deadline
<1>选单建置的脚本/etc/grub.d/*
gurb2-mkconfig执行后,屏幕会通过分析/etc/grub.d里面的文件,然后执行该文件的建置/grub.cfg,由此找到对应的核心版本
/etc/grub.d目录下主要文件有:
· 00_header:主要在建立初始的显示项目,包括需要加载的模块分析、屏幕终端机的格式、倒数秒数、选单是否需要隐藏等等,大部分在 /etc/default/grub 里面所设定的变量,大概都会在这个脚本当中被利用来重建grub.cfg 。
· 10_linux:根据分析 /boot 底下的文件,尝试找到正确的 linux 核心与读取这个核心需要的文件系统模块与参数等,都在这个脚本运作后找到并设定到 grub.cfg 当中。 因为这个脚本会将所有在 /boot 底下的每一个核心文件都对应到一个选单,因此核心文件数量越多,你的开机选单项目就越多了。 如果未来你不想要旧的核心出现在选单上,那可以透过移除旧核心来处理即可。
· 30_os-prober:这个脚本默认会到系统上找其他的 partition 里面可能含有的操作系统,然后将该操作系统做成选单来处理就是了。如果你不想要让其他的操作系统被侦测到并拿来开机,那可以在 /etc/default/grub 里面加上『 GRUB_DISABLE_OS_PROBER=true 』取消这个文件的运作。
· 40_custom:如果你还有其他想要自己手动加上去的选单项目,或者是其他的需求,那么建议在这里补充即可!
所以,一般来说,我们会更动到的就是仅有 40_custom 这个文件即可。那这个文件内容也大多在放
置管理员自己想要加进来的选单项目就是了。 好了,那问题来了,我们知道 menuentry 就是一个选单,那后续的项目有哪些东西呢?简单的说,就是这个 menuentry 有几种常见的设定? 亦即是menuentry 的功能啦!常见的有这几样:直接指定核心开机
基本上如果是 Linux 的核心要直接被用来开机,那么你应该要透过 grub2-mkconfig 去抓10_linux 这个脚本直接制作即可,因此这个部份你不太需要记忆! 因为在 grub.cfg 当中就已经是系统能够捉到的正确的核心开机选单了!不过如果你有比较特别的参数需要进行呢?这时候你可以这样作:
(1)先到 grub.cfg 当中取得你要制作的那个核心的选单项目,然后将它复制到40_custom 当中
(2)再到 40_custom 当中依据你的需求修改即可。
例:如果你想要使用第一个原有的 menuentry 取出来后,增加一个选单,该选单可以强制 systemd 使用
graphical.target 来启动 Linux 系统, 让该选单一定可以使用图形界面而不用理会 default.target 的连结,该如
何设计?
答:当核心外带参数中,有个『 systemd.unit=??? 』的外带参数可以指定特定的 target 开机!因此我们先到 grub.cfg
当中,去复制第一个 menuentry , 然后进行如下的设定:
[root@study ~]# vim /etc/grub.d/40_custom
menuentry 'My graphical CentOS, with Linux 3.10.0-229.el7.x86_64' --class rhel fedora
--class gnu-linux --class gnu --class os --unrestricted --id 'mygraphical' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod xfs
set root='hd0,gpt2'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint='hd0,gpt2' 94ac5f77-cb8a-495e-a65b-...
else
search --no-floppy --fs-uuid --set=root 94ac5f77-cb8a-495e-a65b-2ef7442b837c
fi
linux16 /vmlinuz-3.10.0-229.el7.x86_64 root=/dev/mapper/centos-root ro rd.lvm.lv=
centos/root rd.lvm.lv=centos/swap crashkernel=auto rhgb quiet
elevator=deadline systemd.unit=graphical.target
initrd16 /initramfs-3.10.0-229.el7.x86_64.img
}
# 请注意,上面的资料都是从 grub.cfg 里面复制过来的,增加的项目仅有特殊字体的部份而已!
# 同时考虑画面宽度,该项目稍微被变动过,请依据您的环境来设定喔!
[root@study ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
当你再次 reboot 时,系统就会多出一个选单给你选择了!而且选择该选单之后,你的系统就可以直接进入图形界面 (如果有安装相关的 X window 软件时), 而不必考虑 default.target
o 透过 chainloader 的方式移交 loader 控制权
所谓的 chain loader (开机管理程序的链结) 仅是在将控制权交给下一个 boot loader 而已, 所以grub2 并不需要认识与找出 kernel 的檔名 ,『 他只是将 boot 的控制权交给下一个 boot sector 或MBR 内的 boot loader 而已 』 所以通常他也不需要去查验下一个 boot loader 的文件系统!一般来说, chain loader 的设定只要两个就够了,一个是预计要前往的 boot sector 所在的分区槽代号, 另一个则是设定 chainloader 在那个分区槽的 boot sector (第一个扇区) 上!假设我的Windows 分区槽在 /dev/sda1 ,且我又只有一颗硬盘,那么要 grub 将控制权交给 windows 的loader 只要这样就够了:
menuentry "Windows" {
insmod chain # 你得要先加载 chainloader 的模块对吧?
insmod ntfs # 建议加入 windows 所在的文件系统模块较佳!
set root=(hd0,1) # 是在哪一个分区槽~最重要的项目!
chainloader +1 # 请去 boot sector 将 loader 软件读出来的意思!
}
透过这个项目我们就可以让 grub2 交出控制权了!
例:假设你的测试系统上面使用 MBR 分区槽,并且出现如下的数据:
[root@study ~]# fdisk -l /dev/vda
Device Boot Start End Blocks Id System
/dev/vda1 2048 10487807 5242880 83 Linux
/dev/vda2 * 10487808 178259967 83886080 7 HPFS/NTFS/exFAT
/dev/vda3 178259968 241174527 31457280 83 Linux
其中 /dev/vda2 使用是 windows 7 的操作系统。现在我需要增加两个开机选项,一个是取得 windows 7 的开
机选单,一个是回到 MBR 的预设环境,应该如何处理呢?
答:windows 7 在 /dev/vda2 亦即是 hd0,msdos2 这个地方,而 MBR 则是 hd0 ,不需要加上分区槽,因此整个设定会变这样:
[root@study ~]# vim /etc/grub.d/40_custom
menuentry 'Go to Windows 7' --id 'win7' {
insmod chain
insmod ntfs
set root=(hd0,msdos2)
chainloader +1
}
menuentry 'Go to MBR' --id 'mbr' {
insmod chain
set root=(hd0)
chainloader +1
}
[root@study ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
另外 , 如 果 每 次 都 想 要 让 windows 变 成 默 认 的 开 机 选 项 , 那 么 在 /etc/default/grub 当 中 设 定 好『 GRUB_DEFAULT=win7 』 然后再次 grub2-mkconfig 这样即可啦!不要去算 menuentry 的顺序喔!透过 --id 内容来处理
4、initramfs的重要性与建立新的initramfs文件
initramfs的目的在于提供开机过程中所需要的最重要的核心模块,以让系统开机过程可以顺利进行。会需要initramfs 的原因,是因为核心模块放置于 /lib/modules/$(uname -r)/kernel/ 当中, 这些模块必须要根目录 (/) 被挂载时才能够被读取。但是如果核心本身不具备磁盘的驱动程序时, 当然无法挂载根目录,也就没有办法取得驱动程序,因此造成两难的地步。initramfs 可以将 /lib/modules/.... 内的『开机过程当中一定需要的模块』包成一个文件 (档名就是initramfs), 然后在开机时透过主机的 INT 13 硬件功能将该文件读出来解压缩,并且 initramfs 在内存内会仿真成为根目录, 由于此虚拟文件系统 (Initial RAM Disk) 主要包含磁盘与文件系统的模块,因此我们的核心最后就能够认识实际的磁盘,那就能够进行实际根目录的挂载啦!所以说:『initramfs 内所包含的模块大多是与开机过程有关,而主要以文件系统及硬盘模块 (如 usb, SCSI 等) 为主』的
一般来说,需要 initramfs 的时刻为:
· 根目录所在磁盘为 SATA、USB 或 SCSI 等连接接口;
· 根目录所在文件系统为 LVM, RAID 等特殊格式;
· 根目录所在文件系统为非传统 Linux 认识的文件系统时;
· 其他必须要在核心加载时提供的模块。
[root@study ~]# dracut [-fv] [--add-drivers 列表] initramfs 檔名 核心版本
选项与参数:
-f :强迫编译出 initramfs ,如果 initramfs 文件已经存在,则覆盖掉旧文件
-f :显示 dracut 的运作过程
--add-drivers 列表:在原本的默认核心模块中,增加某些你想要的模块!模块位于核心所在目录
/lib/modules/$(uname -r)/kernel/*
initramfs 檔名 :就是你需要的檔名!开头最好就是 initramfs,后面接版本与功能
核心版本 :预设当然是目前运作中的核心版本,不过你也可以手动输入其他不同版本!
其实 dracut 还有很多功能,例如底下的几个参数也可以参考看看:
--modules :将 dracut 所提供的开机所需模块 (核心核模块) 加载,可用模块在底下的目录内
/usr/lib/dracut/modules.d/
--gzip|--bzip2|--xz:尝试使用哪一种压缩方式来进行 initramfs 压缩。预设使用 gzip 喔!
--filesystems :加入某些额外的文件系统支持!
范例一:以 dracut 的默认功能建立一个 initramfs 虚拟磁盘文件
[root@study ~]# dracut -v initramfs-test.img $(uname -r)
Executing: /sbin/dracut -v initramfs-test.img 3.10.0-229.el7.x86_64
*** Including module: bash *** # 先加载 dracut 本身的模块支持
*** Including module: nss-softokn ***
*** Including modules done ***
.....(中间省略)..... # 底下两行在处理核心模块
*** Installing kernel module dependencies and firmware ***
*** Installing kernel module dependencies and firmware done ***
.....(中间省略).....
*** Generating early-microcode cpio image *** # 建立微指令集
*** Constructing GenuineIntel.bin ****
*** Store current command line parameters ***
*** Creating image file *** # 开始建立 initramfs 啰!
*** Creating image file done ***
范例二:额外加入 e1000e 网卡驱动与 ext4/nfs 文件系统在新的 initramfs 内
[root@study ~]# dracut -v --add-drivers "e1000e" --filesystems "ext4 nfs" \
> initramfs-new.img $(uname -r)
[root@study ~]# lsinitrd initramfs-new.img | grep -E '(e1000|ext4|nfs)'
usr/lib/modules/3.10.0-229.el7.x86_64/kernel/drivers/net/ethernet/intel/e1000e
usr/lib/modules/3.10.0-229.el7.x86_64/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko
usr/lib/modules/3.10.0-229.el7.x86_64/kernel/fs/ext4
usr/lib/modules/3.10.0-229.el7.x86_64/kernel/fs/ext4/ext4.ko
usr/lib/modules/3.10.0-229.el7.x86_64/kernel/fs/nfs
usr/lib/modules/3.10.0-229.el7.x86_64/kernel/fs/nfs/nfs.ko
5、测试与安装grub2
[root@study ~]# grub2-install --skip-fs-probe /dev/vda4
Installing for i386-pc platform.
grub2-install: warning: File system ‘xfs’ doesn't support embedding.
grub2-install: warning: Embedding is not possible. GRUB can only be installed in this
setup by using blocklists. However, blocklists are UNRELIABLE and their use is
discouraged..
grub2-install: error: will not proceed with blocklists.
# 还是失败!因为还是担心 xfs 被搞死~好!没问题!加个 --force 与 --recheck 重新处理一遍!
[root@study ~]# grub2-install --force --recheck --skip-fs-probe /dev/vda4
Installing for i386-pc platform.
grub2-install: warning: File system ‘xfs’ doesn't support embedding.
grub2-install: warning: Embedding is not possible. GRUB can only be installed in this
setup by using blocklists. However, blocklists are UNRELIABLE and their use is
discouraged..
Installation finished. No error reported.
# 注意看!原本是无法安装的错误,现在仅有 warning 警告讯息,所以这样就安装到 partition 上了!
(1) 如果是从其他 boot loader 转成 grub2 时,得先使用 grub2-install 安装 grub2 配置文件;
(2) 承上,如果安装到 partition 时,可能需要加上额外的许多参数才能够顺利安装上去!
(3) 开始编辑 /etc/default/grub 及 /etc/grub.d/* 这几个重要的配置文件;
(4) 使用 grub2-mkconfig -o /boot/grub2/grub.cfg 来建立开机的配置文件!
6、开机前的额外功能修改
在正在进行开机时,按下任意键就可以使用grub2的在线编修功能了。
由于预设选单就没有隐藏,因此你会直接看到这 2个选单而已,同时会有读秒的咚咚在倒数。 选单部分的画面其实就是 menuentry 后面的文字啦!如果你点选了『Goto MBR』与『Goto /dev/vda4』时,怪了!怎么发现到选单又重新回来
这是因为这两个 Goto 的选单都是重新读取主配置文件,而 MBR 与 /dev/vda4 配置文件的读取都是来自 (/dev/vda2)/boot/grub2/grub.cfg 的缘故!因此这个画面就会重复出现,另外,如果你再仔细看的话,会发现到上图中底部还有一些细部的选项,似乎有个 'e' edit 的样子! grub2 支持在线编修指令喔!这是个很有用的功能!假如刚刚你将 grub.cfg 的内容写错了,导致出现无法开机的问题时, 我们可以查阅该 menuentry 选单的内容并加以修改喔!举例来说,我想要知道第一个选单的实际内容时,将反白光棒移动到第一个选单, 再按下 'e' 会进入如下画面:
7、关于开机画面与终端画面的图形显示方式
使用中文显示画面
#先改重要的配置文件
[root@study ~]# vim /etc/default/grub
.....(前面省略).....
GRUB_TERMINAL=gfxterm # 设定主要的终端机显示为图形界面!
GRUB_GFXMODE=1024x768x24 # 图形界面的 X, Y, 彩度资料
GRUB_GFXPAYLOAD_LINUX=keep # 保留图形界面,不要使用 text 喔!
# 重新建立配置文件
[root@study ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
8、欠:为个别选单加上密码
P872-876 如果有需要的时候进行学习