例如:
00:00:00 to 06:00:00 -> Slitaz
06:00:01 to 13:00:00 -> Ubuntu
13:00:01 to 19:00:00 -> Fedora
19:00:01 to 23:59:59 -> openSUSE
grub 可以自动更改默认的“entry”吗?
答案1
首先,运行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 的高级选项子菜单(包含其他四个条目)、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
个例子。意思是:如果当前时间大于或等于早上 6 点和少于下午 4:59(16:59)然后执行下一个命令(set default="Windows 7 (loader) (on /dev/sda2)"
),该default
命令使用从上面的命令中获取的 Windows 7 菜单项名称设置变量grep
。
最后一块if
示例了子菜单条目的选择。在这种情况下,“Ubuntu,带有 Linux 3.16.0-25-generic”位于子菜单内,该子菜单是主菜单中的第二个条目。由于菜单中的条目位置从 0 开始,名为“Ubuntu”的菜单条目为 ,0
而“Ubuntu 高级选项”子菜单为1
,这就是为什么我必须1>
在条目名称前添加:set default="1>Ubuntu, with Linux 3.16.0-25-generic"
。
没有必要跑update-grub
。
这硬件时钟可能不可靠,特别是电池没电的时候。另外,进入 BIOS 设置并检查时间。如果是 UTC,则必须更改脚本中的时间范围。
答案2
首先,运行以下命令终端:
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
保存文件并关闭。
就这样!重新启动您的电脑并检查它是否正常工作。
笔记:要恢复这些设置,只需
sudo update-grub
在终端中运行。实际上,此命令将/boot/grub/grub.cfg
使用来自的模板/etc/grub.d
和来自的设置自动生成和替换文件/etc/default/grub
。因此,最好将上述代码放在/etc/grub.d
目录内的一个模板中。
灵感的源泉:在 GRUB2 中编写简单的启动时间状态机脚本。
其他来源:
答案3
您有两种选择。首先,您可以为每个操作系统添加一个 cron 脚本,该脚本会根据时钟更改配置。但是,如果此脚本在操作系统关闭时启动,您不会喜欢发生这种情况,因此请小心。更好的想法是为您的 PC 购买 UEFI 主板。在那里您可以安装 Shellx86,这是一个预引导加载程序脚本控制台。在 Shellx64 中为您想要的内容创建脚本并不比在 bash 中编写脚本更难。我用它来根据您是否有互联网连接来启动不同的操作系统。