GRUB'un “menüleri” komut satırında nasıl listelenir?


Yanıtlar:


31

kullanma awk

awk -F\' '/menuentry / {print $2}' /boot/grub/grub.cfg 

içindeki tüm menü girişlerinin tam listesini verir grub.cfg.


1
Grep için boruyu açmanıza gerek yoktur, awk / foo / ile eşleşecektir.
Panther

1
awk -F\' '/menuentry / {print $2}' /boot/grub/grub.cfg
Panter

AB @ bodhi.zazen ile aynı fikirdeyim . Bana bir not düzenler ve bırakırsanız, geri dönüp oy vereceğim!
Fabby

@Fabby sizin için bir not. OMG Bunlar benim ilk adımımdı awk. : \
AB

3
Çıkış numarasını giriş çıkışına ekleyin: awk -F\' '/menuentry / { print i++, $2}' /boot/grub/grub.cfgkullanmak içingrub-set-default
mikezter

8

Renkli Ekran görüntüsü (kısa versiyon)

Kullanım fare kaydırma tekerleği, Home, End, PgUp, PgDn, ve tuşları menüsünü gezinmek için.

grub-menu.sh

Metin Ekranı görüntüsü (uzun versiyon)

Bash betiği menüyü görüntülemek whiptailyerine kullanır dialog. Bir avantaj, terminal görüntüsünü panoya metin olarak kopyalayabilir ve bu web sitesine metin olarak yapıştırabilirsiniz. Diğer avantajlar şunlardır:

  • Fare kaydırma tekerleği desteği
  • Hızlı performans
  • dialogUbuntu Sunucusu veya Lubuntu'da varsayılan olarak kurulmaz. whiptailvarsayılan olarak dahil edilmiştir.

İşte bir metin ekranı görüntüsü:

Grub Version: 2.02~beta2-36ubuntu3.15


        ┌─────────┤ Use arrow, page, home & end keys. Tab toggle option ├──────────┐
        │ Menu No. --------------- Menu Name ---------------                       │ 
        │                                                                          │ 
        │     0    Ubuntu                                                     ↑    │ 
        │     1    Advanced options for Ubuntu                                ▮    │ 
        │     1>0  Ubuntu, with Linux 4.14.31-041431-generic                  ▒    │ 
        │     1>1  Ubuntu, with Linux 4.14.31-041431-generic (upstart)        ▒    │ 
        │     1>2  Ubuntu, with Linux 4.14.31-041431-generic (recovery mode)  ▒    │ 
        │     1>3  Ubuntu, with Linux 4.14.30-041430-generic                  ▒    │ 
        │     1>4  Ubuntu, with Linux 4.14.30-041430-generic (upstart)        ▒    │ 
        │     1>5  Ubuntu, with Linux 4.14.30-041430-generic (recovery mode)  ▒    │ 
        │     1>6  Ubuntu, with Linux 4.14.27-041427-generic                  ▒    │ 
        │     1>7  Ubuntu, with Linux 4.14.27-041427-generic (upstart)        ▒    │ 
        │     1>8  Ubuntu, with Linux 4.14.27-041427-generic (recovery mode)  ▒    │ 
        │     1>9  Ubuntu, with Linux 4.14.24-041424-generic                  ▒    │ 
        │     1>10 Ubuntu, with Linux 4.14.24-041424-generic (upstart)        ▒    │ 
        │     1>11 Ubuntu, with Linux 4.14.24-041424-generic (recovery mode)  ▒    │ 
        │     1>12 Ubuntu, with Linux 4.14.23-041423-generic                  ▒    │ 
        │     1>13 Ubuntu, with Linux 4.14.23-041423-generic (upstart)        ↓    │ 
        │                                                                          │ 
        │                                                                          │ 
        │                   <Display Grub Boot>        <Exit>                      │ 
        │                                                                          │ 
        └──────────────────────────────────────────────────────────────────────────┘ 

Girişi vurgulayın ve Enter tuşuna basın

Bir seçeneği vurgulamak için gezinme tuşlarını kullanın ve Enteryükledikleri çekirdek öncesi sürücüleri grubve önyükleme grubyaparken çekirdeğe geçirilen önyükleme parametrelerini görmek için basın :

menuentry 'Ubuntu, with Linux 4.14.27-041427-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.14.27-041427-generic-advanced-f3f8e7bc-b337-4194-88b8-3a513f6be55b' {
recordfail
savedefault
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root f3f8e7bc-b337-4194-88b8-3a513f6be55b
else
search --no-floppy --fs-uuid --set=root f3f8e7bc-b337-4194-88b8-3a513f6be55b
fi
echo 'Loading Linux 4.14.27-041427-generic ...'
linux /boot/vmlinuz-4.14.27-041427-generic root=UUID=f3f8e7bc-b337-4194-88b8-3a513f6be55b ro quiet splash loglevel=0 vga=current udev.log-priority=3 fastboot kaslr acpiphp.disable=1 crashkernel=384M-2G:128M,2G-:256M $vt_handoff
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-4.14.27-041427-generic
}
Press <Enter> to continue

grub-menu.sh bash betiği

grub-menu.sh ince ayar yapmak için tek seçeneğiniz var:

# Default for hide duplicate and triplicate options with (upstart) and (recovery mode)?
HideUpstartRecovery=false

Değeri true(ekstra girişleri gizle) veya false(tüm girişleri listele) olarak ayarlayın.

Aşağıdakileri kullanarak betiği çağırırken varsayılan biçim geçersiz kılınabilir.

grub-menu.sh short

veya:

grub-menu.sh long

Kod:

#!/bin/bash

# NAME: grub-menu.sh
# PATH: $HOME/bin
# DESC: Written for AU Q&A: /ubuntu//q/1019213/307523
# DATE: Apr 5, 2018. Modified: July 27, 2019
# UPDT: Scroll bar was outside of dialog box. Move windo border line.

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
    exit 1
fi

# Send output to secondary terminal such that previous history isn't cleared on exit
tput smcup

AllMenusArr=()      # All menu options.
# Default for hide duplicate and triplicate options with (upstart) and (recovery mode)?
HideUpstartRecovery=false
if [[ $1 == short ]] ; then
    HideUpstartRecovery=true    # override default with first passed parameter "short"
elif [[ $1 == long ]] ; then
    HideUpstartRecovery=false   # override default with first passed parameter "long"
fi
SkippedMenuEntry=false  # Don't change this value, automatically maintained
InSubMenu=false     # Within a line beginning with `submenu`?
InMenuEntry=false   # Within a line beginning with `menuentry` and ending in `{`?
NextMenuEntryNo=0   # Next grub internal menu entry number to assign
# Major / Minor internal grub submenu numbers, ie `1>0`, `1>1`, `1>2`, etc.
ThisSubMenuMajorNo=0
NextSubMenuMinorNo=0
CurrTag=""          # Current grub internal menu number, zero based
CurrText=""         # Current grub menu option text, ie "Ubuntu", "Windows...", etc.
SubMenuList=""      # Only supports 10 submenus! Numbered 0 to 9. Future use.

while read -r line; do
    # Example: "           }"
    BlackLine="${line//[[:blank:]]/}" # Remove all whitespace
    if [[ $BlackLine == "}" ]] ; then
        # Add menu option in buffer
        if [[ $SkippedMenuEntry == true ]] ; then
            NextSubMenuMinorNo=$(( $NextSubMenuMinorNo + 1 ))
            SkippedMenuEntry=false
            continue
        fi
        if [[ $InMenuEntry == true ]] ; then
            InMenuEntry=false
            if [[ $InSubMenu == true ]] ; then
                NextSubMenuMinorNo=$(( $NextSubMenuMinorNo + 1 ))
            else
                NextMenuEntryNo=$(( $NextMenuEntryNo + 1 ))
            fi
        elif [[ $InSubMenu == true ]] ; then
            InSubMenu=false
            NextMenuEntryNo=$(( $NextMenuEntryNo + 1 ))
        else
            continue # Future error message?
        fi
        # Set maximum CurrText size to 68 characters.
        CurrText="${CurrText:0:67}"
        AllMenusArr+=($CurrTag "$CurrText")
    fi

    # Example: "menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu" ...
    #          "submenu 'Advanced options for Ubuntu' $menuentry_id_option" ...
    if [[ $line == submenu* ]] ; then
        # line starts with `submenu`
        InSubMenu=true
        ThisSubMenuMajorNo=$NextMenuEntryNo
        NextSubMenuMinorNo=0
        SubMenuList=$SubMenuList$ThisSubMenuMajorNo
        CurrTag=$NextMenuEntryNo
        CurrText="${line#*\'}"
        CurrText="${CurrText%%\'*}"
        AllMenusArr+=($CurrTag "$CurrText") # ie "1 Advanced options for Ubuntu"

    elif [[ $line == menuentry* ]] && [[ $line == *"{"* ]] ; then
        # line starts with `menuentry` and ends with `{`
        if [[ $HideUpstartRecovery == true ]] ; then
            if [[ $line == *"(upstart)"* ]] || [[ $line == *"(recovery mode)"* ]] ; then
                SkippedMenuEntry=true
                continue
            fi
        fi
        InMenuEntry=true
        if [[ $InSubMenu == true ]] ; then
            : # In a submenu, increment minor instead of major which is "sticky" now.
            CurrTag=$ThisSubMenuMajorNo">"$NextSubMenuMinorNo
        else
            CurrTag=$NextMenuEntryNo
        fi
        CurrText="${line#*\'}"
        CurrText="${CurrText%%\'*}"

    else
        continue    # Other stuff - Ignore it.
    fi

done < /boot/grub/grub.cfg

LongVersion=$(grub-install --version)
ShortVersion=$(echo "${LongVersion:20}")
DefaultItem=0

if [[ $HideUpstartRecovery == true ]] ; then
    MenuText="Menu No.     ----------- Menu Name -----------"
else
    MenuText="Menu No. --------------- Menu Name ---------------"
fi

while true ; do

    Choice=$(whiptail --clear \
        --title "Use arrow, page, home & end keys. Tab toggle option" \
        --backtitle "Grub Version: $ShortVersion" \
        --ok-button "Display Grub Boot" \
        --cancel-button "Exit" \
        --default-item "$DefaultItem" \
        --menu "$MenuText" 24 80 16 \
        "${AllMenusArr[@]}" \
        2>&1 >/dev/tty)

    clear
    if [[ $Choice == "" ]]; then break ; fi
    DefaultItem=$Choice

    for (( i=0; i < ${#AllMenusArr[@]}; i=i+2 )) ; do
        if [[ "${AllMenusArr[i]}" == $Choice ]] ; then
            i=$i+1
            MenuEntry="menuentry '"${AllMenusArr[i]}"'"
            break
        fi
    done

    TheGameIsAfoot=false
    while read -r line ; do
        if [[ $line = *"$MenuEntry"* ]]; then TheGameIsAfoot=true ; fi
        if [[ $TheGameIsAfoot == true ]]; then
            echo $line
            if [[ $line = *"}"* ]]; then break ; fi
        fi
    done < /boot/grub/grub.cfg

    read -p "Press <Enter> to continue"

done

# Restore output to primary terminal
tput rmcup

exit 0


8

Kesinlikle bu bir yıldan fazladır beni rahatsız ediyor - bu yüzden hızlı ve kirli bir senaryo yaptım. Umarım bu başkalarına yardımcı olur?

Bu isimleri bir push / pop kuyruğunda üst üste koyar, ancak menü indeksleme özelliği bu yüzden daha iyi olamazdı, ancak rahatsız edilebildiğim kadar ileri gittim.

gawk  'BEGIN {                                                                                                                       
  l=0                                                                                                                                
  menuindex= 0                                                                                                                       
  stack[t=0] = 0                                                                                                                     
}                                                                                                                                    

function push(x) { stack[t++] = x }                                                                                                  

function pop() { if (t > 0) { return stack[--t] } else { return "" }  }                                                              

{                                                                                                                                    

if( $0 ~ /.*menu.*{.*/ )                                                                                                             
{                                                                                                                                    
  push( $0 )                                                                                                                         
  l++;                                                                                                                               

} else if( $0 ~ /.*{.*/ )                                                                                                            
{                                                                                                                                    
  push( $0 )                                                                                                                         

} else if( $0 ~ /.*}.*/ )                                                                                                            
{                                                                                                                                    
  X = pop()                                                                                                                          
  if( X ~ /.*menu.*{.*/ )                                                                                                            
  {                                                                                                                                  
     l--;                                                                                                                            
     match( X, /^[^'\'']*'\''([^'\'']*)'\''.*$/, arr )                                                                               

     if( l == 0 )                                                                                                                    
     {                                                                                                                               
       print menuindex ": " arr[1]                                                                                                   
       menuindex++                                                                                                                   
       submenu=0                                                                                                                     
     } else                                                                                                                          
     {                                                                                                                               
       print "  " (menuindex-1) ">" submenu " " arr[1]                                                                               
       submenu++                                                                                                                     
     }                                                                                                                               
  }                                                                                                                                  
}                                                                                                                                    

}' /boot/grub/grub.cfg

Burada kutumdan çalıştığını gösteren bir ekran yakalama görebilirsiniz görüntü tanımını buraya girin

2019/8 tarihli bir yorumda istendiği gibi yukarıda "geçici bir önyükleme" yapmaktan bahsetmiştim. Bu fikir aslında benim betiğimde başlamıştı ve temp boot metodu başka bir gönderiden geldi ve böyle bir şeye gidiyor.

  1. GRUB_DEFAULT değerini GRUB_DEFAULT = olarak ayarlayın # vi /etc/default/grub
  2. / Boot içindeki grub config'i güncelle # sudo update-grub
  3. Yüklenecek varsayılan işletim sistemini ayarlayın (bu, makineyi her yeniden başlattığınızda yüklenir) # sudo grub-set-default 0
  4. Başka bir işletim sistemi yüklemeniz gerektiğinde (sayı /boot/grub/grub.cfg'deki gibi bir işletim sistemi menü numarasıdır, bu, diğer işletim sistemlerini bir sonraki yeniden başlatma sırasında yalnızca bir kez yükler - elle yeniden başlatma işlemi başlatılır): # sudo grub-reboot 4

Ref: https://ubuntuforums.org/showthread.php?t=1310463


+1 Cevabınızdaki pushve popkomutlarından hoşlanıyorum . Keşke cevabımı yazmadan önce onları bilseydim.
WinEunuuchs2Unix

Grub-tempboot.sh dosyasını paylaşır mısınız?
Autodidact

test1. GRUB_DEFAULT değerini GRUB_DEFAULT = olarak ayarlayın (/ etc / default / grub) 2. / boot #sudo update-grub içindeki grub config komutunu güncelleyin 3. Yüklemek için varsayılan işletim sistemini ayarlayın (makineyi her yeniden başlatışınızda bu yüklenir) # sudo grub -set-default 0 4. Başka bir işletim sistemi yüklemesi gerektiğinde (sayı /boot/grub/grub.cfg dosyasındaki gibi bir işletim sistemi menü numarasıdır, bu işletim sistemi bir sonraki yeniden başlatma sırasında yalnızca bir kez yüklenir - yeniden başlatma işlemi elle başlatılmalıdır): sudo grub-reboot 4
Lucien Murray-Pitts

3

Bu doğru "string" olmalı ...

awk -F\' '/^menuentry / {print $2}' /boot/grub/grub.cfg|cat -n|awk '{print $1-1,$1="",$0}'

Son boru her sıranın başında beyaz boşlukları siler ve numara sırasını grub numarası girişine göre düzeltir. Örnek çıktı:

0   Ubuntu
1   Memory test (memtest86+)
2   Memory test (memtest86+, serial console 115200)
3   Windows 10 (su /dev/sdc1)

Tüm girişleri görmek isterseniz, gelişmişleri de kullanabilirsiniz.

awk -F\' '/(^|| )nuentry / {print $2}' /boot/grub/grub.cfg|cat -n|awk '{print $1-1,$1="",$0}'

ancak sayılar dizisi, set-set-default ile kullanım için uygun değildir.


6
Bu sadece üst seviye menüyü gösterir. Gelişmiş Seçenekler alt menüsü eksik.
WinEunuuchs2Unix

1
Borulu komutlarının ne yaptığını ve kabul edilen cevaptan daha iyi olduğunu nasıl açıklayabilir misiniz ?
Melebius

Benim için bu giriş numaralarını da yazdırırken daha iyi çalıştı
Zac

2

Sadece veya tabgibi komutlarda otomatik tamamlama işlevini ( iki kez basarak ) kullanabileceğinizi öğrendim ve size mevcut önyükleme menüsü girişlerinin bir listesini verir. O zaman tam anlamıyla istediğiniz başlığı kopyalayabilirsiniz, bir sayı kullanmanıza gerek yoktur.grub-rebootgrub-set-default

Ne yazık ki, nedense, Windows 7 kurulumum bu şekilde görünmüyor.


1

Alt menüleri idare eden başka bir awk one-liner:

 awk -F\' '$1=="menuentry " || $1=="submenu " {print i++ " : " $2}; /\tmenuentry / {print "\t" i-1">"j++ " : " $2};' /boot/grub/grub.cfg

Bu, yanlış düşünülmüş olabilir, çünkü alt menü girişlerini tanımlamak için kullanılır.


0

OpenSuSE grub2-once diğer komutlarda kullanabileceğiniz menü kimliğini sağlar. Yine de Ubuntu kullanıcıları için pek yardım yok.

# grub2-once --list
     0 openSUSE Leap 42.3
     1 Advanced options for openSUSE Leap 42.3>openSUSE Leap 42.3, with Linux 4.4.172-86-default
     2 Advanced options for openSUSE Leap 42.3>openSUSE Leap 42.3, with Linux 4.4.172-86-default (recovery mode)
     3 Advanced options for openSUSE Leap 42.3>openSUSE Leap 42.3, with Linux 4.4.165-81-default
     4 Advanced options for openSUSE Leap 42.3>openSUSE Leap 42.3, with Linux 4.4.165-81-default (recovery mode)
     5 Advanced options for openSUSE Leap 42.3>openSUSE Leap 42.3, with Linux 4.4.159-73-default
     6 Advanced options for openSUSE Leap 42.3>openSUSE Leap 42.3, with Linux 4.4.159-73-default (recovery mode)
     7 openSUSE 42.1 (x86_64) (on /dev/sda8)
     8 Advanced options for openSUSE 42.1 (x86_64) (on /dev/sda8)>openSUSE Leap 42.1 (on /dev/sda8)
     9 Advanced options for openSUSE 42.1 (x86_64) (on /dev/sda8)>openSUSE Leap 42.1, with Linux 4.1.39-56-default (on /dev/sda8)
    10 Advanced options for openSUSE 42.1 (x86_64) (on /dev/sda8)>openSUSE Leap 42.1, with Linux 4.1.39-53-default (on /dev/sda8)
    11 Advanced options for openSUSE 42.1 (x86_64) (on /dev/sda8)>Install 42.3 (on /dev/sda8)

Muhtemelen grub2-once aldığın yeri paylaşmalısın
Charles Green

Bu ubuntu hakkında olmasına rağmen OpenSuSE kullanıyorum ve tüm grub v2 komutlarını grub2 - ???? olarak yüklüyor. Grub menü listesinin nasıl alınacağını ararken, linux lezzetine bakılmaksızın bulunan soru budur, bu yüzden cevabımın başkalarına yararlı olabileceğini düşündüm. Fark etmedim, grub2-once komutunun suse için benzersiz olduğu görülüyor (ubuntu'da eşdeğer grub-once yok). Bunu yansıtacak cevabımı değiştireceğim
Paranoid

Kullanışlı bir yardımcı program gibi görünüyor ...
Charles Green,
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.