Answers:
首先,运行grep -E '(menuentry |submenu )' /boot/grub/grub.cfg以获取grub菜单条目的列表。您应该看到类似以下内容:
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-7820cc72-dac4-447f-bba0-996ed1a12fa5' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-7820cc72-dac4-447f-bba0-996ed1a12fa5' {
menuentry 'Ubuntu, with Linux 3.16.0-28-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-28-generic-advanced-7820cc72-dac4-447f-bba0-996ed1a12fa5' {
menuentry 'Ubuntu, with Linux 3.16.0-28-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-28-generic-recovery-7820cc72-dac4-447f-bba0-996ed1a12fa5' {
menuentry 'Ubuntu, with Linux 3.16.0-25-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-25-generic-advanced-7820cc72-dac4-447f-bba0-996ed1a12fa5' {
menuentry 'Ubuntu, with Linux 3.16.0-25-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.0-25-generic-recovery-7820cc72-dac4-447f-bba0-996ed1a12fa5' {
menuentry 'Memory test (memtest86+)' {
menuentry 'Memory test (memtest86+, serial console 115200)' {
menuentry 'Windows 7 (loader) (on /dev/sda2)' --class windows --class os $menuentry_id_option 'osprober-chain-C84087BD4087B12C' {
在这里,您可以看到我的第一个菜单项是Ubuntu,然后是Ubuntu子菜单的Advanced选项(还有其他四个项),2个内存测试,最后是Windows 7。
如果我们创建一个名为的文件/boot/grub/custom.cfg,它将在之后加载/boot/grub/grub.cfg,因此我们可以轻松更改GRUB的默认配置。
我使用GRUB的模块datehook来获取当前时间。
/boot/grub/custom.cfg:
# This module creates special variables that return the current date/time
insmod datehook
# Add and extra 0 to minutes if it's less than 10 (force a 2-digit minute)
if [ $MINUTE -lt 10 ]; then PADDING="0"; else PADDING=""; fi
TIME=$HOUR$PADDING$MINUTE
# Boot "Ubuntu" from midnight to 5:59AM
if [ $TIME -ge 0 -a $TIME -lt 559 ]; then
set default="Ubuntu"
fi
# Boot "Windows 7" from 6AM to 4:59PM
if [ $TIME -ge 600 -a $TIME -lt 1659 ]; then
set default="Windows 7 (loader) (on /dev/sda2)"
fi
# If you want to boot an entry that's inside a submenu,
# you have to prepend its name with the submenu position, starting from 0.
# Boot "Ubuntu, with kernel 3.16.0-25-generic" from 5PM to 11:59PM
if [ $TIME -ge 1700 -a $TIME -lt 2359 ]; then
set default="1>Ubuntu, with Linux 3.16.0-25-generic"
fi
该模块datehook提供以下变量:DAY,HOUR,MINUTE,MONTH,SECOND,WEEKDAY和YEAR,这些变量根据硬件时钟返回实际的日期/时间值。
让我们if [ $TIME -ge 600 -a $TIME -lt 1659 ]; then举个例子。这意味着:如果当前时间大于或等于6AM 并且小于4:59 PM(16:59),则执行下一个命令(set default="Windows 7 (loader) (on /dev/sda2)"),该命令default使用从grep上面的命令中获取的Windows 7菜单项名称来设置变量。
最后if一块例示了子菜单项的选择。在这种情况下,“ Ubuntu,使用Linux 3.16.0-25-generic”位于子菜单中,该子菜单是主菜单中的第二个条目。由于菜单中的条目位置从0开始,因此名为“ Ubuntu”的菜单条目为,而“ Ubuntu 0的高级选项”子菜单为1,这就是为什么我必须1>在条目名称之前添加的原因set default="1>Ubuntu, with Linux 3.16.0-25-generic"。
无需运行update-grub。
该硬件时钟可能是不可靠的,特别是如果电池没电了。另外,进入BIOS设置程序并检查时间。如果是UTC,则必须在脚本中更改时间范围。
首先,在终端运行以下命令:
grep -E '^menuentry|^submenu' /boot/grub/grub.cfg | cut -d '"' -f2 | cut -d "'" -f2
这将返回您的grub菜单条目的列表。我认为在您的情况下,此列表如下所示:
Slitaz
Advanced options
Memory test (memtest86+)
Memory test (memtest86+, serial console 115200)
Ubuntu
Fedora
openSUSE
现在,对于这些条目中的每一个,您应该以从0开始的升序分配一个数字(对于“ Slitaz”- 0,对于“高级选项”- 1依此类推)。您将使用此数字在grub菜单中设置默认条目。
接下来,也是最后一件事,您应该/boot/grub/grub.cfg按照以下步骤编辑文件:
在终端中,使用以下命令在gedit中打开文件:
sudo -H gedit /boot/grub/grub.cfg
查找default设置了变量的行;它看起来应该类似于:
set default="..."
用下面的代码替换上面的行:
insmod datehook
if [ "$HOUR" -ge "0" -a "$HOUR" -lt "6" ]; then set default="0" #Slitaz time
elif [ "$HOUR" -ge "6" -a "$HOUR" -lt "13" ]; then set default="4" #Ubuntu time
elif [ "$HOUR" -ge "13" -a "$HOUR" -lt "19" ]; then set default="5" #Fedora time
else set default="6" #openSUSE time
fi
保存文件并关闭它。
就这样!重新启动您的PC并检查其是否正常运行。
注意:要还原这些设置,只需
sudo update-grub在终端中运行。实际上,此命令将/boot/grub/grub.cfg使用中的模板/etc/grub.d和中的设置自动生成和替换文件/etc/default/grub。因此,最好将以上代码放在/etc/grub.d目录内的一个模板中。
灵感来源:在GRUB2中编写一个简单的启动时间状态机脚本。
其他来源:
/boot/grub/grub.cfg,则只需在上编辑文件,就可以选择给定小时的grub条目/etc/grub.d。但是我认为grub加载之前的日期/时间甚至都不是经过校准的来源(例如NTP)。这样一来,您就剩下PC内部时钟了。