Bagaimana saya bisa memberi tahu GRUB saya ingin reboot ke Windows — sebelum saya reboot?


33

Saya memiliki sistem dual boot Linux / windows, dan sering berpindah dari satu ke yang lain. Saya berpikir jika saya dapat menambahkan item menu di salah satu menu untuk reboot langsung ke windows, tanpa berhenti di GRUB prompt.

Saya melihat pertanyaan ini di sebuah forum, itu persis yang saya inginkan tetapi berurusan dengan lilo, yang bukan kasus saya.

Saya memikirkan solusi yang akan memodifikasi entri default di menu GRUB dan kemudian reboot, tetapi ada beberapa kelemahan, dan saya bertanya-tanya apakah ada alternatif yang lebih bersih.

(Juga, saya akan tertarik pada solusi untuk mem-boot dari Windows langsung ke Linux, tetapi itu mungkin lebih sulit, dan bukan milik di sini. Lagi pula, selama saya memilikinya dalam satu cara, cara lain dapat diatur sebagai default.

UPDATE Tampaknya seseorang bertanya pertanyaan serupa , dan jika mereka adalah jawaban yang disarankan, saya mungkin juga mengedit /boot/grub/grubenvsebagai grub-rebootdan grub-set-defaultdan grub-editenvlakukan. )

Terima kasih sebelumnya atas sarannya.

PEMBARUAN :

Ini adalah versi GRUB saya: (GRUB) 1.99-12ubuntu5-1linuxmint1

Saya mencoba menjalankan grubonce, perintah tidak ditemukan. Dan mencarinya di repositori tidak memberi saya apa-apa. Saya menggunakan Linux Mint, jadi itu mungkin ...

Melihat man grub-reboot, sepertinya itu melakukan apa yang saya inginkan, seperti gruboncehalnya. Ini juga tersedia di mana-mana (setidaknya untuk saya, saya pikir itu adalah bagian dari paket grub). Saya melihat dua perintah terkait: grub-editenvdan grub-set-default.

Saya mengetahui bahwa setelah berlari sudo grub-set-default 4, saat berlari grub-editenv listAnda mendapatkan sesuatu yang mirip dengan:

saved_entry=4

Dan saat berlari grub-reboot 4, Anda mendapatkan sesuatu seperti:

prev_saved_entry=0
saved_entry=4

Yang berarti keduanya melakukan hal yang sama (satu bersifat sementara satu tidak).

Yang mengejutkan, ketika saya mencoba:

sudo grub-reboot 4
sudo reboot now

Itu tidak berhasil, seolah-olah saya tidak melakukan apa-apa, itu hanya menunjukkan kepada saya menu seperti biasa, dan memilih entri pertama, mengatakan akan mem-boot entri ini dalam 10-an.

Saya mencobanya lagi, saya pikir saya mungkin telah menulis entri yang salah (ini berbasis nol, kan?). Waktu itu, hanya digantung di layar menu, dan saya harus mengatur ulang PC untuk dapat boot.

Jika ada yang bisa mencoba ini, hanya untuk melihat apakah itu hanya saya, saya akan menghargainya. (mint telah memberi saya waktu yang sulit, dan itu akan menjadi kesempatan yang baik untuk berubah: P).

Membaca kode /boot/grub/grub.cfg, sepertinya ini adalah cara untuk pergi, tetapi dari pengamatan saya, itu hanya mengabaikan pengaturan ini ...


kamu ada di distro apa? Saya pikir saya sudah membuatnya bekerja pada Debian saya.
jw013

Jawaban:


20

Agar grub-rebootperintah berfungsi, beberapa perubahan konfigurasi yang diperlukan harus dilakukan:

  • Entri default untuk grub harus disetel ke saved. Satu lokasi yang mungkin untuk ini adalah GRUB_DEFAULT=saluran masuk/etc/default/grub
  • Gunakan grub-set-defaultuntuk mengatur entri default Anda ke yang biasa Anda gunakan.
  • Perbarui konfigurasi grub Anda (mis update-grub.).

Ini harus menangani pengaturan awal. Di masa depan, lakukan saja grub-reboot <entry>untuk satu kali booting <entry>.


Saya melihat kata-kata Anda "entri default untuk grub harus disetel ke saved", sementara pemeliharaan saya GRUB_DEFAULT=0juga mencukupi. Jadi savedtidak perlu?
zhangxaochen

Saya tidak yakin apakah semua orang menyadari betapa kerennya fitur ini, saya berencana untuk mem-boot win7ult64 dengan rhel64, dan sebaliknya, sementara memiliki rhel menjadi otomatis tersedia untuk sistem backup terjadwal tugas jaringan terjadwal lainnya, yang mendorong ke rhel zfs raidz2. Kemudian pada cadangan lengkap, sistem otomatis boot kembali ke windows gamer iis server bermain selama sisa minggu ini, bilas dan ulangi. Ini bentuk shifter. :-)
Brian Thomas

Saya butuh waktu lama untuk menyadari bahwa grub-reboot gagal secara diam-diam, memberikan kode pengembalian yang berhasil. Saya harap edit yang saya sarankan tidak masalah. :-)
Tidak ada yang

23
  1. Edit / etc / default / grub dan ganti GRUB_DEFAULT=0denganGRUB_DEFAULT=saved
  2. sudo update-grub
  3. perintah Anda adalah:

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

fungsi cantik di ~ / .bashrc Anda akan terlihat seperti

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

Dalam hal ini, grub.conf Anda berisi banyak baris untuk Windows, fungsi-fungsi berikut hanya akan menangani baris yang dimulai dengan menuentrydan memilih yang pertama, merujuk ke 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
}

File saya /boot/grub/grub.cfgmengandung lebih banyak baris dengan "Windows" di dalamnya, banyak dari mereka menyatakan sesuatu seperti ...=1 i915.semaphores=1 acpi_osi='!Windows 2012' $vt..., jadi saya berasumsi kode Anda akan gagal. Ini dapat diperbaiki dengan menerima ^menuentry 'Windows.
Jan Vlcinsky

Ini harus ditandai sebagai jawaban yang benar.
Taha Rehman Siddiqui

Fungsi ini lebih membantu daripada yang saya kira.
Carson Ip

2

Cara super mudah untuk melakukannya adalah dengan GRUB Reboot GNOME Shell Extension (yaitu, jika Anda menggunakan GNOME).

Untuk menggunakan ekstensi, buka situs yang ditautkan di atas, dan klik sakelar kecil di sudut kanan atas (mungkin berbunyi Mati saat pertama kali Anda menavigasi ke halaman). Anda akan diminta untuk mengonfirmasi bahwa Anda ingin mengunduh dan menginstal ekstensi.

Setelah diinstal, Anda dapat membuka menu Sistem dan mengklik tombol daya seperti biasa untuk memulai ulang. Jendela yang muncul mengonfirmasi bahwa Anda ingin mematikan atau memulai kembali sekarang memiliki tombol berlabel "Restart to ...". Ketika Anda mengklik tombol itu, item dalam menu grub Anda muncul dalam daftar sehingga Anda dapat memilih OS mana yang akan diluncurkan secara otomatis setelah restart. Jika Anda memilih salah satu dari barang-barang itu, sistem Anda akan mati dan mulai ulang menggunakan opsi grub yang Anda pilih.


1
Saya mengedit posting saya untuk memasukkan rincian menginstal dan menggunakan ekstensi.
Dylan Smith

1

Saya menggunakan openSUSE yang dilengkapi dengan skrip bernama grubonce, yang melakukan apa yang Anda butuhkan - atur entri grub untuk digunakan pada reboot berikutnya.

# 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

Saya tidak tahu distribusi mana (jika ada) yang mengirimkan skrip ini, jadi jika distro Anda tidak memilikinya, Anda dapat memeriksa halaman ini:

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


Ini sebenarnya bagian dari grub dan tepercaya grub (apa pun itu) dan BUKAN grub2 jadi saya tidak menginstalnya pada Juni tumbleweed 2019
redanimalwar

1

grub-set-defaulttampaknya lebih tersedia ( gruboncetidak tercantum dalam bait Ubuntu). Ini juga mungkin lebih bermanfaat karena Windows 7 memiliki kebiasaan melakukan reboot selama startup jika pembaruan diterapkan pada shutdown terakhir (yaitu, ia memulai startup, memproses beberapa data pembaruan, reboot, dan kemudian menampilkan halaman login).
Saya sering memulai Windows 7 hanya untuk kembali dan menemukan Ubuntu berjalan.


1
Saya mematikan pembaruan Windows, jadi seharusnya tidak menjadi masalah: D, saya akan mencoba ini. Dari apa yang saya lihat, sepertinya ini melakukan hal yang sama grub-reboot. Saya mengedit pertanyaan saya dengan lebih detail. Bagaimanapun, terima kasih.
jadkik94

1

Di Fedora, Anda dapat menggunakan skrip berikut. Perhatikan bahwa ini sebagian besar sama seperti yang dijelaskan dalam https://askubuntu.com/a/18186/149422 , dengan beberapa modifikasi untuk GRUB 2 di 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

Saya menggunakan Ubuntu 16.04 dan solusi di atas tidak bekerja untuk saya ... untuk beberapa alasan sudo grub-reboot 2tampaknya tidak pernah memperbarui /boot/grub/grubenvberkas, bahkan setelah mengubah GRUB_DEFAULT=0ke GRUB_DEFAULT=saveddalam kedua /etc/default/grubdan /boot/grub/menu.lst. Menggunakan savedefault --default=2 --onceperintah di grub juga sepertinya tidak berfungsi atau mengubah file grubenv. Itu terus saja kembali ke menu grub asli seolah-olah tidak ada yang dilakukan.

Jadi saya akhirnya melakukannya secara manual dan telah bekerja (tidak yakin bagaimana ini akan bekerja dengan drive RAID).

sudo grub-editenv - set next_entry=2
reboot

Di mana 2 adalah lokasi entri menu berbasis nol untuk entri Windows di menu pembuka grub.

Anda dapat melihat mengapa ini bekerja dengan melihat /boot/grub/grub.cfgfile, karena menggunakan nilai next_entry dan kemudian me-reset untuk boot berikutnya.


0

Setuju dengan @ jw013. Dan Anda juga dapat memberikan ubin menu ke grub-reboot (termasuk judul menu induk). misalnya:

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

Di mana "Opsi lanjutan untuk Ubuntu" adalah menu induk, "Ubuntu, dengan Linux 4.13.0-26-generic" adalah submenu.


0

Reboot mesin ke target boot tertentu (entri Grub).
Target boot dipilih secara interaktif dengan 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.