Como posso dizer ao GRUB que quero reiniciar o Windows - antes de reiniciar?

33

Eu tenho um sistema Linux / Windows de inicialização dupla configurado e frequentemente alterno de um para o outro. Eu estava pensando se poderia adicionar um item de menu em um dos menus para reiniciar diretamente no Windows, sem parar no prompt do GRUB.

Eu vi essa pergunta em um fórum, é exatamente isso que eu quero, mas está lidando com o lilo, que não é o meu caso.

Pensei em uma solução que modificaria a entrada padrão no menu GRUB e, em seguida, reiniciaria, mas existem algumas desvantagens e fiquei pensando se havia uma alternativa mais limpa.

(Além disso, eu estaria interessado em uma solução para inicializar do Windows diretamente no Linux, mas isso pode ser mais difícil e não pertence aqui. Enfim, contanto que eu a tenha de uma maneira, a outra maneira poderá ser o padrão.

ATUALIZAÇÃO Parece que alguém pediu uma pergunta semelhante , e se essas são as respostas sugeridas, assim como eu poderia editar /boot/grub/grubenvcomo grub-reboote grub-set-defaulte grub-editenvfazer. )

Agradecemos antecipadamente por todas as dicas.

ATUALIZAÇÃO :

Esta é a minha versão do GRUB: (GRUB) 1.99-12ubuntu5-1linuxmint1

Eu tentei correr grubonce, o comando não foi encontrado. E procurá-lo nos repositórios não me dá nada. Estou no Linux Mint, então pode ser ...

Vendo man grub-reboot, parece que faz o que eu quero, como gruboncefaz. Também está disponível em todos os lugares (pelo menos é para mim, acho que faz parte do pacote grub). Eu vi dois comandos relacionados: grub-editenve grub-set-default.

Eu descobri que depois de executar sudo grub-set-default 4, ao executar, grub-editenv listvocê obtém algo semelhante a:

saved_entry=4

E ao executar grub-reboot 4, você obtém algo como:

prev_saved_entry=0
saved_entry=4

O que significa que ambos fazem a mesma coisa (um é temporário, um não é).

Surpreendentemente, quando tentei:

sudo grub-reboot 4
sudo reboot now

Não funcionou, como se eu não tivesse feito nada, apenas me mostrou o menu como de costume e selecionou a primeira entrada, dizendo que a inicialização será iniciada em 10s.

Tentei novamente, pensei que poderia ter escrito a entrada errada (é baseada em zero, certo?). Naquele momento, ele simplesmente travou na tela do menu e eu tive que reiniciar o PC com força para poder inicializar.

Se alguém puder tentar isso, apenas para ver se sou apenas eu, eu agradeceria. (a casa da moeda está me dando dificuldades, e seria uma boa ocasião para mudar: P).

Lendo o código /boot/grub/grub.cfg, parece que este é o caminho a seguir, mas pelas minhas observações, ele está apenas ignorando essas configurações ...

jadkik94
fonte
em que distro você está? Eu acho que tenho isso funcionando no meu Debian.
jw013

Respostas:

20

Para que o grub-rebootcomando funcione, várias alterações de configuração necessárias devem estar em vigor:

  • A entrada padrão para o grub deve ser definida como saved. Um local possível para isso é a GRUB_DEFAULT=linha em/etc/default/grub
  • Use grub-set-defaultpara definir sua entrada padrão para a que você normalmente usa.
  • Atualize sua configuração do grub (por exemplo update-grub).

Isso deve cuidar da configuração inicial. No futuro, basta fazer o grub-reboot <entry>boot de uma só vez <entry>.

jw013
fonte
Vejo suas palavras "a entrada padrão do grub deve ser definida como saved", enquanto minha manutenção GRUB_DEFAULT=0também foi suficiente. Então é saveddesnecessário?
Zhangxaochen
Não tenho certeza se todo mundo percebe o quão legal é esse recurso, planejo inicializar o win7ult64 com o rhel64 e vice-versa, enquanto o rhel se torna disponível automaticamente para outra tarefa de backup agendado dos sistemas em rede do win, que leva ao rhel zfs raidz2. Depois que o backup estiver concluído, o sistema arrancado será inicializado automaticamente no playground do servidor Windows Gamer iis pelo resto da semana, enxágue e repita. É um trocador de forma. :-)
Brian Thomas
Levei séculos para perceber que o grub-reboot falha silenciosamente, fornecendo um código de retorno bem-sucedido. Espero que minha edição sugerida esteja ok. :-)
Ninguém
23
  1. Edite o / etc / default / grub e substitua GRUB_DEFAULT=0porGRUB_DEFAULT=saved
  2. sudo update-grub
  3. seu comando será:

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

uma função bonita no seu ~ / .bashrc parecerá

# ******************************************************************
# 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
}

Caso o seu grub.conf contenha várias linhas para Windows, as funções a seguir se ocuparão apenas das linhas iniciando menuentrye escolhendo apenas a primeira, referente ao 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
}
Philippe Gachoud
fonte
Meu arquivo /boot/grub/grub.cfgcontém mais linhas com o "Windows", muitas delas informando algo como ...=1 i915.semaphores=1 acpi_osi='!Windows 2012' $vt..., então eu presumo que o seu código falhe. Isso pode ser corrigido com grepping para ^menuentry 'Windows.
Jan Vlcinsky
Isso deve ser marcado como a resposta correta.
Taha Rehman Siddiqui
A função é mais útil do que eu pensava.
Carson Ip
2

Uma maneira super fácil de fazer isso é com a extensão de shell de reinicialização do GNOME do GRUB (ou seja, se você estiver usando o GNOME).

Para usar a extensão, acesse o site vinculado acima e clique na pequena alternância no canto superior direito (provavelmente indica Desligado quando você navega pela primeira vez na página). Você será solicitado a confirmar que deseja baixar e instalar a extensão.

Depois de instalado, você pode abrir o menu Sistema e clicar no botão liga / desliga, como faria normalmente para reiniciar. A janela exibida confirmando que você deseja desligar ou reiniciar agora tem um botão chamado "Reiniciar em ...". Quando você clica nesse botão, os itens no menu grub aparecem na lista para que você possa selecionar qual SO iniciar automaticamente após reiniciar. Se você selecionar um desses itens, seu sistema será desligado e reiniciado usando as opções selecionadas do grub.

Dylan Smith
fonte
1
Editei minha postagem para incluir detalhes de instalação e uso da extensão.
Dylan Smith
1

Eu uso o openSUSE, que vem com um script chamado grubonce, que faz exatamente o que você precisa - configure a entrada do grub para ser usada na próxima reinicialização.

# 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

Não sei quais (se houver) outras distribuições enviam esse script; portanto, caso sua distribuição não o tenha, você pode conferir esta página:

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

Petr Uzel
fonte
É realmente parte do grub e do trustgrub (seja o que for) e NÃO do grub2, então eu não o tenho instalado no tumbleweed junho de 2019
redanimalwar
1

grub-set-defaultparece mais disponível ( gruboncenão está listado no verso do Ubuntu). Também pode ser mais útil, pois o Windows 7 tem o hábito de executar uma reinicialização durante a inicialização, se as atualizações foram aplicadas no último desligamento (ou seja, inicia a inicialização, processa alguns dados de atualização, reinicializa e exibe a página de logon).
Muitas vezes iniciei o Windows 7 apenas para voltar e encontrar o Ubuntu em execução.

Charlesbridge
fonte
1
Desliguei a atualização do Windows, para que isso não seja um problema: D, vou tentar isso. Pelo que vi, parece que isso faz a mesma coisa que grub-reboot. Estou editando minha pergunta com mais detalhes. Obrigado mesmo assim.
jadkik94
1

No Fedora, você pode usar o seguinte script. Observe que isso é basicamente o mesmo descrito em https://askubuntu.com/a/18186/149422 , com algumas modificações no GRUB 2 no 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
Roy Hyunjin Han
fonte
1

Estou usando o Ubuntu 16.04 e as soluções acima não funcionaram para mim ... por algum motivo sudo grub-reboot 2nunca pareceu atualizar o /boot/grub/grubenvarquivo, mesmo depois de mudar GRUB_DEFAULT=0para GRUB_DEFAULT=savedambos /etc/default/grube /boot/grub/menu.lst. O uso do savedefault --default=2 --oncecomando no grub também não pareceu funcionar nem alterou o arquivo grubenv. Ele continuava voltando ao menu original do grub como se nada tivesse sido feito.

Acabei fazendo isso manualmente e está funcionando (embora não tenha certeza de como funcionaria com unidades RAID).

sudo grub-editenv - set next_entry=2
reboot

Onde 2 é o local da entrada do menu com base em zero para a entrada do Windows no menu de inicialização do grub.

Você pode ver por que isso funciona olhando para o /boot/grub/grub.cfgarquivo, pois ele usa o valor next_entry e o redefine para a próxima inicialização.

user4061565
fonte
0

Concorde com @ jw013. E você também pode dar o bloco de menu para reiniciar o grub (incluindo o título do menu pai). por exemplo:

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

Onde "Opções avançadas para o Ubuntu" é o menu pai, "Ubuntu, com Linux 4.13.0-26-generic" é o submenu.

Changbin Du
fonte
0

Reinicie a máquina em um destino de inicialização específico (entrada do Grub).
O destino de inicialização é selecionado de forma interativa com o 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
Simon Schürg
fonte