Jak mogę poinformować GRUB, że chcę ponownie uruchomić system Windows - zanim ponownie się uruchomię?

33

Mam skonfigurowany system Linux / Windows z podwójnym uruchomieniem i często przełączam się z jednego na drugi. Myślałem, czy mogę dodać pozycję menu w jednym z menu, aby ponownie uruchomić komputer bezpośrednio w systemie Windows, bez zatrzymywania się na monit GRUB.

Widziałem to pytanie na forum, to jest dokładnie to, czego chcę, ale dotyczy ono Lilo, co nie jest moim przypadkiem.

Pomyślałem o rozwiązaniu, które zmodyfikowałoby domyślny wpis w menu GRUB, a następnie uruchomiło się ponownie, ale są pewne wady i zastanawiałem się, czy istnieje czystsza alternatywa.

(Byłbym również zainteresowany rozwiązaniem uruchamiania z systemu Windows bezpośrednio do systemu Linux, ale może to być trudniejsze i nie należy tutaj. W każdym razie, o ile mam jeden sposób, drugi sposób można skonfigurować jako domyślny.

UPDATE Wydaje ktoś zapytał podobne pytanie , a jeśli są to je odpowiedzi, równie dobrze mogę edytować /boot/grub/grubenvjak grub-rebooti grub-set-defaulti grub-editenvzrobić. )

Z góry dziękuję za wszelkie wskazówki.

AKTUALIZACJA :

To jest moja wersja GRUB: (GRUB) 1.99-12ubuntu5-1linuxmint1

Próbowałem uruchomić grubonce, polecenie nie zostało znalezione. A wyszukiwanie go w repozytoriach nic mi nie daje. Jestem na Linux Mint, więc to może być ...

Widząc man grub-reboot, wygląda na to, że robi to, co chcę, podobnie jak gruboncerobi. Jest również dostępny wszędzie (przynajmniej dla mnie, myślę, że jest częścią pakietu grub). Widziałem dwa powiązane polecenia: grub-editenvi grub-set-default.

Dowiedziałem się, że po sudo grub-set-default 4uruchomieniu grub-editenv listmasz coś podobnego do:

saved_entry=4

A podczas biegania grub-reboot 4dostajesz coś takiego:

prev_saved_entry=0
saved_entry=4

Co oznacza, że ​​oboje robią to samo (jedno jest tymczasowe, drugie nie).

Zaskakujące, gdy próbowałem:

sudo grub-reboot 4
sudo reboot now

Nie działało, jakbym nic nie zrobił, po prostu pokazał mi menu jak zwykle i wybrał pierwszy wpis, mówiąc, że uruchomi ten wpis za 10 sekund.

Spróbowałem ponownie, pomyślałem, że mogłem napisać zły wpis (jest zerowy, prawda?). Tym razem po prostu powiesił się na ekranie menu i musiałem mocno zresetować komputer, aby móc uruchomić komputer.

Jeśli ktokolwiek może to wypróbować, by zobaczyć, czy to tylko ja, byłbym wdzięczny. (mięta sprawiała mi trudność i byłaby to dobra okazja do zmiany: P).

Odczytywanie kodu /boot/grub/grub.cfgwydaje się, że jest to właściwy sposób, ale z moich obserwacji wynika, że ​​po prostu ignoruję te ustawienia ...

jadkik94
źródło
w jakiej jesteś dystrybucji? Myślę, że działam na moim Debianie.
jw013,

Odpowiedzi:

20

Aby grub-rebootpolecenie działało, należy wprowadzić kilka wymaganych zmian konfiguracji:

  • Domyślny wpis dla grub musi być ustawiony na saved. Jedną z możliwych lokalizacji tego jest GRUB_DEFAULT=linia w/etc/default/grub
  • Użyj, grub-set-defaultaby ustawić domyślny wpis na zwykły.
  • Zaktualizuj swoją konfigurację grub (np update-grub.).

To powinno zająć się początkową konfiguracją. W przyszłości wystarczy zrobić grub-reboot <entry>jednorazowy rozruch <entry>.

jw013
źródło
Widzę twoje słowa „domyślny wpis dla gruba musi być ustawiony na saved”, a moje zachowanie GRUB_DEFAULT=0też wystarczyło. Czy to jest savedniepotrzebne?
zhangxaochen
Nie jestem pewien, czy wszyscy zdają sobie sprawę z tego, jak fajna jest ta funkcja, planuję uruchomić Win7ult64 z Rhel64 i odwrotnie, mając jednocześnie, że Rhel stanie się automatycznie dostępny dla innego zaplanowanego zadania tworzenia kopii zapasowych systemów sieciowych Win, co spycha do Rhel Zfs Rożdz2. Następnie, po zakończeniu tworzenia kopii zapasowej, system po wykarczowaniu automatycznie uruchamia się z powrotem na plac zabaw dla graczy Windows iis przez resztę tygodnia, spłukuje i powtarza. Jest to zmiennokształtny. :-)
Brian Thomas
Wieki zajęło mi zauważenie, że grub-restart restartuje się po cichu, dając kod powrotu. Mam nadzieję, że moja sugerowana edycja jest w porządku. :-)
Nikt
23
  1. Edycja / etc / default / grub i wymienić GRUB_DEFAULT=0zGRUB_DEFAULT=saved
  2. sudo update-grub
  3. twoje polecenie będzie:

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

ładna funkcja w twoim ~ / .bashrc będzie wyglądać

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

W przypadku, gdy plik grub.conf zawiera wiele wierszy dla systemu Windows, następujące funkcje zajmą się tylko wierszami rozpoczynającymi się menuentryi wybierającymi tylko pierwszy, odnoszącymi się do systemu 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
źródło
Mój plik /boot/grub/grub.cfgzawiera więcej wierszy z „Windows”, wiele z nich mówi coś w stylu ...=1 i915.semaphores=1 acpi_osi='!Windows 2012' $vt..., więc zakładam, że Twój kod na nim zawiedzie. Można to naprawić, szukając ^menuentry 'Windows.
Jan Vlcinsky,
To powinno być oznaczone jako poprawna odpowiedź.
Taha Rehman Siddiqui
Ta funkcja jest bardziej pomocna niż myślałem.
Carson Ip
2

Bardzo łatwym sposobem na to jest rozszerzenie powłoki GRUB Reboot GNOME (to znaczy, jeśli używasz GNOME).

Aby skorzystać z rozszerzenia, przejdź do strony, do której prowadzi link powyżej, i kliknij mały przełącznik w prawym górnym rogu (prawdopodobnie po wyłączeniu pierwszej strony przejdziesz na Off). Zostaniesz poproszony o potwierdzenie, że chcesz pobrać i zainstalować rozszerzenie.

Po zainstalowaniu możesz otworzyć menu System i kliknąć przycisk zasilania, tak jak zwykle w celu ponownego uruchomienia. W wyskakującym oknie z potwierdzeniem, że chcesz zamknąć lub uruchomić ponownie, znajduje się teraz przycisk „Uruchom ponownie ...”. Po kliknięciu tego przycisku elementy w menu grub pojawiają się na liście, dzięki czemu możesz wybrać system operacyjny, który ma zostać automatycznie uruchomiony po ponownym uruchomieniu. Jeśli wybierzesz jeden z tych elementów, system wyłączy się i uruchomi ponownie przy użyciu wybranych opcji grub.

Dylan Smith
źródło
1
Zredagowałem swój post, aby uwzględnić szczegóły dotyczące instalowania i używania rozszerzenia.
Dylan Smith
1

Używam openSUSE, który zawiera skrypt o nazwie grubonce, który robi dokładnie to, czego potrzebujesz - ustaw wpis grub, który będzie używany przy następnym restarcie.

# 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

Nie wiem, które (jeśli jakieś) inne dystrybucje dostarczają ten skrypt, więc jeśli Twoja dystrybucja go nie ma, możesz sprawdzić tę stronę:

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

Petr Uzel
źródło
Jest to właściwie część gruba i trustgrub (cokolwiek to jest), a NIE grub2, więc nie mam go zainstalowanego na tumbleweed czerwca 2019
redanimalwar
1

grub-set-defaultwydaje się bardziej dostępny ( gruboncenie jest wymieniony w wersecie Ubuntu). Może to być również bardziej pomocne, ponieważ system Windows 7 ma zwyczaj przeprowadzania ponownego uruchomienia podczas uruchamiania, jeśli aktualizacje zostały zastosowane podczas ostatniego zamykania (to znaczy, rozpoczyna się uruchamianie, przetwarza niektóre dane aktualizacji, uruchamia się ponownie, a następnie wyświetla stronę logowania).
Często uruchamiałem system Windows 7 tylko po to, by wrócić i znaleźć Ubuntu.

charlesbridge
źródło
1
Wyłączyłem aktualizację systemu Windows, więc nie powinno to stanowić problemu: D, spróbuję tego. Z tego, co widziałem, wygląda na to, że robi to samo grub-reboot. Edytuję moje pytanie bardziej szczegółowo. W każdym razie dzięki.
jadkik94,
1

W Fedorze możesz użyć następującego skryptu. Zauważ, że jest to w większości takie samo, jak opisano w https://askubuntu.com/a/18186/149422 , z kilkoma modyfikacjami GRUB 2 w Fedorze .

#!/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
źródło
1

Używam Ubuntu 16.04 i powyższe rozwiązania nie działały dla mnie ... z jakiegoś powodu sudo grub-reboot 2nigdy nie wydawałem się aktualizować /boot/grub/grubenvpliku, nawet po zmianie GRUB_DEFAULT=0na GRUB_DEFAULT=savedoba /etc/default/grubi /boot/grub/menu.lst. savedefault --default=2 --onceWydaje się, że użycie polecenia grub również nie działa ani nie zmienia pliku grubenv. Po prostu wracał do oryginalnego menu grub, jakby nic nie zostało zrobione.

Skończyło się to na tym, że robiłem to ręcznie i działało (nie jestem pewien, jak to będzie działać z dyskami RAID).

sudo grub-editenv - set next_entry=2
reboot

Gdzie 2 jest zerową lokalizacją pozycji menu dla pozycji Windows w menu uruchamiania grub.

Możesz zobaczyć, dlaczego to działa, patrząc na /boot/grub/grub.cfgplik, ponieważ używa on wartości next_entry, a następnie resetuje go do następnego rozruchu.

użytkownik4061565
źródło
0

Zgadzam się z @ jw013. Możesz także nadać kafelek menu grub-reboot (w tym tytuł menu nadrzędnego). na przykład:

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

Gdzie „Zaawansowane opcje dla Ubuntu” to menu nadrzędne, „Ubuntu z Linuksem 4.13.0-26-ogólne” jest podmenu.

Changbin Du
źródło
0

Uruchom ponownie komputer do określonego celu rozruchowego (wpis Grub).
Cel rozruchowy jest wybierany interaktywnie za pomocą 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
źródło