GRUB 可以安排吗?这意味着:在定义的时间段内自动更改默认的“条目”(自动登录)?

GRUB 可以安排吗?这意味着:在定义的时间段内自动更改默认的“条目”(自动登录)?

例如:

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 中编写脚本更难。我用它来根据您是否有互联网连接来启动不同的操作系统。

相关内容