我正在尝试在可启动闪存驱动器上手动安装 grub 的背景图像。由于驱动器仅启动 ISO 并且没有安装操作系统,因此我无法利用脚本来update-grub
为我执行此操作,并且有关编辑 /etc/default/grub 的帖子不适用于我的情况。我见过如何在 GRUB 上添加背景图片?但由于我提到的原因,它并不适用。我已经设法让所有 ISO 都能正常启动,但我仍然坚持应用背景图像。这是我的 grub.cfg 的相关部分,其余部分是正常工作的所有菜单条目(回退到文本模式)。
set timeout=10
set default=0
set root=(hd0,msdos1)
### BEGIN background setup ###
function load_video {
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
}
load_video
insmod gfxterm
insmod part_msdos
insmod png
GRUB_TERMINAL=gfxterm
GRUB_GFXMODE=auto
GRUB_BACKGROUND="splash.png"
### END background setup ###
背景图像是一个 640x480 PNG 文件(我使用 gimp 缩放到大小)使用 GRUB 2.02 Beta2
进一步的研究表明,这部分:
GRUB_TERMINAL=gfxterm
GRUB_GFXMODE=auto
GRUB_BACKGROUND="splash.png"
使用更新脚本使用的变量,这些变量属于 /etc/default/grub ,并且不会以这种方式出现在 grub.cfg 中,所以我确信这些行至少是错误的。
编辑:我做了一些调整,但仍然没有喜悦。这是一个帕斯特宾相关部分的(我排除了不相关的菜单条目,因为它们在文本模式下工作正常并且不是问题)
答案1
您需要将下一行添加到grub.cfg
菜单之前。由于它是定制的并且您不会使用,update-grub
因此应该不会有任何问题:
background_image /boot/Your_image.png
现在,如果您想为您的发行版提供不同的背景,您只需在菜单中添加该行即可。例如,这是我的菜单开始的部分;正如你所看到的,我在菜单之前有一个默认背景,这样当 grub 启动时它就有一个背景,之后每个菜单/子菜单都有自己的背景:
background_image /boot/SolusOS-splash.png
set color_normal=white/black
set color_highlight=black/white
submenu "Debian 8.1 -->"{
submenu "Debian 8.1 i386 -->"{
background_image /boot/DebianLava-splash.png
set iso=/boot/ISOs/debian-live-8.1.0-i386-gnome-desktop.iso
....
编辑:这是我的搜索路径条目(请注意 uuid 是我的 usb 的 ID)不知道这是否可能是您的问题:
set boot_uuid=D042-8A53
set root_uuid=D042-8A53
search --fs-uuid $root_uuid --set=root
search --fs-uuid $boot_uuid --set=grub_boot
if [ $boot_uuid == $root_uuid ]
then
set grub_boot=($grub_boot)/boot
else
set grub_boot=($grub_boot)
fi
答案2
由于我的编码技能显然无法胜任这项任务,因此我开发了一种方法来解决此问题,方法是临时将实时 Lubuntu 系统安装到闪存驱动器并利用 Daniel Richter 最优秀的技术grub 定制器给自己一个工作起点。我系统地浏览了代码,注释掉了我认为对我的目的来说可能不必要的行和部分,并在进行过程中测试了更改。可以找到带有注释的示例(没有菜单条目)这里对于那些可能对这个过程感兴趣的人。下面是经过测试的代码部分(用于旧版启动)编辑后,我删除了大部分评论和不需要的部分后最终得到了结果。看来我的大部分问题都与linux_gfx_mode
、terminal_output
和background_image
(以及设置根)的不当处理有关。正如我在编辑中猜测的那样,变量在 grub.cfg 文件中的表达方式与在 grub 脚本中的表达方式不同。我毫不怀疑这可以改进,当我发现简化时,我将对其进行编辑。
set have_grubenv=true
load_env
set timeout=10 #added
set default=2 #added
menuentry_id_option=""
export menuentry_id_option
function load_video {
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
}
#if [ x$feature_default_font_path = xy ] ; then
#font=unicode
#else
##Scrapped if-then-else above required? - NO?
insmod part_msdos
insmod ext2
search --no-floppy --set=root --label freedom
font=/boot/grub/fonts/unicode.pf2
fi
if loadfont $font ; then
set gfxmode=auto
load_video
insmod gfxterm
set locale_dir=/boot/grub/locale
set lang=en_US
insmod gettext
fi
terminal_output gfxterm
insmod part_msdos
insmod ext2
search --set=root --label freedom
### Begin Background setup ###
insmod png
set menu_color_normal=yellow/black
set menu_color_highlight=black/light-gray
if background_image /boot/grub/splash.png; then
true
else
set menu_color_normal=green/black
set menu_color_highlight=black/light-gray
fi
### END Background setup ###
### BEGIN setup graphics ###
function gfxmode {
set gfxpayload="${1}"
if [ "${1}" = "keep" ]; then
set vt_handoff=vt.handoff=7
else
set vt_handoff=
fi
}
if [ "${recordfail}" != 1 ]; then
if [ -e ${prefix}/gfxblacklist.txt ]; then
if hwmatch ${prefix}/gfxblacklist.txt 3; then
if [ ${match} = 0 ]; then
set linux_gfx_mode=keep
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=keep
fi
else
set linux_gfx_mode=text
fi
export linux_gfx_mode
### End setup graphics ###
资料来源:
https://answers.launchpad.net/~danielrichter2007