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

Modified on: Sun, 10 Jun 2018 04:27:53 +0800

例如:

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'吗?

最佳答案

首先,运行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,它们根据硬件时钟返回实际的日期/时间值。

如果[$ TIME -ge 600 -a $ TIME -lt 1659],让我们拿if [ $TIME -ge 600 -a $TIME -lt 1659 ]; then就是一个例子。这意味着:如果当前时间大于或等于6AM 小于下午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,则必须更改脚本中的时间范围。


相关问答

添加新评论