如何在Centos-8下的命令行中列出GRUB2的\xe2\x80\x9cmenuentries\xe2\x80\x9d?\n使用的可行方法“fgrep menuentry /etc/grub2.conf”失败。
\n\n因为在 Centos-8/RHEL-8 中,它们不会将菜单项存储在 /etc/grub2.conf 中。\n相反,它们会在启动运行时搜索并构建条目。
\n\n以及如何将自定义命令行参数添加到特殊菜单项?\n/etc/grub2.conf 中没有菜单项,我无法编辑任何菜单项。
\n我想自定义GRUB EFI映像,并在QEMU上运行时对其进行调试。
因此,我尝试在自定义之前调试原始GRUB图像。
我从http://git.savannah.gnu.org下载GRUB2 并进行了编译:
./autogen.sh
./configure --prefix=`pwd`/local --with-platform=efi --target=i386 CFLAGS=-g
make
make install
Run Code Online (Sandbox Code Playgroud)
然后,生成具有以下内容的普通EFI图像:
./local/bin/grub-mkstandalone -O i386-efi -o bootIA32.efi
Run Code Online (Sandbox Code Playgroud)
并将其放在磁盘映像文件中:
qemu-img create -f raw hda.img 1G
mkfs.fat hda.img
sudo mount -o uid=$UID hda.img /mnt
mkdir -p /mnt/efi/boot/
mv bootIA32.efi /mnt/efi/boot/
sudo umount /mnt
Run Code Online (Sandbox Code Playgroud)
为了启动它,我编译了一个IA32 OVMF.fd使其与QEMU一起使用:
qemu-system-i386 -bios $UDK_PATH/Build/OvmfIa32/RELEASE_GCC48/FV/OVMF.fd \
-hda hda.img
Run Code Online (Sandbox Code Playgroud)
它可以正确启动,给我一个g壳。
现在,我想调试GRUB。所以我用其他参数调用了QEMU:
qemu-system-i386 -bios $UDK_PATH/Build/OvmfIa32/RELEASE_GCC48/FV/OVMF.fd \
-hda hda.img \
-s -S
Run Code Online (Sandbox Code Playgroud)
并将gdb附加到QEMU:
cd grub-core/
gdb -x gdb_grub
Run Code Online (Sandbox Code Playgroud)
但是,似乎缺少调试符号:
GNU gdb (Debian 7.7.1+dfsg-5) 7.7.1 …
Run Code Online (Sandbox Code Playgroud) 我想查看 grub_dprintf() 生成的 GRUB2 调试日志,例如,在 mmap.c:
grub_dprintf ("mmap", "EFI memory region 0x%llx-0x%llx: %d\n",
(unsigned long long) desc->physical_start,
(unsigned long long) desc->physical_start
+ desc->num_pages * 4096, desc->type);
Run Code Online (Sandbox Code Playgroud)
经过一番研究,我发现启用此日志的方法是在 grub 菜单中设置 debug env 变量(我在 grub.cfg 上更改了它,可能不应该这样做)
set debug=all
Run Code Online (Sandbox Code Playgroud)
如何查看日志?grub 日志在启动过程中滚动得如此之快,以至于很难检查。也许有办法在内核启动后检查日志?
我正在使用 CENTOS 7。
GRUB 脚本中是否可以进行文件名通配符扩展?
就像是:
for i in directory/*; do echo $i; done
Run Code Online (Sandbox Code Playgroud)
我的目的是让 GRUB 加载位于某些目录中的不同 cfg 文件。
如果在启用GPT的分区上使用GRUB2,加载程序如何“知道”在哪里找到其配置文件和其他第二阶段的文件?
注意:我发现一些有关配置文件的提及,该配置文件与GRUB的EFI加载器位于同一文件夹中,并且包含来自指定分区的“主要”配置文件的链式加载,但这绝对不正确-只有一个“东西”。 efi”文件。
我想在 Google Compute Engine 实例上安装自定义内核映像。我有一个运行的实例:
foo@instance-1:/boot/efi$ uname -a
Linux instance-1 4.10.0-22-generic #24-Ubuntu SMP Mon May 22 17:43:20 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
我已经构建并安装了我的内核映像:
sudo dpkg -i linux-image-4.10.0-rc8.10.0-rc8_amd64.deb
Run Code Online (Sandbox Code Playgroud)
它显示在 grub 配置文件中,我已经将默认的 grub 菜单项设置为正确的数字,并且我已经运行
sudo update-grub
Run Code Online (Sandbox Code Playgroud)
然而,当我重新启动时,我得到了与开始时相同的内核。
谷歌关于这方面的文档似乎不存在。有一个地方表明我可能必须在外部创建映像、安装内核并导入它。但是,我需要做很多事情,所以我宁愿以老式的方式安装新内核。
我设法访问了multiboot_info_t
i386 内核中的 GRUB 多引导信息结构 ( ),并且有两个字段分别称为mem_lower
和mem_upper
。我如何使用它们来获取总可用 RAM(以字节为单位)?
我尝试将以下代码用于 Multiboot2 兼容内核的标头,但是当我multiboot2
在 grub 中尝试该命令时,它给出了以下错误消息:
错误:不支持的标签:0xc
我的 Multiboot2 标头定义为:
section .multiboot align=4096
mbhead: dd 0xe85250d6
dd 0
dd 76
dd 0 - 76 - 0xe85250d6 ; TODO the linker and assembler get angry if we calculate this with symbols, we need to do this by hand
dw 1 ; multiboot information request
dw 0
dd 20
dd 1
dd 2
dd 6
dw 4 ; console flags
dw 0
dd 12
dd 0x3
dw 5 ; framebuffer settings …
Run Code Online (Sandbox Code Playgroud) 在 CentOS 6 上,我们目前使用该选项加密 grub 密码password --md5
,并且可以将其编写到我们的标准服务器构建中。
我们正忙于迁移到 CentOS 7,看来该password --md5
选项已在 grub2 中删除并替换为grub2-mkpasswd-pbkdf2
.
尽管我欢迎安全性的提高,但我找不到grub2-mkpasswd-pbkdf2
通过标准输入将密码传递给命令的方法,而且 grub2 似乎已经删除了对 md5 的支持,这两者的结合破坏了我们的脚本构建自动化。
任何人都可以帮忙:
grub2-mkpasswd-pbkdf2
?或者grub2-mkpasswd-pbkdf2
?或者--md5
?