boot loader 具有菜单功能、直接加载核心文件以及控制权移交的功能等,系统必须要有boot loader才有办法加载该操作系统的核心
CentOS 7.x 将grub换成了grub2
grub2 的优点:
- 认识与支持较多的文件系统,并且可以使用 grub2 的主程序直接在文件系统中搜寻核心文件名;
- 启动的时候,可以『自行编辑与修改启动配置项目』,类似 bash 的指令模式;
- 可以动态搜寻配置文件,而不需要在修改配置文件后重新安装 grub2 。
Linux 将 boot loader 的程序代码执行与配置值加载分成两个阶段 (stage) 来执行:
- Stage 1:执行 boot loader 主程序:
第一阶段为执行 boot loader 的主程序,这个主程序必须要被安装在启动区,亦即是 MBR 或者是 boot sector 。因为 MBR 实在太小了,所以,MBR 或 boot sector 通常仅安装 boot loader 的最小主程序,并没有安装 loader 的相关配置文件; - Stage 2:主程序加载配置文件:
第二阶段为通过 boot loader 加载所有配置文件与相关的环境参数文件 (包括文件系统定义与主要配置文件 grub.cfg), 一般来说,配置文件都在 /boot 下面。
有关的文件都放置到 /boot/grub2 中
# 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 文件系统模块
grub2 的配置文件 /boot/grub2/grub.cfg
磁盘与分区在 grub2 中的代号:
(hd0,1) # 一般的默认语法,由 grub2 自动判断分区格式
(hd0,msdos1) # 此磁盘的分区为传统的 MBR 模式
(hd0,gpt1) # 此磁盘的分区为 GPT 模式
- 硬盘代号以小括号 ( ) 包起来;
- 硬盘以 hd 表示,后面会接一组数字;
- 以『搜寻顺序』做为硬盘的编号
- 第一个搜寻到的硬盘为 0 号,第二个为 1 号,以此类推;
- 每颗硬盘的第一个partition代号为1,依序类推。
/boot/grub2/grub.cfg 配置文件:
# vim /boot/grub2/grub.cfg
# 开始是 /etc/grub.d/00_header 这个脚本执行的结果展示,主要与基础配置与环境有关
### BEGIN /etc/grub.d/00_header ###
set pager=1
if [ -s $prefix/grubenv ]; then
load_env
fi
.....(中间省略).....
### END /etc/grub.d/00_header ###
# 开始执行 /etc/grub.d/10_linux,主要针对实际的 Linux 核心文件的启动环境
### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux 7 (Core), with Linux 3.10.0-229.el7.x86_64' --class rhel fedora \
--class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option \
'gnulinux-3.10.0-229.el7.x86_64-advanced-299bdc5b-de6d-486a-a0d2-375402aaab27' {
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 \
LANG=zh_TW.UTF-8
initrd16 /initramfs-3.10.0-229.el7.x86_64.img
}
### END /etc/grub.d/10_linux ###
.....(中间省略).....
### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###
三个重要的项目:
set root='hd0,gpt2'
指定 grub2 配置文件所在的那个设备。
linux16 /vmlinuz-... root=/dev/mapper/centos-root ...
这个是 Linux 核心文件以及核心执行时所使用的参数,root指的是linux根文件系统所在的设备。
initrd16 /initramfs-3.10...
这个就是 initramfs 所在的文件名
grub2 配置文件维护 /etc/default/grub 与 /etc/grub.d
/etc/default/grub 主要环境配置文件:
# 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" # 取消救援菜单的制作
倒数时间参数:GRUB_TIMEOUT
单位秒,不想等待则输入0,如果一定要使用者选择,则填-1
是否隐藏菜单项目:GRUB_TIMEOUT_STYLE
配置值有 menu, countdown, hidden 等等,默认是 menu
countdown 会在屏幕上显示剩余的等待秒数,hidden 则空空如也
信息输出的终端机模式:GRUB_TERMINAL_OUTPUT
配置值有『 console, serial, gfxterm, vga_text 』等等,一般使用 console
默认启动菜单项目:GRUB_DEFAULT
配置值包括有『 saved, 数字, title 名, ID 名』等等
menuentry '1st linux system' --id 1st-linux-system { ...}
menuentry '2nd linux system' --id 2nd-linux-system { ...}
menuentry '3rd win system' --id 3rd-win-system { ...}
GRUB_DEFAULT=1
代表使用第二个 menuentry 启动,因为数字的编号是以 0 号开始编的
GRUB_DEFAULT=3rd-win-system
代表使用第三个 menuentry 启动,因为里头代表的是 ID 的项目
GRUB_DEFAULT=saved
代表使用 grub2-set-default 来配置哪一个 menuentry 为默认值的意思。通常默认为 0
核心的外加参数功能:GRUB_CMDLINE_LINUX
核心在启动的时候还需要加入的额外参数
这个主要环境配置文件编写完毕之后,必须要使用grub2-mkconfig 来重建 grub.cfg
菜单创建的脚本 /etc/grub.d/*
- 00_header:主要在建立初始的显示项目,包括需要加载的模块分析、屏幕终端机的格式、倒数秒数、菜单是否需要隐藏等等,大部分在 /etc/default/grub 里面所配置的变量。
- 10_linux:根据分析 /boot 下面的文件,尝试找到正确的 linux 核心与读取这个核心需要的文件系统模块与参数等,并配置到 grub.cfg 当中。
- 30_os-prober:会到系统上找其他的 partition 里面可能含有的操作系统,然后将该操作系统做成菜单。在/etc/default/grub 里面加上『 GRUB_DISABLE_OS_PROBER=true 』取消这个文件的运行。
- 40_custom:想要自己手动加上去的菜单项目在这里补充即可!
initramfs 的重要性与建立新 initramfs 文件
目的在于提供启动过程中所需要的最重要核心模块,以让系统启动过程可以顺利完成。启动时通过主机的 INT 13 硬件功能将该文件读出来解压缩,在内存中仿真成为根目录,主要包含磁盘与文件系统的模块(如 usb, SCSI 等)
需要 initramfs 的时刻为:
- 根目录所在磁盘为 SATA、USB 或 SCSI 等连接接口;
- 根目录所在文件系统为 LVM, RAID 等特殊格式;
- 根目录所在文件系统为非传统 Linux 认识的文件系统时;
- 其他必须要在核心加载时提供的模块。
可以使用dracut/mkinitrd工具重制 initramfs 文件
# dracut [-fv] [--add-drivers 列表] initramfs文件名 核心版本
选项与参数:
-f:强迫编译出initramfs,如果initramfs文件已经存在,则覆盖掉旧文件
-v:显示dracut的运行过程
--add-drivers 列表:在原本的默认核心模块中,增加的模块!模块位于核心所在目录/lib/modules/$(uname -r)/kernel/*
initramfs文件名:以initramfs开头,后面接版本与功能
核心版本:默认是目前运行中的核心版本,可以手动输入其他不同版本!
--modules:将 dracut 所提供的启动所需模块(核心模块)加载,可用模块在下面的目录内/usr/lib/dracut/modules.d/
--gzip|--bzip2|--xz:使用哪一种压缩方式来进行initramfs 压缩。默认使用gzip
--filesystems :加入某些额外的文件系统支持
测试与安装 grub2
使用 grub-install 将安装 grub2 主程序与相关软件到 /boot/grub2
# grub2-install [--boot-directory=DIR] INSTALL_DEVICE
选项与参数:
--boot-directory=DIR 实际的目录,默认会将grub2 所有的文件都复制到 /boot/grub2/* ,如果想要复制到其他目录与设备去,就得要用这个参数。
INSTALL_DEVICE 安装的设备代号(如:/dev/sda)
最后总结一下:
- 先使用 grub2-install 安装 grub2 配置文件;
- 如果安装到 partition 时,可能需要加上额外的许多参数才能够顺利安装上去!
- 开始编辑 /etc/default/grub 及 /etc/grub.d/* 这几个重要的配置文件;
- 使用grub2-mkconfig -o /boot/grub2/grub.cfg 来建立启动的配置文件
启动前的额外功能修改
可以在默认菜单按下任意键,还可以进行grub2的『在线编修』功能
将反白光棒移动到要修改的菜单,再按下 'e' 会进入
用上/下/左/右按键到你想要编辑的地方,直接删除、新增
使用 [ctrl]+c 或者是 [esc]取消,使用 [ctrl]+x 来启动
grub2 的账号、密码与菜单配置
- superusers: 配置系统管理员与相关参数还有密码等,使用这个密码的用户,将可在 grub2 内具有所有修改的权限。 但一旦配置了这个 superusers 的参数,则所有的指令修改将会被变成受限制的!
- users: 配置一般账号的相关参数与密码,可以配置多个用户喔!使用这个密码的用户可以选择要进入某些菜单项目。不过,菜单项目也得要搭配相对的账号才行喔!(一般来说,使用这种密码的账号并不能修改菜单的内容,仅能选择进入菜单去启动而已)
set superusers="admin" # 这里是配置系统管理员的账号名称为啥的意思!
password admin abcd1234 # 当然要给予这个账号密码啊!
password user1 dcba4321 # 没有输入 superuses 的其他账号,当然就是判定为一般账号
menuentry "大家都可以选择我来启动喔!" --unrestricted {
set root=(hd0,1)
chainloader +1
}
menuentry "只有管理员的密码才有办法使用" --users "" {
set root=(hd0,2)
chainloader +1
}
menuentry "只有管理员与 USER1 才有办法使用喔!" --users user1 {
set root=(hd0,3)
chainloader +1
}
密码的给予有两种语法:
- password_pbkdf2 账号 『使用grub2-mkpasswd-pbkdf2所产生的密码』
- password 账号 『没加密的明码』
grub2 密码配置的文件位置与加密的密码
# grub2-mkpasswd-pbkdf2
Enter password: # 这里输入你的密码
Reenter password: # 再一次输入密码
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.9A2EBF7A1F484...
# vim /etc/grub.d/01_users
cat << EOF
set superusers="admin"
password_pbkdf2 admin grub.pbkdf2.sha512.10000.9A2EBF7A1F484904FF3681F97AE22D58DFBFE65A...
password_pbkdf2 user1 grub.pbkdf2.sha512.10000.B59584C33BC12F3C9DB8B18BE9F557631473AED...
EOF
#在 /etc/grub.d/* 下面的文件是『执行脚本』文件,是要被执行的.因此不能直接写帐密,而是通过 cat 或 echo 等指令方式来将帐密数据显示出来
详细的文档查看/usr/share/doc/grub2-tools-{version}/grub.html
参考文档:
《鸟哥的Linux私房菜基础篇第三版》