RHCSA&RHCE(RHCE7)学习知识点--Linux启动管理器GRUB2

 

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)

最后总结一下:

  1. 先使用 grub2-install 安装 grub2 配置文件;
  2. 如果安装到 partition 时,可能需要加上额外的许多参数才能够顺利安装上去!
  3. 开始编辑 /etc/default/grub 及 /etc/grub.d/* 这几个重要的配置文件;
  4. 使用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私房菜基础篇第三版》

 

猜你喜欢

转载自blog.csdn.net/byrgzs/article/details/85628179
今日推荐