Як я можу сказати GRUB, що хочу перезавантажитись у Windows - перед перезавантаженням?


33

У мене встановлена ​​система подвійного завантаження Linux / Windows і часто перемикаюся з одного на інший. Я думав, чи зможу я додати пункт меню в одне з меню, щоб перезавантажитись безпосередньо у вікна, не зупиняючись на підказці GRUB.

Я бачив це питання на форумі, саме цього я хочу, але це стосується lilo, що не в моєму випадку.

Я подумав про рішення, яке могло б змінити запис за замовчуванням у меню GRUB, а потім перезавантажити, але є деякі недоліки, і мені було цікаво, чи є чистіша альтернатива.

(Також я був би зацікавлений у рішенні для завантаження з Windows безпосередньо в Linux, але це може бути складніше, і тут не належить. Як би там не було, якщо я маю це в один спосіб, інший спосіб може бути налаштований як за замовчуванням.

ОНОВЛЕННЯ Здається , хто - то поставив таке запитання , і якщо такі запропоновані відповіді, я міг би також редагувати , /boot/grub/grubenvяк grub-rebootі grub-set-defaultі grub-editenvробити. )

Заздалегідь дякую за будь-які поради.

ОНОВЛЕННЯ :

Це моя версія GRUB: (GRUB) 1.99-12ubuntu5-1linuxmint1

Я спробував запустити grubonce, команда не знайдена. І пошук його у сховищах мені нічого не дає. Я на Linux Mint, так що це може бути ...

Побачивши man grub-reboot, здається, це робить те, що я хочу, так і grubonceробить. Він також доступний скрізь (принаймні, це для мене, я думаю, що це частина пакету грубів). Я побачив дві пов’язані команди: grub-editenvі grub-set-default.

Я з’ясував, що після бігу під sudo grub-set-default 4час бігу grub-editenv listви отримуєте щось подібне до:

saved_entry=4

А під час бігу grub-reboot 4ви отримуєте щось на кшталт:

prev_saved_entry=0
saved_entry=4

Що означає, що обидва роблять те саме (одна тимчасова, а ні).

Дивно, коли я спробував:

sudo grub-reboot 4
sudo reboot now

Це не спрацювало, наче я нічого не зробив, він просто показав мені меню, як зазвичай, і вибрав перший запис, сказавши, що він завантажить цей запис через 10 с.

Я спробував це ще раз, я вважав, що, можливо, написав неправильний запис (це нульова основа, правда?). У той час він просто завис на екрані меню, і мені довелося жорстко скинути ПК, щоб мати можливість завантажуватися.

Якщо хтось може спробувати це, просто побачити, чи це тільки я, я би вдячний. (монетний двір дав мені важкий час, і це було б гарним приводом для зміни: P).

Читання коду в /boot/grub/grub.cfg, здається, це шлях, але, з моїх спостережень, це просто ігнорування цих налаштувань ...


на якому дистрибутиві? Я думаю, у мене це працює над моїм Debian.
jw013

Відповіді:


20

Для того, щоб grub-rebootкоманда працювала, повинно бути кілька необхідних змін конфігурації:

  • За замовчуванням для grub має бути встановлено значення saved. Одне можливе місце для цього - GRUB_DEFAULT=рядок в/etc/default/grub
  • Використовуйте grub-set-defaultдля встановлення за замовчуванням тієї, яку ви зазвичай використовуєте.
  • Оновіть конфігурацію grub (наприклад update-grub).

Це повинно подбати про початкові налаштування. Надалі просто зробіть grub-reboot <entry>для одноразового завантаження <entry>.


Я бачу ур слова "за замовчуванням для grub повинен бути встановлений saved", в той час як моє зберігання GRUB_DEFAULT=0також вистачило. Так це savedзайве?
zhangxaochen

Я не впевнений, що якщо всі розуміють, наскільки класною є ця функція насправді, я планую завантажувати win7ult64 з rhel64, і навпаки, в той час, як Rhel стане автоматичним для чергового завдання з резервного резервного копіювання, що виграє, що підштовхує rahel zfs raidz2. Потім, коли резервне копіювання завершено, система, що висипається, автоматично завантажується в ігровий майданчик сервера Windows на іншу частину тижня, промийте та повторіть. Його зміна форми. :-)
Брайан Томас

Мені довелося віками помітити, що grub-перезавантаження мовчить невдало, даючи код повернення успіху. Я сподіваюся, що моя запропонована редакція в порядку. :-)
Ніхто

23
  1. Відредагуйте / etc / default / grub та замініть GRUB_DEFAULT=0наGRUB_DEFAULT=saved
  2. sudo update-grub
  3. ваша команда буде:

    sudo grub-reboot "$(grep -i 'windows' /boot/grub/grub.cfg|cut -d"'" -f2)" && sudo reboot
    

буде виглядати гарна функція у вашому ~ / .bashrc

# ******************************************************************
# reboot directly to windows 
#   Inspired by http://askubuntu.com/questions/18170/how-to-reboot-into-windows-from-ubuntu
# ******************************************************************
function my_reboot_to_windows {
    WINDOWS_TITLE=`grep -i 'windows' /boot/grub/grub.cfg|cut -d"'" -f2`
    sudo grub-reboot "$WINDOWS_TITLE"
    sudo reboot
}

Якщо ваш grub.conf містить кілька рядків для Windows, наступні функції будуть дбати лише про рядки, починаючи з menuentryта вибираючи лише перший, посилаючись на Windows:

function my_reboot_to_windows {
    WINDOWS_TITLE=`grep -i "^menuentry 'Windows" /boot/grub/grub.cfg|head -n 1|cut -d"'" -f2`
    sudo grub-reboot "$WINDOWS_TITLE"
    sudo reboot
}

Мій файл /boot/grub/grub.cfgмістить більше рядків із "Windows" в ньому, багато з них констатують щось на зразок ...=1 i915.semaphores=1 acpi_osi='!Windows 2012' $vt..., тому я припускаю, що ваш код не зможе на ньому. Це можна виправити, натиснувши на ^menuentry 'Windows.
Ян Вльчинський

Це слід позначити як правильну відповідь.
Taha Rehman Siddiqui

Функція корисніша, ніж я думав.
Карсон Іп

2

Це дуже простий спосіб зробити це за допомогою GRUB Reboot GNOME Shell Extension (тобто якщо ви використовуєте GNOME).

Щоб скористатися розширенням, перейдіть на веб-сайт, пов’язаний вище, і натисніть маленьке перемикання у верхньому правому куті (воно, ймовірно, говорить "Вимкнено", коли ви вперше переходите на сторінку). Вам буде запропоновано підтвердити, що ви хочете завантажити та встановити розширення.

Після його встановлення ви можете відкрити своє системне меню та натиснути кнопку живлення, як зазвичай для перезапуску. З'явиться вікно, яке підтверджує, що ви хочете вимкнути або перезапустити, тепер є кнопка з написом "Перезапустити до ...". Коли ви натискаєте на цю кнопку, в списку відображаються елементи у вашому меню, щоб ви могли вибрати, яку ОС автоматично запустити після перезавантаження. Якщо ви вибрали один із цих елементів, ваша система вимкнеться та перезавантажиться за допомогою вибраних вами опцій для виходу.


1
Я відредагував свою публікацію, щоб включити подробиці про встановлення та використання розширення.
Ділан Сміт

1

Я використовую openSUSE, який поставляється із сценарієм під назвою grubonce, який робить саме те, що вам потрібно - встановити grub запис, який буде використаний при наступному перезавантаженні.

# grubonce
0: Trace -- openSUSE 12.1 - 3.1.10-1.16
1: Debug -- openSUSE 12.1 - 3.1.10-1.16
2: Desktop -- openSUSE 12.1 - 3.1.10-1.16
3: Failsafe -- openSUSE 12.1 - 3.1.10-1.16

# grubonce 0
Using entry #0: Trace -- openSUSE 12.1 - 3.1.10-1.16

# grubonce 2
Using entry #2: Desktop -- openSUSE 12.1 - 3.1.10-1.16

Я не знаю, які (якщо такі є) інші дистрибутиви доставляють цей сценарій, тому, якщо у вашому дистрибутиві його немає, ви можете перевірити цю сторінку:

http://sidvind.com/wiki/GRUB:_Boot_another_OS_once


Її фактично є частиною грязі та довіреної чагарнику (що б там не було), а НЕ grub2, тому я не маю її встановити на перепони червня 2019
redanimalwar

1

grub-set-defaultздається доступнішим ( grubonceне вказаний у вірші Ubuntu). Це також може бути кориснішим, оскільки Windows 7 має звичку виконувати перезавантаження під час запуску, якщо оновлення застосовувалися при останньому відключенні (тобто воно починається при запуску, обробляє деякі дані оновлення, перезавантажує і потім відображає сторінку входу).
Я часто запускав Windows 7 лише для того, щоб повернутися і знайти Ubuntu під керуванням.


1
Я вимкнув оновлення Windows, так що це не повинно бути проблемою: D, я спробую це. З того, що я побачив, здається, що це робить те саме, що і grub-reboot. Я редагую своє запитання більш докладно. Все одно, дякую.
jadkik94

1

У Fedora можна використовувати наступний скрипт. Зауважте, що це здебільшого те саме, що описано в https://askubuntu.com/a/18186/149422 , з кількома модифікаціями для GRUB 2 у Fedora .

#!/bin/bash
if [ `readlink /boot/grub2/grubenv` == "/boot/efi/EFI/fedora/grubenv" ]; then
    sudo mv /boot/grub2/grubenv /boot/grub2/grubenv-original
    sudo ln -s ../efi/EFI/fedora/grubenv /boot/grub2/grubenv
fi
MENU_ENTRY=`grep ^menuentry /boot/grub2/grub.cfg  | grep --line-number Windows`
MENU_NUMBER=$(( `echo $MENU_ENTRY | sed -e "s/:.*//"` - 1 ))
sudo grub2-reboot $MENU_NUMBER
sudo reboot

1

Я використовую Ubuntu 16.04 і вище рішення не працюють для мене ... за якою - то причини , sudo grub-reboot 2здавалося , ніколи не оновити /boot/grub/grubenvфайл, навіть після того, як зміни GRUB_DEFAULT=0в GRUB_DEFAULT=savedв обох /etc/default/grubі /boot/grub/menu.lst. Використання savedefault --default=2 --onceкоманди в grub також, здається, не працює і не змінює файл grubenv. Він просто продовжував повертатися до оригінального меню, немовби нічого не було зроблено.

Тому я закінчив це вручну, і він працює (не впевнений, як це буде працювати з RAID-накопичувачами).

sudo grub-editenv - set next_entry=2
reboot

Де 2 - нульове місце введення меню для запису Windows у меню запуску.

Ви можете зрозуміти, чому це працює, переглянувши /boot/grub/grub.cfgфайл, оскільки він використовує значення next_entry, а потім скидає його для наступного завантаження.


0

Погодьтеся з @ jw013. Також ви можете надати плитці меню grub-reboot (включаючи назву батьківського меню). наприклад:

$ sudo grub-reboot "Advanced options for Ubuntu>Ubuntu, with Linux 4.13.0-26-generic"
$ sudo reboot

Де "Розширені параметри для Ubuntu" є батьківським меню, "Ubuntu, з Linux 4.13.0-26-generic" є підменю.


0

Перезавантажте машину до конкретної цілі завантаження (запис Grub).
Ціль завантаження інтерактивно вибирається за допомогою fzf.

# Search for grub.cfg
GRUB_CFG=$(find /boot -name grub.cfg 2> /dev/null)

if [[ -z ${GRUB_CFG} ]]; then
  echo "No grub.cfg found under /boot. Try as root."
  exit 1
elif [[ ! -r ${GRUB_CFG} ]]; then
  echo "${GRUB_CFG} is not readable. Try as root."
  exit 1
fi

GRUB_MENUENTRY=$(awk -F\' '/menuentry / {print $2}' ${GRUB_CFG} | fzf)

# Set boot target for next boot
grub2-reboot "${GRUB_MENUENTRY}"

reboot
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.