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

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

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

Я виделэтот вопросна форуме это именно то, что мне нужно, но это касается lilo, а это не мой случай.

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

(Кроме того, мне было бы интересно найти решение для загрузки из Windows напрямую в Linux, но это может оказаться сложнее и не относится к данной теме. В любом случае, пока у меня есть один способ, другой способ можно настроить по умолчанию.

ОБНОВЛЯТЬКажется, кто-то спросиланалогичный вопрос, и если это предлагаемые ответы, я могу также отредактировать /boot/grub/grubenvи сделать grub-rebootэто . )grub-set-defaultgrub-editenv

Заранее спасибо за любые советы.

ОБНОВЛЯТЬ:

Это моя версия GRUB:(GRUB) 1.99-12ubuntu5-1linuxmint1

Я попробовал запустить grubonce, команда не найдена. И поиск в репозиториях ничего не дал. У меня Linux Mint, так что это может быть оно...

Видя man grub-reboot, кажется, что он делает то, что я хочу, как и grubonceделает. Он также доступен везде (по крайней мере, для меня, я думаю, что он является частью пакета grub). Я увидел две связанные команды: 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, кажется, что это правильный путь, но по моим наблюдениям, он просто игнорирует эти настройки...

решение1

  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или .bash_aliasesможет выглядеть так:

    # Reboot directly to Windows
    # Inspired by http://askubuntu.com/questions/18170/how-to-reboot-into-windows-from-ubuntu
    reboot_to_windows ()
    {
        windows_title=$(grep -i windows /boot/grub/grub.cfg | cut -d "'" -f 2)
        sudo grub-reboot "$windows_title" && sudo reboot
    }
    alias reboot-to-windows='reboot_to_windows'
    

    Примечания редактора:

    • Я заменилустаревшие обратные кавычки( ``) по $(...)конструкции.

    • В общем, я переписал его, чтобы он соответствовал текущему моменту.POSIX (вики)стандартов, и по ходу дела внес еще несколько незначительных изменений.

    • Для полноты картины я оставил приведенную ниже функцию нетронутой для сравнения.


В случае, если ваш 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
}

решение2

Для того чтобы grub-rebootкоманда работала, необходимо внести несколько обязательных изменений в конфигурацию:

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

Это должно позаботиться о первоначальной настройке. В будущем просто сделайте это grub-reboot <entry>для одноразовой загрузки <entry>.

решение3

Я написал инструмент, который позволяет это сделать для Ubuntu 20.04/22.04: https://github.com/mendhak/grub-reboot-picker

введите описание изображения здесь

Возможно, это сработает на предыдущих версиях Ubuntu, но я никогда не проверял.

решение4

Согласен с @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» — это подменю.

Связанный контент