ฉันจะบอก GRUB ว่าฉันต้องการรีบูทเป็น Windows ได้อย่างไรก่อนที่ฉันจะรีบูท


33

ฉันมีการตั้งค่าระบบ Linux / windows สำหรับดูอัลบูตและมักสลับจากที่หนึ่งไปยังอีกที่หนึ่ง ฉันคิดว่าถ้าฉันสามารถเพิ่มรายการเมนูในหนึ่งในเมนูเพื่อรีบูตเข้าสู่ windows โดยตรงโดยไม่หยุดที่พรอมต์ด้วง

ฉันเห็นคำถามนี้ในฟอรัมนั่นคือสิ่งที่ฉันต้องการ แต่มันเกี่ยวข้องกับ lilo ซึ่งไม่ใช่กรณีของฉัน

ฉันคิดถึงวิธีแก้ปัญหาที่จะแก้ไขรายการเริ่มต้นในเมนูด้วงแล้วรีบูต แต่มีข้อบกพร่องบางอย่างและฉันสงสัยว่ามีทางเลือกที่สะอาดกว่าหรือไม่

(นอกจากนี้ฉันจะสนใจวิธีแก้ปัญหาในการบูตจาก Windows โดยตรงไปยัง Linux แต่นั่นอาจจะยากกว่าและไม่ได้อยู่ที่นี่อย่างไรก็ตามตราบใดที่ฉันมีวิธีหนึ่ง ค่าเริ่มต้น

UPDATEดูเหมือนว่ามีคนถามคำถามที่คล้ายกันและถ้าผู้ที่มีปัญหาคำตอบผมเช่นกันอาจจะแก้ไข/boot/grub/grubenvเป็นgrub-rebootและgrub-set-defaultและgrub-editenvไม่ )

ขอบคุณล่วงหน้าสำหรับเคล็ดลับใด ๆ

อัปเดต :

นี่คือรุ่น GRUB ของฉัน: (GRUB) 1.99-12ubuntu5-1linuxmint1

ฉันพยายามเรียกใช้grubonceไม่พบคำสั่ง และการค้นหามันในที่เก็บทำให้ฉันไม่มีอะไร ฉันกำลังใช้ Linux Mint อยู่ดังนั้นอาจเป็นได้ ...

เห็นman grub-rebootดูเหมือนว่ามันไม่สิ่งที่ฉันต้องการเป็นgrubonceไม่ มันยังมีอยู่ทุกหนทุกแห่ง (อย่างน้อยก็สำหรับฉันฉันคิดว่ามันเป็นส่วนหนึ่งของแพ็คเกจด้วง) ผมเห็นทั้งสองคำสั่งที่เกี่ยวข้องกันและgrub-editenvgrub-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ดูเหมือนว่านี่เป็นวิธีที่จะไป แต่จากการสังเกตของฉันมันไม่สนใจการตั้งค่าเหล่านี้ ...


คุณอยู่บน distro อะไร ฉันคิดว่าฉันได้ทำงานกับ Debian ของฉันแล้ว
jw013

คำตอบ:


20

เพื่อให้grub-rebootคำสั่งใช้งานได้ต้องมีการเปลี่ยนแปลงการกำหนดค่าหลายอย่าง:

  • savedรายการเริ่มต้นสำหรับด้วงจะต้องตั้งค่า ตำแหน่งหนึ่งที่เป็นไปได้สำหรับสิ่งนี้คือGRUB_DEFAULT=บรรทัด/etc/default/grub
  • ใช้grub-set-defaultเพื่อตั้งค่ารายการเริ่มต้นของคุณเป็นรายการที่คุณใช้ตามปกติ
  • อัปเดตการกำหนดค่าด้วง (เช่นupdate-grub)

สิ่งนี้ควรดูแลการตั้งค่าเริ่มต้น ในอนาคตเพียงแค่ทำการgrub-reboot <entry>บูทครั้งเดียว<entry>เท่านั้น


ฉันเห็นคำว่า "รายการเริ่มต้นสำหรับด้วงต้องตั้งไว้ที่saved" ในขณะที่การรักษาของฉันGRUB_DEFAULT=0ยังพอเพียง ดังนั้นsavedไม่จำเป็น?
zhangxaochen

ฉันไม่แน่ใจว่าทุกคนรู้ดีว่าคุณลักษณะนี้ยอดเยี่ยมแค่ไหนฉันวางแผนที่จะบูต win7ult64 ด้วย rhel64 และในทางกลับกันในขณะที่การ rhel กลายเป็นอัตโนมัติพร้อมใช้งานสำหรับระบบสำรองข้อมูลแบบเครือข่ายที่ชนะอื่น ๆ จากนั้นเมื่อการสำรองข้อมูลเสร็จสมบูรณ์ระบบ grubbed จะทำการบู๊ตกลับไปยัง windows gamer iis เซิร์ฟเวอร์สนามเด็กเล่นตลอดทั้งสัปดาห์ล้างและทำซ้ำ มันเป็นรูปร่างจำแลง :-)
Brian Thomas

ฉันใช้เวลานานในการสังเกตว่า 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...นั้นดังนั้นฉันคิดว่ารหัสของคุณจะล้มเหลว นี้สามารถแก้ไขได้โดย grepping ^menuentry 'Windowsสำหรับ
Jan Vlcinsky

ควรทำเครื่องหมายเป็นคำตอบที่ถูกต้อง
Taha Rehman Siddiqui

ฟังก์ชั่นนี้มีประโยชน์มากกว่าที่ฉันคิด
Carson Ip

2

วิธีที่ง่ายสุด ๆ ก็คือใช้ส่วนขยายของ GRUB Reboot Shell GNOME (นั่นคือถ้าคุณใช้ GNOME)

หากต้องการใช้ส่วนขยายให้ไปที่ไซต์ที่ลิงก์ด้านบนและคลิกสลับเล็ก ๆ ที่มุมขวาบน (อาจเป็นว่าปิดเมื่อคุณไปที่หน้าเว็บเป็นครั้งแรก) คุณจะถูกขอให้ยืนยันว่าคุณต้องการดาวน์โหลดและติดตั้งส่วนขยาย

เมื่อติดตั้งแล้วคุณสามารถเปิดเมนูระบบและคลิกปุ่มเปิดปิดตามปกติสำหรับการรีสตาร์ท หน้าต่างที่ปรากฏขึ้นยืนยันว่าคุณต้องการปิดหรือรีสตาร์ทในขณะนี้มีปุ่มชื่อ "เริ่มใหม่เป็น ... " เมื่อคุณคลิกปุ่มนั้นรายการในเมนูด้วงของคุณจะปรากฏในรายการเพื่อให้คุณสามารถเลือกระบบปฏิบัติการที่จะเปิดโดยอัตโนมัติหลังจากรีสตาร์ท หากคุณเลือกหนึ่งในรายการเหล่านั้นระบบของคุณจะปิดและรีสตาร์ทโดยใช้ตัวเลือกด้วงที่คุณเลือก


1
ฉันแก้ไขโพสต์ของฉันเพื่อรวมรายละเอียดของการติดตั้งและใช้ส่วนขยาย
Dylan Smith

1

ฉันใช้ openSUSE ซึ่งมาพร้อมกับสคริปต์ที่เรียกว่าgrubonceซึ่งทำสิ่งที่คุณต้องการ - ตั้งค่ารายการด้วงที่จะใช้ในการรีบูตครั้งต่อไป

# 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

ฉันไม่ทราบว่ามีดิสทริบิวชันอื่น ๆ (ถ้ามี) ที่จัดส่งสคริปต์นี้ดังนั้นในกรณีที่ distro ของคุณไม่มีคุณสามารถดูหน้านี้:

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


จริง ๆ แล้วมันเป็นส่วนหนึ่งของด้วงและ Trustedgrub (ไม่ว่าจะเป็นอะไร) และไม่ใช่ grub2 ดังนั้นฉันจึงไม่ได้ติดตั้งลงบน tumbleweed มิถุนายน 2562
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มีการปรับเปลี่ยนสำหรับด้วง 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

ฉันใช้อูบุนตู 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คำสั่งในด้วงนั้นดูเหมือนว่าจะไม่ทำงานหรือเปลี่ยนไฟล์ grubenv มันเพิ่งกลับมาที่เมนูด้วงดั้งเดิมเหมือนไม่มีอะไรทำ

ดังนั้นฉันจึงลงมือทำด้วยตัวเองและมันใช้งานได้ (ไม่แน่ใจว่ามันจะทำงานกับไดรฟ์ RAID ได้อย่างไร)

sudo grub-editenv - set next_entry=2
reboot

โดยที่ 2 คือตำแหน่งรายการเมนูแบบ zero-based สำหรับรายการ Windows ในเมนู start-up grub

คุณสามารถดูว่าเหตุใดจึงใช้งานได้โดยดูที่/boot/grub/grub.cfgไฟล์เนื่องจากใช้ค่า next_entry แล้วรีเซ็ตเป็นไฟล์สำหรับการบูตครั้งถัดไป


0

เห็นด้วยกับ @ jw013 และคุณยังสามารถให้ไทล์เมนูเพื่อด้วงรีบูต (รวมถึงชื่อของเมนูหลัก) เช่น:

$ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.