grub关于linux与initrd、linuxefi与initrdefi、grud.d模板的一些记录

一、grub下的常见错误

1、常见在grub的界面会报该错误

error: can't find command `linux`
error: can't find command `initrd`

2、我的理解

这里最主要是grub与efi的关系,在很多老的模式中,是不支持uefi模式的,所以配置成linux与initrd模式在grub.cfg可以正常引导启动。而在支持uefi模式下,如果不使用secure boot,则可以继续使用linux与initrd配置,但一旦使用了secure boot,将会报错不能找到这两个命令,这时,重新通过

grub2-mkconfig -o /boot/efi/boot/grub/grub.cfg    //根据自己实际的grug.cfg位置来选择

就可以在grub.cfg生成带有linuxefi与initrdefi的配置从而成功引导。

3、解决方法

(1)快速有效但感觉不是很规范的方法

报错如下:

error: can't find command `linux`
error: can't find command `initrd`

解决1:
直接找到自己生成的grub.cfg文件,将它的linux用linuxefi替换,将initrd用initrdefi替换保存重启,则可以正常进入引导。
但它的缺陷是一旦每次重新使用grub2-mkconfig生成grub.cfg,将需要重新替换,略麻烦并且不是很规范的方法。
解决2:
如果再grub界面,没有进入系统,则按下e键进入编辑界面,来进行替换,替换完成后·“ctrl+x”进入执行开始引导。

(2)修改模板的方法(不用每次都手动替换grub.cfg中linux与initrd)

模板如下所示,我们打开10_linux文件

[root@localhost grub.d]# ls /etc/grub.d/
00_header  01_users  20_linux_xen     30_os-prober  41_custom
00_tuned   10_linux  20_ppc_terminfo  40_custom     README

找到这个代码段:

106   linuxefi="linux"
107   initrdefi="initrd"
108   case "$machine" in
109     i?86|x86_64)
110         sixteenbit="16"
111         linuxefi="linuxefi"
112         initrdefi="initrdefi"
113         ;;
114     aarch64)
115         linuxefi="linux"
116         initrdefi="initrd"
117         ;;
118   esac

修改为

106   linuxefi="linux"
107   initrdefi="initrd"
108   case "$machine" in
109     i?86|x86_64)
110         sixteenbit="16"
111         linuxefi="linux"
112         initrdefi="initrd"
113         ;;
114     aarch64)
115         linuxefi="linux"
116         initrdefi="initrd"
117         ;;
118   esac

然后重新生成grub.cfg文件,也可以解决该问题,主要原理为将efi模式的配置强制生成为不带efi的,比上一种方法好一些,不过也不是太理想。

(3)替换模板

我这里采用的是grub2.04的版本,可以从上面链接下载安装配置,安装配置完成后,将其util目录下的grub.d文件夹替换系统自带的注意尽量不要覆盖原来的grub,否则可能会引起grub损坏导致引导系统失败很难修复,我安装grub2.04在了/usr/local下,同时efi配置放到了/boot/efi/boot与/boot/efi/centos_test下,不与自带的配置冲突,然后在BIOS配置中将我重新安装的grub放在第一个引导,将系统自带的grub放在第二个,这样当我的grub出问题时可以退出然后进入系统自带的grub,从而进入系统进行修复,比较安全
因此,我替换的grub.d自然是在/usr/local/etc/grub.d(系统自带的在/etc/grub.d,不要搞到一起一团麻),然后使用自己安装的grub进行生成grub.cfg文件

/usr/local/sbin/grub-mkconfig -o /boot/efi/boot/grub/grub.cfg   //我使用的是centos,centos自带的PATH不包含/usr/local路径,因此使用绝对路径,另外这样的好处是不影响系统自带grub的使用。

若成功生成引导,则可以重启引导啦

4、与上面相似的错误

在这里插入图片描述
这是因为系统命令目前不支持efi这种配置或者不在security boot下,因此找不到,可以使用与

error: can't find command `linux`
error: can't find command `initrd`

类似的替换的方法来解决。
一段网上类似的替换方案解释
If you want a “quick fix”, you can try locating “grub.cfg” (should be in “/boot/grub2”), and edit it. Change “linuxefi” to “linux” everywhere, and change “initrdefi” to “initrd” everywhere. Then perhaps plain grub2 can boot it.

5、查看grub支持的命令方法

(1)查手册

通过手册到命令章节进行查找看支持的命令,我查到的grub关于linux与initrd的命令支持:
在这里插入图片描述

(2)在grub引导页面查询

这里主要通过“TAB”键的方式了,下面截图分别为支持linux,initrd的“TAB”情况与支持linuxefi,initrdefi的“TAB”情况显示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
目前经过实际测试,centos7.8自带的grub是支持initrdefi与linuxefi的,自己装的grub2.04只有linux与initrd命令。

6、后记

时间仓促,就当随笔来记录了,格式整理的也不好,很多实际操作碰到的问题也很难详细描述清楚(可能自己确实也挺菜哈),目前也将新安装grub2.04而不影响原有grub的操作流程实际跑通了,可以防止系统被自己玩坏而导致进不去系统,有时间把它记下来。另外目前默认的ubuntu16.04支持的命令为linux,initrd;而centos7.8为linuxefi,initrdefi,grub2.04在ubuntu16.04配置起来自己不需要进行grub.d替换了,从/etc/grub.d拿模板就好。而centos7.8则会报在这里插入图片描述
的错误,具体使用上面哪种方法解决就看自己的需求了。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值