GRUB:有什麼方法可以有第二次超時或選擇,或熱鍵?
我正在執行 openSUSE Tumbleweed(當我鍵入此內容時為 20120913,很可能在您閱讀它時會有所不同),核心 5.14.1-1-default,grub2 版本 2.06-6.1。如果我的硬體規格與此相關(除了我在華碩 Strix Z270F 主機板上使用 GF1080ti,使用 nvidia 驅動程序,版本 470.63.01,那麼請讓我知道,我會發布它們)。
無論如何,我正在雙啟動 Windows/Linux,大概是 60/40%。我正在從安裝 Linux 的驅動器上啟動(UEFI 但安全啟動關閉)(除非 Microsoft 認為它擁有我的電腦並在不詢問我的情況下更改啟動順序),並使用 YaST 將 Windows 引導載入程序設置為預設值,並且有超時(8 秒,可能不重要)。
問題是我有一個多顯示器設置,無論出於何種原因,顯卡都使用側顯示器作為預設顯示器(出現 BIOS,以及載入顯卡驅動程序之前的任何其他內容),即使很多時候該螢幕甚至沒有插入電源(當我不使用它時,不需要它成為能量吸血鬼)。這意味著 grub 只能在該螢幕上傳入,所以雖然我可以正常啟動 Windows(什麼都不做)或選擇一個選項(通過按鍵),所以我要麼必須插入並打開另一台顯示器,要麼盲目地嘗試在啟動菜單中選擇正確的東西(考慮到一些可用的選項,可能不是一個好主意)。打開另一台顯示器並不理想,因為這會使 KDE 自動將其切換為主顯示器,
那麼我在尋找什麼……有什麼方法可以設置grub,以便如果我取消初始倒計時,它會啟動另一個讓Linux成為預設倒計時?或者設置一個鍵,這樣我只需要在啟動時混合它,直到主顯示器打開並且我知道它正在啟動到 Linux?或者類似的東西……基本上是在grub中選擇(最好是特定的)非預設條目的盲目方式?
提前感謝您的回答!
向@shaola 大聲喊叫,為我指明了正確的方向!事實證明,至少在我的機器上不需要配置。原來 grub 已經內置了這些!當我注意到這一切已經出現時,我開始懷疑
/etc/grub.d/10_linux
:hotkey=1 incr_hotkey() { [ -z "$hotkey" ] && return expr $hotkey + 1 } print_hotkey() { keys="123456789abdfgijklmnoprtuvwyz" if [ -z "$hotkey" ]||[ $hotkey -eq 0 ]||[ $hotkey -gt 30 ]; then return fi echo "--hotkey=$(expr substr $keys $hotkey 1)" } linux_entry () { os="$1" version="$2" type="$3" args="$4" if [ -n "${linux_root_device_thisversion}" ]; then root_device="root=${linux_root_device_thisversion}" else root_device="" fi if [ -z "$boot_device_id" ]; then boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")" fi if [ x$type != xsimple ] ; then case $type in recovery) title="$(gettext_printf "%s, with Linux %s (recovery mode)" "${os}" "${version}")" ;; *) title="$(gettext_printf "%s, with Linux %s" "${os}" "${version}")" ;; esac if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ] || [ x"Previous Linux versions>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then replacement_title="$(echo "Advanced options for ${OS}" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')" quoted="$(echo "$GRUB_ACTUAL_DEFAULT" | grub_quote)" title_correction_code="${title_correction_code}if [ \"x\$default\" = '$quoted' ]; then default='$(echo "$replacement_title" | grub_quote)'; fi;" grub_warn "$(gettext_printf "Please don't use old title \`%s' for GRUB_DEFAULT, use \`%s' (for versions before 2.00) or \`%s' (for 2.00 or later)" "$GRUB_ACTUAL_DEFAULT" "$replacement_title" "gnulinux-advanced-$boot_device_id>gnulinux-$version-$type-$boot_device_id")" fi echo "menuentry '$(echo "$title" | grub_quote)' $(print_hotkey) ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/" hotkey=$(incr_hotkey) else echo "menuentry '$(echo "$os" | grub_quote)' $(print_hotkey) ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/" hotkey=$(incr_hotkey) fi if [ x$type != xrecovery ] ; then save_default_entry | grub_add_tab fi # Use ELILO's generic "efifb" when it's known to be available. # FIXME: We need an interface to select vesafb in case efifb can't be used. if [ "x$GRUB_GFXPAYLOAD_LINUX" = x ]; then echo " load_video" | sed "s/^/$submenu_indentation/" if grep -qx "CONFIG_FB_EFI=y" "${config}" 2> /dev/null \ && grep -qx "CONFIG_VT_HW_CONSOLE_BINDING=y" "${config}" 2> /dev/null; then echo " set gfxpayload=keep" | sed "s/^/$submenu_indentation/" fi else if [ "x$GRUB_GFXPAYLOAD_LINUX" != xtext ]; then echo " load_video" | sed "s/^/$submenu_indentation/" fi echo " set gfxpayload=$GRUB_GFXPAYLOAD_LINUX" | sed "s/^/$submenu_indentation/" fi echo " insmod gzio" | sed "s/^/$submenu_indentation/"
我並不是一個出色的程序員——事實上,我什至無法弄清楚它是什麼語言(除非它是自己的),但我推測列表中的每個項目都有一個自動遞增的熱鍵,並且我的 openSUSE 安裝在列表的頂部意味著我只需要
1
在啟動時混合併等待我的跡象沒有被一家想要模仿蘋果接管我生活的公司強迫進入作業系統載入 Linux。此外,如果您有像我這樣的設置(或者至少像我這樣)並且想嘗試@shaola 的想法,我必須執行
grub2-mkconfig
而不是grub-update
. 可能是發行版或版本類型的東西。絕對不是我的專業領域可以說。
Grub 2 支持熱鍵,所以你可以實現它。
如果您編輯 grub.cfg 並將參數 –hotkey=l 添加到菜單項,您將能夠獲得您正在尋找的內容。但是 /boot/grub.cfg 文件在執行 grub-update 時會被覆蓋。
我沒有雙啟動,所以我無法正確測試它,但編輯 /etc/grub.d/10_linux 在我的系統中成功了。
在該文件中找到此部分:
linux_entry () { os="$1" version="$2" type="$3" args="$4" if [ -z "$boot_device_id" ]; then boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")" fi if [ x$type != xsimple ] ; then case $type in recovery) title="$(gettext_printf "%s, with Linux %s (%s)" "${os}" "${version}" "$(gettext "${GRUB_RECOVERY_TITLE}")")" ;; init-*) title="$(gettext_printf "%s, with Linux %s (%s)" "${os}" "${version}" "${type#init-}")" ;; *) title="$(gettext_printf "%s, with Linux %s" "${os}" "${version}")" ;; esac if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ] || [ x"Previous Linux versions>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then replacement_title="$(echo "Advanced options for ${OS}" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')" quoted="$(echo "$GRUB_ACTUAL_DEFAULT" | grub_quote)" title_correction_code="${title_correction_code}if [ \"x\$default\" = '$quoted' ]; then default='$(echo "$replacement_title> grub_warn "$(gettext_printf "Please don't use old title \`%s' for GRUB_DEFAULT, use \`%s' (for versions before 2.00) or \`> fi echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | > else echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} --hotkey=l \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" |> fi if [ "$quick_boot" = 1 ]; then echo " recordfail" | sed "s/^/$submenu_indentation/" fi if [ x$type != xrecovery ] ; then save_default_entry | grub_add_tab fi
並將**–hotkey=l**參數添加到它所在的位置。執行 grub-update 並測試是否按 l boots straigth to linux