কমান্ড-লাইনে GRUB- র "মেনুমেন্টারিগুলি" তালিকাভুক্ত করবেন কীভাবে?


22

GRUB এর "মেনুয়েন্ট্রি" শিরোনামগুলির তালিকা পুনরুদ্ধার করার কোনও উপায় আছে কি?

আমার এমন ফর্ম্যাটে ফলাফল দরকার যা grub-set-defaultগ্রহণ করবে। যেমন।

"Ubuntu"
"Memory test (memtest86+)"
etc.

উত্তর:


31

ব্যবহার awk

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

আপনাকে সমস্ত মেনু প্রবেশের একটি সম্পূর্ণ তালিকা দেয় grub.cfg


1
আপনাকে awk এ পাইতে গ্রেপ লাগাতে হবে না, awk প্যাটার্নটি / foo /
প্যান্থার

1
awk -F\' '/menuentry / {print $2}' /boot/grub/grub.cfg
প্যান্থার

এবি আমি @ বোধি জাজেন এর সাথে একমত । আপনি যদি সম্পাদনা করেন এবং আমাকে একটি নোট রেখে দেন তবে আমি ফিরে এসে উড়ে যাব!
ফাব্বি

@ ফ্যাবাই আপনার জন্য একটি নোট ওএমজি এগুলি আমার সাথে প্রথম পদক্ষেপ ছিল awk। : \
এবি

3
: প্রবেশ সংখ্যা আউটপুট যোগ করুন awk -F\' '/menuentry / { print i++, $2}' /boot/grub/grub.cfgজন্য ব্যবহার করতেgrub-set-default
mikezter

8

রঙিন স্ক্রিন শট (সংক্ষিপ্ত সংস্করণ)

মাউস স্ক্রল ব্যবহার চাকা Home, End, PgUp, PgDn, এবং কী মেনু নেভিগেট করতে।

grub-menu.sh

পাঠ্য স্ক্রিন শট (দীর্ঘ সংস্করণ)

বাশ স্ক্রিপ্ট মেনু প্রদর্শন করার whiptailপরিবর্তে ব্যবহার করে dialog। একটি সুবিধা হ'ল আপনি টার্মিনাল চিত্রটি ক্লিপবোর্ডে পাঠ্য হিসাবে অনুলিপি করতে এবং পাঠ্য হিসাবে এই ওয়েবসাইটে এটি আটকে দিতে পারেন। অন্যান্য সুবিধার মধ্যে রয়েছে:

  • মাউস স্ক্রোল হুইল সমর্থন
  • দ্রুত পারফরম্যান্স
  • dialogউবুন্টু সার্ভার বা লুবুন্টুতে ডিফল্টরূপে ইনস্টল করা নেই। whiptailডিফল্ট হিসাবে অন্তর্ভুক্ত করা হয়।

এখানে একটি পাঠ্য স্ক্রিন শট রয়েছে:

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>                      │ 
        │                                                                          │ 
        └──────────────────────────────────────────────────────────────────────────┘ 

এন্ট্রি হাইলাইট করুন এবং এন্টার টিপুন

কোনও বিকল্প হাইলাইট করার জন্য নেভিগেশন কীগুলি ব্যবহার করুন এবং প্রার্ন Enterকার্নেল দ্বারা চালিত ড্রাইভারগুলি grubএবং বুট করার সময় বুট পরামিতিগুলি grubকার্নেলের কাছে দিয়ে গেছে তা দেখতে টিপুন :

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 বাশ স্ক্রিপ্ট

grub-menu.sh টুইট করার কেবল একটি বিকল্প রয়েছে:

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

true(অতিরিক্ত এন্ট্রিগুলি গোপন করুন) বা false(সমস্ত এন্ট্রি তালিকাবদ্ধ করুন) এ মান সেট করুন ।

স্ক্রিপ্টটি কল করার সময় ডিফল্ট ফর্ম্যাটটি ওভাররাইড করা যেতে পারে:

grub-menu.sh short

বা:

grub-menu.sh long

কোড:

#!/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

ঠিক এক বছর ধরে এটি আমাকে বিরক্ত করছে - তাই আমি এটি করার জন্য একটি দ্রুত এবং নোংরা স্ক্রিপ্ট করেছি। আশা করি এটি অন্যকে সাহায্য করবে?

এটি একটি পুশ / পপ সারিতে নামগুলি স্ট্যাক করে তবে মেনু সূচীকরণ না করে এটি আরও ভাল হতে পারে তবে আমি যতটা বিরক্ত হতে পারি ততই এগিয়ে চলেছি।

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

এখানে আপনি আমার বক্স থেকে একটি স্ক্রিন দখল দেখতে পেয়ে যাচ্ছেন এটি চলমান দেখাচ্ছে এখানে চিত্র বর্ণনা লিখুন

যেমন 2019/8 থেকে একটি মন্তব্যে জিজ্ঞাসা করা হয়েছে আমি উপরে "টেম্প বুট" করার কথা উল্লেখ করেছি। এই ধারণাটিই মূলত আমার স্ক্রিপ্টটি শুরু হয়েছিল এবং অস্থায়ী বুট পদ্ধতিটি অন্য পোস্ট থেকে এসেছে এবং এটি এরকম কিছু হয়

  1. GRUB_DEFAULT সেট করুন GRUB_DEFAULT = সংরক্ষণ করা হয়েছে # vi /etc/default/grub
  2. / বুটে গ্রাব কনফিগারেশন আপডেট করুন # sudo update-grub
  3. লোড করতে ডিফল্ট ওএস সেট করুন (আপনি যখনই মেশিনটি রিবুট করবেন তখন এটি লোড হবে) # sudo grub-set-default 0
  4. যখন অন্য ওএস লোড করার প্রয়োজন হয় (/boot/grub/grub.cfg হিসাবে ওএসের মেনু সংখ্যাটি হয়, এটি পরবর্তী পুনরায় বুট করার সময় কেবলমাত্র অন্য ওএস লোড করবে - পুনরায় বুট ম্যানুয়ালি শুরু করতে হবে): # sudo grub-reboot 4

রেফ: https://ubuntuforums.org/showthread.php?t=1310463


+1 আমি আপনার উত্তরে আদেশ pushএবং popআদেশ পছন্দ করি । আমার উত্তর লেখার আগে আমি তাদের জানতাম ish
WinEunuuchs2Unix

আপনি কি grub-tempboot.sh ভাগ করতে পারেন?
অটোডিড্যাক্ট

test১. GRUB_DEFAULT = GRUB_DEFAULT = সেভ (/ ইত্যাদি / ডিফল্ট / গ্রাব) এ সেট করুন 2. / বুট # সুডো আপডেট-গ্রুবে গ্রাব কনফিগারেশন আপডেট করুন ৩. লোড করতে ডিফল্ট ওএস সেট করুন (এটি প্রতিবার মেশিন রিবুট করার সময় লোড হবে) # সুডো গ্রাব -set-default 0 4. যখন অন্যান্য ওএস লোড করার প্রয়োজন হয় (সংখ্যাটি /boot/grub/grub.cfg হিসাবে ওএসের মেনু সংখ্যা, এটি পরবর্তী পুনরায় বুট করার সময় অন্য ওএস লোড করবে - পুনরায় বুট ম্যানুয়ালি শুরু করা হবে): sudo গ্রাব-রিবুট 4
লুসিয়ান মারে-পিটস

3

এটি সঠিক "স্ট্রিং" হওয়া উচিত ...

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

সর্বশেষ পাইপ প্রতিটি সারির শুরুতে সাদা স্থান মুছুন এবং গ্রাব নম্বর এন্ট্রি অনুসারে নম্বর ক্রমটি সংশোধন করুন। নমুনা আউটপুট:

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

আপনি যদি সমস্ত এন্ট্রি দেখতে চান তবে উন্নত এছাড়াও আপনি ব্যবহার করতে পারেন

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

তবে সংখ্যা ক্রমটি গ্রাব-সেট-ডিফল্টর সাথে ব্যবহারের জন্য উপযুক্ত নয়।


6
এটি কেবল শীর্ষ স্তরের মেনু দেখায়। অগ্রণী বিকল্পসমূহ উপ-মেনু অনুপস্থিত।
WinEunuuchs2Unix

1
পাইপযুক্ত আদেশগুলি কী করবে এবং গৃহীত উত্তরের চেয়ে এটি কীভাবে ভাল তা আপনি ব্যাখ্যা করতে পারেন ?
মেলবিয়াস

আমার জন্য, এটি আরও ভাল কাজ করেছে কারণ এটি এন্ট্রি নম্বরগুলিও প্রিন্ট করে
জাক

2

আমি শুধু জানতে পারলেন যে আপনি শুধু স্বয়ং-সম্পূর্ণ (টিপে ব্যবহার করতে পারেন tabমত কমান্ড দুইবার) grub-rebootবা grub-set-defaultএবং এটি আপনি উপলব্ধ বুট মেনু এন্ট্রি একটি তালিকা দেব। তারপরে আপনি কেবল আপনার শিরোনামটি আক্ষরিকভাবে অনুলিপি করতে পারেন, আপনার একটি নম্বর ব্যবহার করার দরকার নেই।

দুর্ভাগ্যক্রমে, কোনও কারণে আমার উইন্ডোজ 7 ইনস্টলেশনটি সেভাবে দেখায় না।


1

অন্য একটি অবারিত ওয়ান-লাইনার যা সাবম্যানাস পরিচালনা করে:

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

এটি ফলস্বরূপ চিন্তাভাবনা হতে পারে, কারণ men t সাবমেনু এন্ট্রি সনাক্ত করতে ব্যবহৃত হয়।


0

ওপেনসুএস-এ গ্রুব -2 একবার মেনু আইডি সরবরাহ করে যা আপনি অন্য কমান্ডগুলিতে ব্যবহার করতে পারেন। যদিও উবুন্টু ব্যবহারকারীদের জন্য খুব বেশি সহায়তা নেই।

# 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)


যদিও এটি উবুন্টু সম্পর্কে আমি ওপেনসুএসই ব্যবহার করি এবং এটি গ্রাব 2 হিসাবে সমস্ত গ্রাব ভি 2 কমান্ড ইনস্টল করে - ???? যখন আমি গ্রাব মেনু তালিকাটি কীভাবে পাবেন তা অনুসন্ধান করতে গিয়ে এটি এমন প্রশ্ন যা লিনাক্সের স্বাদ নির্বিশেষে পাওয়া যায় তাই আমি বুঝতে পেরেছিলাম আমার প্রতিক্রিয়া অন্যের পক্ষে সহায়ক হতে পারে। আমি যা বুঝতে পারি নি তা হ'ল গ্রুব-একবার-কমান্ডটি মামলা করার পক্ষে অনন্য বলে মনে হয় (উবুন্টুতে একবারের সমান গ্রুব নয়)। আমি এটি প্রতিফলিত করতে আমার উত্তরটি সংশোধন করব
প্যারানয়েড

হ্যান্ডি ইউটিলিটির মতো মনে হচ্ছে ...
চার্লস গ্রিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.