在具有AMD64架构的UEFI系统上使用Grub 2.02.我想将grub的超时计数器从1秒间隔更改为1/10秒或1/100秒间隔.原因是使gfxmenu循环进度倒计时不那么"波涛汹涌".下面的引导GIF显示循环1秒"块"中的5秒倒计时:
成功更改源代码并重新编译后,/etc/default/grub将更改如下:
GRUB_TIMEOUT=25.GRUB_TIMEOUT=250.我已经下载了这里描述的源:如何从源代码构建grub2 bootloader并使用qemu模拟器测试它并花时间浏览源文件.但是有477k行搜索:
~/src/grub-2.02$ wc -l **/*
20 asm-tests/arm.S
18 asm-tests/i386-pc.S
4 asm-tests/i386.S
11 asm-tests/mips.S
8 asm-tests/powerpc.S
(... SNIP ...)
115 util/spkmodem-recv.c
477316 total
Run Code Online (Sandbox Code Playgroud)
我在Ask Ubuntu中做了很多bash项目,但这将是我的第一个C/Assembler Linux项目.作为一个"新手",我的想法是:
请注意,只有第一个问题是相关的.其他问题是作者选择更详细的答案.
变量GRUB_TIMEOUT在中进行评估util/grub.d/00_header.in.
if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then
cat <<EOF
if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then
EOF
make_timeout "${GRUB_HIDDEN_TIMEOUT_BUTTON}" "${GRUB_TIMEOUT_BUTTON}" "${GRUB_TIMEOUT_STYLE_BUTTON}"
echo else
make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}" "${GRUB_TIMEOUT_STYLE}"
echo fi
else
make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}" "${GRUB_TIMEOUT_STYLE}"
fi
Run Code Online (Sandbox Code Playgroud)
请注意,这是一个生成脚本的脚本,这就是为什么它看起来很奇怪. make_timeout看起来像这样(同上):
make_timeout ()
{
if [ "x${3}" != "x" ] ; then
timeout="${2}"
style="${3}"
elif [ "x${1}" != "x" ] && [ "x${1}" != "x0" ] ; then
# Handle the deprecated GRUB_HIDDEN_TIMEOUT scheme.
timeout="${1}"
if [ "x${2}" != "x0" ] ; then
grub_warn "$(gettext "Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.")"
fi
if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then
style="hidden"
verbose=
else
style="countdown"
verbose=" --verbose"
fi
else
# No hidden timeout, so treat as GRUB_TIMEOUT_STYLE=menu
timeout="${2}"
style="menu"
fi
cat << EOF
if [ x\$feature_timeout_style = xy ] ; then
set timeout_style=${style}
set timeout=${timeout}
EOF
if [ "x${style}" = "xmenu" ] ; then
cat << EOF
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
set timeout=${timeout}
EOF
else
cat << EOF
# Fallback hidden-timeout code in case the timeout_style feature is
# unavailable.
elif sleep${verbose} --interruptible ${timeout} ; then
set timeout=0
EOF
fi
cat << EOF
fi
EOF
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它只是sleep在最后调用了一些选项.该命令在grub-core/commands/sleep.c.中定义.虽然sleep命令只能以整秒的增量进行睡眠,但基础功能grub_millisleep可以做得更好.
通过更改所有grub_millisleep(1000)调用来修补此函数应该很容易grub_millisleep(100),但请记住,这会破坏所有使用sleep.更清洁的选项是添加新选项,sleep以便根据具体情况选择行为.
| 归档时间: |
|
| 查看次数: |
435 次 |
| 最近记录: |