Bisakah GRUB dijadwalkan? Ini berarti: mengubah 'entri' default (login otomatis) pada periode waktu yang ditentukan secara otomatis?

10

Sebagai contoh:

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

Bisakah grub mengubah 'entri' default secara otomatis?

mini
sumber
1
Secara teori, jika Anda dapat menggunakan perintah terkait tanggal dan waktu aktif /boot/grub/grub.cfg, memilih entri grub untuk jam tertentu harus dimungkinkan hanya dengan mengedit file /etc/grub.d. Tapi saya pikir tanggal / waktu sebelum grub memuat bahkan tidak akan menjadi sumber yang dikalibrasi (seperti NTP, misalnya). Sehingga akan meninggalkan Anda dengan jam internal PC.
edwin

Jawaban:

5

Pertama, jalankan grep -E '(menuentry |submenu )' /boot/grub/grub.cfguntuk mendapatkan daftar entri menu grub Anda. Anda harus melihat sesuatu seperti:

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' {

Di sini Anda dapat melihat entri menu pertama saya adalah Ubuntu , diikuti oleh opsi Advanced untuk submenu Ubuntu (dengan empat entri lainnya), 2 tes memori dan, akhirnya, Windows 7 .

Jika kita membuat file dengan nama /boot/grub/custom.cfg, itu akan diambil setelahnya /boot/grub/grub.cfg, sehingga kita dapat dengan mudah mengubah konfigurasi default GRUB.

Saya menggunakan modul GRUB datehookuntuk mendapatkan waktu saat ini.

/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

Modul datehookini menyediakan variabel: DAY, HOUR, MINUTE, MONTH, SECOND, WEEKDAY dan YEAR, yang mengembalikan nilai tanggal / waktu aktual berdasarkan jam perangkat keras.

Mari kita ambil if [ $TIME -ge 600 -a $TIME -lt 1659 ]; thensebagai contoh. Ini berarti: jika waktu saat ini lebih besar dari atau sama dengan 6AM dan kurang dari 4:59 PM (16:59) maka jalankan perintah berikutnya ( set default="Windows 7 (loader) (on /dev/sda2)"), yang mengatur defaultvariabel dengan nama entri menu Windows 7 yang diambil dari grepperintah di atas.

ifBlok terakhir mencontohkan pemilihan entri submenu. Dalam hal itu "Ubuntu, dengan Linux 3.16.0-25-generik" terletak di dalam submenu yang merupakan entri kedua di menu utama. Sebagai posisi entri dalam menu dimulai dari 0, entri menu bernama "Ubuntu" adalah 0dan "Advanced pilihan untuk Ubuntu" submenu adalah 1, itu sebabnya aku harus menambahkan 1>sebelum nama entri: set default="1>Ubuntu, with Linux 3.16.0-25-generic".

Tidak perlu lari update-grub.

The Jam hardware mungkin tidak dapat diandalkan, khususnya jika baterai sudah mati. Juga, masuk ke pengaturan BIOS dan periksa waktu. Jika UTC, Anda harus mengubah rentang waktu dalam skrip.

Eric Carvalho
sumber
Mungkin lebih baik melakukannya melalui /etc/grub.d/00_header, karena pembaruan kernel (atau pengguna) mungkin memanggil grub pembaruan ketika menambahkan entri baru. cf: linuxquestions.org/questions/linux-desktop-74/…
KIAaze
2

Untuk awal, jalankan perintah berikut di terminal :

grep -E '^menuentry|^submenu' /boot/grub/grub.cfg | cut -d '"' -f2 | cut -d "'" -f2

Ini akan mengembalikan daftar entri menu grub Anda. Saya berasumsi bahwa dalam kasus Anda daftar ini adalah sesuatu seperti ini:

Slitaz
Advanced options
Memory test (memtest86+)
Memory test (memtest86+, serial console 115200)
Ubuntu
Fedora
openSUSE

Sekarang, untuk masing-masing entri ini Anda harus menetapkan angka dalam urutan menaik dimulai dengan 0 (untuk "Slitaz" - 0, untuk "Opsi lanjutan" - 1dan seterusnya). Anda akan menggunakan angka ini untuk mengatur entri default di menu grub.

Selanjutnya, dan hal terakhir, Anda harus mengedit /boot/grub/grub.cfgfile sebagai berikut:

  • Dari terminal buka di gedit file menggunakan:

    sudo -H gedit /boot/grub/grub.cfg
    
  • Temukan garis di mana defaultvariabel diatur; seharusnya terlihat mirip dengan:

    set default="..."
    
  • Ganti baris di atas dengan kode berikutnya:

    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
    
  • Simpan file dan tutup.

Itu saja! Nyalakan kembali PC Anda dan periksa apakah berfungsi.

Catatan: untuk mengembalikan pengaturan ini, jalankan saja sudo update-grubdi terminal. Bahkan, perintah ini akan secara otomatis menghasilkan dan mengganti /boot/grub/grub.cfgfile menggunakan templat dari /etc/grub.ddan pengaturan dari /etc/default/grub. Jadi akan lebih baik untuk menempatkan kode di atas dalam satu template di dalam /etc/grub.ddirektori.

Sumber inspirasi: Membuat Scripting Mesin Waktu Booting Sederhana di GRUB2 .

Sumber lain:

Radu Rădeanu
sumber
0

Anda memiliki 2 kemungkinan. Pertama, Anda dapat menambahkan ke setiap OS skrip cron yang mengubah konfigurasi oleh jam. Namun, Anda tidak akan menyukai apa yang akan terjadi jika skrip ini masuk saat OS dimatikan, jadi waspadalah. Ide yang lebih baik adalah mendapatkan motherboard UEFI untuk PC Anda. Di sana Anda dapat menginstal Shellx86 yang merupakan konsol skrip pra-bootloader. Membuat skrip untuk apa yang Anda inginkan di Shellx64 tidak lebih sulit daripada skrip di bash. Saya menggunakannya untuk mem-boot OS yang berbeda tergantung pada apakah Anda memiliki koneksi Internet.

Barafu Albino
sumber