grub2的学习笔记

grub2安装之后的文件分布:

grub2的rpm package含有很多的img, mod, lst 文件(默认路径是/usr/lib/grub/i386-pc/,可以通过对应的rpm -ql PACKAGENAME来查看), 在执行grub2-install之后,img文件分布如下:

boot.img 文件被写入到MBR中,因为MBR的大小是512字节,所以boot.img总是512字节大小; 但是写入到MBR的内容和boot.img的内容并不完全相同, MBR的内容是boot.img经过转换后的内容;因为MBR中的内容除了包含code, 还有磁盘的分区信息

core.img: 而grub2的rpm package 中的diskboot.img 以及kernel.img , 在grub2-install的时候被结合成为core.img, 同时还会 把一些 模块的代码以及 ”加载模块的代码“ 也加入到core.img中. 所以core.img 并不是grub rpm package的文件,而是grub安装时候生成的文件. 这个文件生成之后不能简单的存放到/boot分区,因为在系统启动的时候,运行到core 之前只有MBR中的512-64=448字节的代码,无法识别/boot分区, 所以 这个core.img 是需要 hard-code 到磁盘中的。grub 开发团队的建议是:将这个core.img的内容嵌入到 MBR 和第一个分区之间,第一个分区必须是第31KB(第63个扇区)之后开始,一般的磁盘都是从1M处开始创建分区. 所以正常的默认分区一般都没有问题, 也就是说,如果我们要手动安装grub2, 那么安装到的设备最好选择相应的disk , 而不要选择分区,这时候是以embeded的方式hard-code core.img的代码。当选择安装grub2到分区的时候,就会把core.img 安装到分区的第一个block,这时候是以block-chain的方式查找到core.img的,但是因为分区的block被文件系统管理,所以有可能被文件系统移动,因此安装到文件系统不是很可靠,也是因为这个原因,当安装到分区的时候经常会遇到提示: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..

mod文件: grub2安装之后,会有很多的模块文件(.mod) 被copy 到/boot/grub2/i386-pc 下面,这些mod文件主要是提供给grub使用的,比如normal.mod 文件如果丢失,那么grub 就无法正常完成引导过程。再比如 我们遇到过grub的命令行模式下,需要的命令(例如reboot, boot 等)找不到,这是因为相应的mod 没有被grub加载,此时,可以使用手动方式进行加载,然后就可以使用相应的命令了,手动加载grub mod文件的命令为: insmod MODULE_FILE_PATH . 加载之后,就可以使用了,需要注意的是: 像insmod 这样的命令不需要加载module就可以使用,还有rmmod命令也无需加载module就可以直接使用,然而还有一些命令是需要加载对应的module, 并且module之间是有依赖的,这里就不做过多介绍,知道有这么回事就可以 下面介绍几个常用的命令以及mod : insmod MODULE_FILE_PATH #用于手动加载module. lsmod #显示加载的module rmmod MODULE_NAME #用于从内存中删除已经loaded 的module. normal.mod #这个模块是grub实现正常引导所必须存在的. 其提供的命令就是:normal. 我们在grub下经常使用normal这个命令来让系统回到正常的引导状态. help.mod #顾名思义,就是提供帮助信息的,用法:help COMMMAND_NAME. boot.mod #支持grub下的boot 命令,执行该命令会提示要设置kernel, 必须首先设置 linux 的参数值,然后是initrd 的参数值,如何记住linux 和initrd 这两个命令呢?其实不需要,通过help 命令就可以知道了reboot.mod #支持grub下的reboot命令

grub2的安装命令:

grub2-install 命令用来安装grub到指定的设备上,要在各种环境中使用号grub2-install这个命令,首先需要知道grub2-install 都做了什么事情: A. grub2-install 会查找可用的module, 默认是查找 /usr/lib/grub/i386-pc 这个目录,这些module 会被copy 到/boot/grub2/i386-pc 下,如果grub的这些module 不在默认路径下,那么就可以通过 --directory 参数来指定Module以及image的路径, 除非默认的找不到才需要设置,否则一般都用默认的路径。 B. grub2-install 安装grub的时候,会copy grub需要的module 到/boot 分区的相应路径下,所以在修复模式安装grub的时候,可能需要指定 --boot-directory,或者要安装grub到其他的device, 也需要指定这个参数 。 C. grub安装的时候,还支持一个 --root-directory 的参数,这个参数不在”man grub2-install"的帮助文档中,个人对这个参数的理解是: 没有指定--boot-directory的情况下,--root-directory参数的值才有意义 ,当没有指定--boot-directory,但是指定了--root-directory,那么会在--root-directory指定的目录下创建boot 子目录, 作为--boot-directory 来使用. 这个--root-directory 和系统引导时候的root 没有任何关系. D. 如果重装grub,通常可能希望重新创建device map 关系,这时候可以用参数:--recheck来实现,这个参数的作用是:如果有必要,删除存在的device map, 然后创建一个新的,比如我们把grub 安装到了一个新的device 上可能就需要这么做。 E. 强制进行grub的安装,即便发现有问题. 这时候可以用参数 --force F. grub2-install 在执行的时候,还会调用其他的grub相关的命令,这些参数一般不需要更改. 这里就不介绍了.

grub2的配置文件:

grub2的配置文件在/boot/grub2/grub.cfg, 这个配置文件是系统引导时候会读取的,如果这个文件缺失,那么会导致引导失败. 但是,打开这个文件,可以看到如下的提示, 所以这个文件是自动生成的(基于/etc/default/grub 以及 /etc/grub.d下的脚本文件),不要去手动编辑这个grub.cfg文件.

[root@localhost grub2]# head grub.cfg
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
set pager=1
[root@localhost grub2]#

既然不让编辑上述的grub.cfg文件,那么要修改grub的配置,要去哪里更改呢? 到/etc/default/grub 这个文件里面添加自定义的grub配置项. 更改完成之后,可以用 grub2-mkconfig -o /boot/grub2/grub.cfg 把自定义的变更apply 到grub的配置文件中就可以了. 该配置文件的语法格式非常简单,就是key=value的方式书写的文本文件,关于所支持的key以及可能的value值,请参考官方链接:https://www.gnu.org/software/grub/manual/grub/html_node/Simple-configuration.html#Simple-configuration 根据grub.cfg的提示,我们自然也可以通过编写shell脚本来实现自定义的grub配置,这个属于比较高级的了,鄙人不才,还不清楚如何弄.

grub.cfg 虽然是自动生成的,但是有一个 grub2-script-check 命令可以用来检查grub.cfg 文件的语法是否有错误,虽然这个命令不常用,但是如果你手动改动了grub.cfg这个文件,还是有必要检查下语法是否有错.

以上就是grub的学习笔记,希望也能帮到你哦!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • dockerfile常用易混指令--(2)

    接上一篇:<<dockerfile 常用易混指令--(1)>>, 本篇介绍剩余的几个基础指令:

    干点啥吧
  • shell中一维数组学习

    在shell中也是支持数组的,这里只介绍一维数组的简单使用; 数组的赋值方式: arry=(a b c d) , 每个元素之间用空格分割,所有元素用小括号...

    干点啥吧
  • 基于centos的rootfs 创建自己的base image

    前面介绍了dockerfile的常用命令,以及如何构建自己的centos rootfs, 这里用前面学习的内容,来创建 自己的base image .

    干点啥吧
  • centos7新特性3

    MBR 分区的前 446 个字节存放的是系统引导程序 grub,中间 64 字节是分区表,最后 2 个字 节表示结束。

    py3study
  • matlab GUI基础10

    MATLAB与Word/EXCEL混合使用 matlab软件通过notebook可以和word软件进行数据的交换。matlab中的notebook允许用户在wo...

    瓜大三哥
  • SAP Commerce Extension的Web应用启动问题

    以yacceleratorstorefront为例,url:https://localhost:9002/yacceleratorstorefront?site...

    Jerry Wang
  • 一个投票项目的总结

    最近开发了一个只有3个页面的微信投票小项目 基本流程:一个微信号一天只能对一个参与者投一次票且一天总共可以对不同参与者投10次票 首页内容:展示所有投票参与者以...

    lestat
  • 理解Protobuf的数据编码规则

    之前用Google的Protobuf感觉真是个很好用的东西,于是抽时间研究了下他的数据的存储方式,以后可以扩展其他语言的解析器。其实与其说是研究,不如说是翻译。...

    owent
  • 使用mina解析http协议的使用

    在使用mina的过程中,我们通常会自定义各种报文,以使用于自己的业务。今天就为大家带来一款类似http协议的解码过程。 min...

    业余草
  • Oracle二维表操作训练

    —创建Employees create table Employees( employeeID varchar2(6) primary key, en...

    葆宁

扫码关注云+社区

领取腾讯云代金券