GRUB programlanabilir mi? Bu şu anlama gelir: tanımlı zaman aralıklarında varsayılan 'giriş' (otomatik giriş) otomatik olarak değiştiriliyor mu?


10

Örneğin:

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 varsayılan 'girişi' otomatik olarak değiştirebilir mi?


1
Teoride, tarih ve saatle ilgili komutları kullanabiliyorsanız /boot/grub/grub.cfg, belirli bir saat için grub girdisinin seçilmesi yalnızca dosyaları düzenleyerek mümkün olmalıdır /etc/grub.d. Ancak grub yüklerinden önceki tarih / saatin kalibre edilmiş bir kaynak bile olmayacağını düşünüyorum (örneğin NTP gibi). Böylece PC iç saati ile bırakacaksınız.
edwin

Yanıtlar:


5

İlk olarak grep -E '(menuentry |submenu )' /boot/grub/grub.cfggrub menü girişlerinin bir listesini almak için çalıştırın . Şuna benzer bir şey görmelisiniz:

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

Burada ilk menü girişimi Ubuntu , ardından Ubuntu alt menüsü için Gelişmiş seçenekler (diğer dört girişle), 2 bellek testi ve sonunda Windows 7 görebilirsiniz .

Adında bir dosya oluşturursak /boot/grub/custom.cfg, daha sonra yüklenir /boot/grub/grub.cfg, böylece GRUB'un varsayılan yapılandırmasını kolayca değiştirebiliriz.

datehookGeçerli saati almak için GRUB'un modülünü kullandım .

/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

Modül datehook, donanım saatine göre gerçek tarih / saat değerlerini döndüren DAY, HOUR, MINUTE, MONTH, SECOND, WEEKDAY ve YEAR değişkenlerini kullanılabilir hale getirir.

if [ $TIME -ge 600 -a $TIME -lt 1659 ]; thenÖrnek olarak ele alalım. Bu şu anlama gelir: geçerli saat 6: 00'dan büyük veya eşitse ve 16:59 (16:59) 'dan küçükse set default="Windows 7 (loader) (on /dev/sda2)", defaultdeğişkeni grepyukarıdaki komuttan alınan Windows 7 menü girişi adıyla ayarlayan bir sonraki komutu ( ) yürütün .

Son ifblok, bir alt menü girişinin seçimini örnekler. Bu durumda "Ubuntu, Linux 3.16.0-25-generic" ile ana menüdeki ikinci giriş olan bir alt menünün içinde yer alır. 0'dan bir menü başlar bir giriş pozisyonuna, menü "Ubuntu" adlı girişi olduğu gibi 0ve alt menüsü olan "Ubuntu için gelişmiş seçenekleri" 1Ben eklemek zorunda yüzden, işte bu 1>giriş isminden önce: set default="1>Ubuntu, with Linux 3.16.0-25-generic".

Koşmaya gerek yok update-grub.

Donanım saati pil öldü, eğer özel güvenilmez olabilir. Ayrıca, BIOS kurulumuna girin ve saati kontrol edin. UTC ise, koddaki zaman aralığını değiştirmeniz gerekir.


Çekirdek güncellemeleri (veya kullanıcı) yeni girişler eklerken update-grub'u çağırabileceğinden, /etc/grub.d/00_header aracılığıyla bunu yapmak daha iyi olabilir. cf: linuxquestions.org/questions/linux-desktop-74/…
KIAaze

2

Başlangıç ​​için, terminalde aşağıdaki komutu çalıştırın :

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

Bu, grub menüsü girişlerinizin bir listesini döndürür. Senin durumunda bu liste böyle bir şey olduğunu varsayalım:

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

Şimdi, bu girişlerin her biri için 0'dan başlayarak artan sırada bir sayı atamalısınız ("Slitaz" için - 0"Gelişmiş seçenekler" için - 1vb.). Grub menüsünde varsayılan girişi ayarlamak için bu numaraları kullanacaksınız.

Sonra ve son olarak, /boot/grub/grub.cfgdosyayı aşağıdaki gibi düzenlemelisiniz :

  • Terminaldeki gedit açık olan dosyayı kullanarak:

    sudo -H gedit /boot/grub/grub.cfg
    
  • defaultDeğişkenin ayarlandığı satırı bulun ; şuna benzer bir şey olmalıdır:

    set default="..."
    
  • Yukarıdaki satırı bir sonraki kodla değiştirin:

    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
    
  • Dosyayı kaydedin ve kapatın.

Bu kadar! Bilgisayarınızı yeniden başlatın ve çalışıp çalışmadığını kontrol edin.

Not: bu ayarları geri almak için sadece sudo update-grubterminalde çalıştırın . Aslında, bu komut, /boot/grub/grub.cfgşablonları /etc/grub.dve ayarlarını kullanarak otomatik olarak dosya oluşturur ve değiştirir /etc/default/grub. Bu nedenle, yukarıdaki kodu /etc/grub.ddizin içindeki bir şablona koymak daha iyi olacaktır .

İlham kaynağı: GRUB2'de Basit Önyükleme Zamanı Durum Makinesi için Komut Dosyası Oluşturma .

Diğer kaynaklar:


0

2 olasılığınız var. İlk olarak, her işletim sistemine yapılandırmayı saatte değiştiren bir cron betiği ekleyebilirsiniz. Ancak, işletim sistemi kapatılırken bu komut dosyası devreye girerse ne olacağını sevmeyeceksiniz, bu yüzden dikkatli olun. PC'niz için bir UEFI anakartı almak daha iyi bir fikir olabilir. Burada, önyükleyici öncesi komut dosyası konsolu olan Shellx86'yı yükleyebilirsiniz. Shellx64'te istediğiniz şey için komut dosyası oluşturmak, bash komut dosyası oluşturmaktan daha zor değildir. İnternet bağlantınız olmasına bağlı olarak farklı işletim sistemlerini önyüklemek için kullandım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.