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


33

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

Я видел этот вопрос на форуме, это именно то, что я хочу, но он имеет дело с Лило, что не в моем случае.

Я подумал о решении, которое изменило бы запись по умолчанию в меню 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). Я видел две связанные команды: 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 станет автоматически доступным для другой задачи резервного копирования по расписанию в сетевых системах, которая подталкивает к rhel zfs raidz2. Затем, когда резервное копирование завершено, грязная система автоматически загружается обратно на игровую площадку сервера Windows Gamer iis до конца недели, промывает и повторяет. Это смена формы. :-)
Брайан Томас

Мне потребовалось много времени, чтобы заметить, что grub-reboot молча завершается неудачей, давая код возврата успеха. Я надеюсь, что мое предложенное редактирование в порядке. :-)
Никто

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.
Ян Влчинский

Это должно быть помечено как правильный ответ.
Таха Рехман Сиддики

Функция полезнее, чем я думал.
Карсон Ип

2

Супер простой способ сделать это с помощью GRUB Reboot Shell Расширение GNOME (то есть, если вы используете GNOME).

Чтобы использовать расширение, перейдите на сайт, указанный выше, и нажмите на маленький переключатель в верхнем правом углу (он, вероятно, говорит «Выкл.» При первом переходе на страницу). Вам будет предложено подтвердить, что вы хотите загрузить и установить расширение.

После установки вы можете открыть системное меню и нажать кнопку питания, как обычно, для перезагрузки. Появляющееся окно, подтверждающее, что вы хотите выключить или перезапустить, теперь имеет кнопку с надписью «Перезапустить на ...». Когда вы нажимаете эту кнопку, элементы в вашем меню grub появляются в списке, так что вы можете выбрать, какую ОС автоматически запускать после перезапуска. Если вы выберете один из этих элементов, ваша система выключится и перезапустится с использованием выбранных вами опций grub.


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


Это на самом деле часть grub и trustgrub (что бы это ни было), а не grub2, поэтому я не установил его на
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. Он просто продолжал возвращаться к исходному меню Grub, как будто ничего не было сделано.

Так что я закончил делать это вручную, и это работало (хотя я не уверен, как это будет работать с дисками RAID).

sudo grub-editenv - set next_entry=2
reboot

Где 2 - это пункт меню, начинающийся с нуля, для пункта Windows в меню запуска grub.

Вы можете понять, почему это работает, посмотрев на /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.