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


10

例如:

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可以自动更改默认的“输入”吗?


1
理论上,如果您可以在上使用与日期和时间相关的命令/boot/grub/grub.cfg,则只需在上编辑文件,就可以选择给定小时的grub条目/etc/grub.d。但是我认为grub加载之前的日期/时间甚至都不是经过校准的来源(例如NTP)。这样一来,您就剩下PC内部时钟了。
埃德温

Answers:


5

首先,运行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,则必须在脚本中更改时间范围。


最好通过/etc/grub.d/00_header进行操作,因为内核更新(或用户)在添加新条目时可能会调用update-grub。cf:linuxquestions.org/questions/linux-desktop-74/…–
KIAaze

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
    
  • 保存文件并关闭它。

就这样!重新启动您的PC并检查其是否正常运行。

注意:要还原这些设置,只需sudo update-grub在终端中运行。实际上,此命令将/boot/grub/grub.cfg使用中的模板/etc/grub.d和中的设置自动生成和替换文件/etc/default/grub。因此,最好将以上代码放在/etc/grub.d目录内的一个模板中。

灵感来源:在GRUB2中编写一个简单的启动时间状态机脚本

其他来源:


0

您有2种可能性。首先,您可以向每个操作系统添加一个cron脚本,该脚本可以按时钟更改配置。但是,您不喜欢在操作系统关闭时启动该脚本会发生的情况,因此请当心。一个更好的主意是为您的PC购买UEFI主板。在那里,您可以安装Shellx86,这是一个预引导加载程序脚本控制台。在Shellx64中为所需的内容创建脚本比在bash中编写脚本更难。我使用它来启动不同的操作系统,具体取决于您是否具有Internet连接。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.