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 ...


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>.


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
}

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.


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


É 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.


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

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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.