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

デフォルトの「エントリ」を自動的に変更できますか?


1
理論的には、日付と時刻に関連するコマンドを/boot/grub/grub.cfgで使用できる場合は、でファイルを編集するだけで、特定の時間のGRUBエントリを選択できるはずです/etc/grub.d。しかし、GRUBがロードされる前の日付/時刻は、較正されたソース(NTPなど)でさえないと思います。そのため、PCの内部時計が残ります。
エドウィン2013

回答:


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サブメニューの詳細オプション(他の4つのエントリがある)、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に等しい場合 16:59(夜04時59分)後、次のコマンド(実行未満set default="Windows 7 (loader) (on /dev/sda2)"に設定)、defaultそれから取られたWindows 7のメニュー項目名と変数をgrep上記のコマンドを。

最後のifブロックは、サブメニューエントリの選択を例示しています。その場合、「Ubuntu、with Linux 3.16.0-25-generic」は、メインメニューの2番目のエントリであるサブメニュー内にあります。メニューのエントリ位置が0から​​始まるので、「Ubuntu」という名前のメニューエントリは「Ubuntuの0詳細オプション」サブメニューです1。そのため1>、エントリ名の前に追加する必要がありましたset default="1>Ubuntu, with Linux 3.16.0-25-generic"

実行する必要はありませんupdate-grub

ハードウェアクロックはバッテリーが死んでいる特別な場合には、信頼できない可能性があります。また、BIOSセットアップに入り、時刻を確認します。UTCの場合は、スクリプトで時間範囲を変更する必要があります。


カーネルの更新(またはユーザー)が新しいエントリを追加するときにupdate-grubを呼び出す可能性があるため、/ etc / grub.d / 00_headerを介して行う方が良い場合があります。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ディレクトリ内の1つのテンプレートに配置することをお勧めします。

インスピレーションの源:GRUB2での単純な起動時状態マシンのスクリプト作成

その他の情報源:


0

2つの可能性があります。まず、すべてのOSに、クロックによって設定を変更するcronスクリプトを追加できます。ただし、OSのシャットダウン中にこのスクリプトが起動するとどうなるか気に入らないので、注意してください。PCのUEFIマザーボードを入手することをお勧めします。そこで、ブートローダー前のスクリプトコンソールであるShellx86をインストールできます。Shellx64で必要なスクリプトを作成することは、bashでスクリプトを作成することと同じくらい簡単です。インターネット接続の有無に応じて、異なるOSを起動するために使用しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.