Linux运维进阶-Python,Docker,Shell

grub2的学习笔记

2020-05-30  本文已影响0人  My熊猫眼

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 . 加载之后,就可以使用了.
下面介绍几个常用的mod:
normal.mod #这个模块是grub实现正常引导所必须存在的. 当进入grub 模式后,如果grub命令行没有命令可用,那么需要首先insmod 这个模块. 然后再insmod 其他的模块. 如果在grub命令行下已经修复了问题,需要恢复原来被中断的引导,那么在加载该mod后,直接执行normal命令就可以了.
help.mod #如果没有grub命令可用,那么这个模块一般在normal.mod加载后进行加载,有了这个模块,然后就可以使用help命令了.
ls.mod #支持grub下的ls 命令
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的学习笔记,希望也能帮到你哦!

上一篇下一篇

猜你喜欢

热点阅读