จะรีบูท Windows จาก Ubuntu ได้อย่างไร?


35

ฉันกำลังมองหาวิธีที่จะรีบูท Windows จาก Ubuntu บนระบบบูตคู่ 10.10 / Vista กรณีการใช้งานเฉพาะคือฉันต้องการที่จะสามารถ ssh ในอินสแตนซ์ที่ใช้งาน Ubuntu ของฉันและออกคำสั่งที่จะเริ่มต้นใหม่รีบูตเข้าสู่ Windows โดยตรง

ฉันพบโพสต์บล็อกที่มีแนวโน้มแต่สคริปต์ที่แนะนำนั้นไม่ทำงาน:

#!/bin/bash

WINDOWS_ENTRY=`grep menuentry /boot/grub/grub.cfg  | grep --line-number Windows`
MENU_NUMBER=$(( `echo $WINDOWS_ENTRY | sed -e "s/:.*//"` - 1 ))
sudo grub-reboot $MENU_NUMBER
sudo reboot

man grub-reboot ไม่ได้ช่วยอะไรมาก แต่ดูเหมือนว่าจะพาฉันไปในทิศทางที่ถูกต้อง:

ตั้งค่ารายการบูตเริ่มต้นสำหรับ GRUB สำหรับการบูตครั้งถัดไปเท่านั้น

WINDOWS_ENTRY=`grep menuentry /boot/grub/grub.cfg  | grep --line-number Windows`
MENU_NUMBER=$(( `echo $WINDOWS_ENTRY | sed -e "s/:.*//"` - 1 ))
echo $MENU_NUMBER

สิ่งนี้ส่งคืนค่าที่คาดไว้ แต่เมื่อรีบูตรายการเมนูแรกจะยังคงเน้นอยู่ ความคิดใด ๆ ที่สาเหตุนี้ไม่ทำงานหรือข้อเสนอแนะสำหรับการแก้ปัญหาอื่น


หากคุณคัดลอกบรรทัดการบูต windows grub ไปที่ด้านบนของรายการในเมนูด้วงแล้วในแต่ละหน้าต่างการบูตจะเป็นการโหลดเริ่มต้น .. หากคุณอยู่ใน Ubuntu และ ssh ลงไป sudo reboot nowควรรีบูตเครื่องเป็นรายการแรกในรายการด้วง
karthick87

แน่นอน แต่ฉันไม่ค่อยบูตในพาร์ติชัน Windows นั้น ฉันไม่ต้องการให้เป็นรายการเริ่มต้น
andrewsomething

คำตอบ:


43
  • คุณต้องแก้ไขด้วงก่อน

    sudo gedit /etc/default/grub
    
  • ค้นหาบรรทัดGRUB_DEFAULT = 0และแก้ไขเป็นGRUB_DEFAULT = บันทึก ข้อความแสดงแทน

  • อัพเดตด้วงของคุณโดยใช้คำสั่งต่อไปนี้

    sudo update-grub  
    
  • ตอนนี้สร้างไฟล์สคริปต์

    sudo gedit switch-to-windows.sh
    
  • จากนั้นเพิ่มบรรทัดเหล่านี้

    #!/bin/bash
    WINDOWS_ENTRY=`grep menuentry /boot/grub/grub.cfg  | grep --line-number Windows`
    MENU_NUMBER=$(( `echo $WINDOWS_ENTRY | sed -e "s/:.*//"` - 1 ))
    sudo grub-reboot $MENU_NUMBER
    sudo reboot
    
  • ทำให้สคริปต์ทำงานได้

    sudo chmod +x switch-to-windows.sh
    
  • และตอนนี้คุณสามารถเรียกใช้สคริปต์นี้จากเทอร์มินัลเพื่อรีบูตเข้าไปใน windows

    ./switch-to-windows.sh
    
  • หรือคุณสามารถดำเนินการคำสั่งต่อไปนี้ในสถานีของคุณ

    sudo grub-reboot X  
    
  • โดยที่ X คือตำแหน่งเมนูของระบบปฏิบัติการที่คุณต้องการรีสตาร์ทในจากเมนู GRUB (เริ่มต้นด้วย 0 เป็นรายการแรก)

ตัวอย่างเช่น:

  • หากนี่คือเมนูด้วงของคุณและหากคุณต้องการบูตเข้าสู่ windows คุณควรให้ค่า X เป็น 5
  • sudo grub-reboot 5

    ข้อความแสดงแทน

  • นอกจากนี้คุณยังสามารถสร้างตัวเรียกใช้งานสำหรับคำสั่งด้านบนเพื่อให้การคลิกสองครั้งที่ตัวเรียกใช้งานจะเริ่มต้นใหม่เป็นหน้าต่าง

ฉันสามารถทำให้มันทำงานได้หนึ่งครั้ง หลังจากนั้นคุณต้องป้อนรหัสผ่าน

7
คุณได้ด้วงแบบนี้ได้อย่างไร
แมนดี้

ติดตามคำถามข้างต้น? คุณจะได้ด้วงอย่างไร
Diego

5
การแก้ปัญหานั้นยอดเยี่ยมจริงๆ แต่เนื่องจากฉันมีรายการเมนู 14 รายการพร้อมแท็บก่อนหน้ารายการโดยที่หัวเรื่องส่วนหัวของรายการหมายเลขเมนูทำงานได้ดีขึ้น ดังนั้นคุณสามารถเปลี่ยนรหัสของคุณด้วย #! / bin / bash WINDOWS_TITLE = grep -i 'windows' /boot/grub/grub.cfg|cut -d"'" -f2sudo grub-reboot "$ WINDOWS_TITLE" รีบูตเครื่อง sudo
Philippe Gachoud

โปรดให้คำตอบของคุณ! มันเป็นสิ่งเดียวที่ทำงานได้!
honi

12

grub-rebootมีคำสั่งด้วงเพียงแค่จะทำเช่นนั้นคือมันเป็น

ดูเหมือนว่าจะทำงานเฉพาะเมื่อคุณมีการกำหนดค่าด้วงให้เริ่มต้นด้วยรายการที่บันทึกไว้ล่าสุด ดังนั้นหากคุณยังไม่ได้ดำเนินการแก้ไข/etc/default/grubและตั้งค่า

GRUB_DEFAULT=saved

จากนั้นอัปเดตไฟล์กำหนดค่าด้วง:

sudo update-grub

นับจากนี้ไปที่แต่ละด้วงบูตจะเริ่มต้นรายการที่ใช้ล่าสุด

ตอนนี้ถ้าคุณต้องการตั้งค่าล่วงหน้าว่าระบบจะบูตในครั้งต่อไปให้ใช้

sudo grub-reboot ENTRY

โดยที่ENTRYอาจเป็นตัวเลขที่สัมพันธ์กับรายการเมนู (หมายเลขเริ่มต้นจาก 0) หรือชื่อรายการเมนูที่แน่นอนตัวอย่างเช่น

sudo grub-reboot "Microsoft Windows XP Professional (on /dev/sda1)"

คำสั่งนี้สามารถทำให้พร้อมใช้งานเป็นตัวเรียกใช้งาน

#!/usr/bin/env xdg-open
#
# save as ~/Desktop/reboot-into-windows.desktop
#

[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Exec=sh -c 'gksu "grub-reboot 2" && gnome-session-save --shutdown-dialog'
Name=Reboot into Windows
Icon=gnome-panel-launcher

แต่ฉันไม่รู้ว่าจะรวมเข้ากับเมนูระบบได้อย่างไร

คุณสามารถรับชื่อรายการเมนูที่มีได้

sed -n '/menuentry/s/.*\(["'\''].*["'\'']\).*/\1/p' /boot/grub/grub.cfg 

ไม่มีเหตุผลในการตั้งค่าGRUB_DEFAULT=savedมันจะทำให้การกำหนดค่าของคุณยุ่งเหยิง อะไรด้วงรีบูตไม่สามารถที่จะเขียนไปnext_entry=ENTRY นั่นไม่ใช่/boot/grub/grubenv saved_entry=ENTRYรีบูตถัดไปจะดี next_entryแต่ด้วงอ่าน รองเท้าบูทต่อไปนี้อาจล้มเหลวหากไม่มีการบันทึกข้อมูลใด ๆ ไว้saved-entry=ENTRYใน grubenv
mook765

4

ฉันคิดว่าฉันได้พบวิธีที่ดียิ่งขึ้นสำหรับผู้ที่ต้องการเหมือนกันในขณะที่เครื่องคอมพิวเตอร์ของตนโดยไม่ต้อง ssh

วิธีการรีบูตระบบที่เจาะจงที่เลือกผ่านตัวเรียกใช้งาน Unity นั้นเพิ่งโพสต์บน webupd8 ดูhttp://www.webupd8.org/2011/05/custom-unity-launcher-to-reboot-in.html

ฉันรู้ว่ามันไม่ตรงกับคำถาม แต่ในกรณีที่บางคนมีคำถามที่คล้ายกันในภายหลังนี่อาจเป็นประโยชน์


3

เท่าที่ฉันเข้าใจสิ่งนี้จะไม่ตรงตามที่คุณต้องการ แต่ฉันคิดว่าใกล้ เพียงทำตามลิงค์บทความ webupdate


3
ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนที่สำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
Marco Ceppi

2

ดังนั้นสำหรับฉันที่ดีที่สุดคือการสร้างสคริปต์ต่อไปนี้ด้วยgrub-rebootคำสั่ง

#!/bin/bash 
WINDOWS_TITLE=$(grep -i 'windows' /boot/grub/grub.cfg|grep "^[^#;]"|cut -d"'" -f2) 
sudo grub-reboot "$WINDOWS_TITLE" 
echo "Your computer will reboot on ${WINDOWS_TITLE} in 3 seconds, press Ctrl+C if you want to abord it"
sleep 3 && sudo reboot

0

ข้อมูลของทุกคนมีประโยชน์สำหรับฉัน แต่ในที่สุดฉันก็ยังไม่สามารถเปลี่ยนค่าเริ่มต้นของด้วงแล้วเริ่มต้นใหม่ได้ในคลิกเดียว หลังจากทำการแก้ไขเป็นเวลา 2 ชั่วโมงฉันค้นพบโปรแกรมนี้ซึ่งเป็นสิ่งเดียวกันที่แน่นอนเราทุกคนพยายามที่จะสร้างและใน 5 นาทีฉันกำลังรีบูตเข้าสู่หน้าต่าง ขอบคุณทุกคนที่นี่คือลิงค์สิบแปดมงกุฎสำหรับคนที่ยอมแพ้ http://www.webupd8.org/2013/01/unity-reboot-launcher-to-quickly-reboot.html


-1

ฉันไม่แน่ใจว่าสิ่งนี้จะได้ผล 100% ในอูบุนตูหรือไม่ แต่ฉันเคยใช้งานเครื่อง Centos

โดยทั่วไปคุณจะต้องบอกด้วงว่า id # จาก grub.conf ควรทำงานต่อไป ID # สามารถพบได้โดย

echo `sudo grep ^title /boot/grub/grub.conf | grep -n Windows | cut -f 1 -d:`-1

ดังนั้นในกรณีของฉันนี้จะเช่นเอาท์พุท "4-1" เป็นรายการที่สี่ใน grub.conf ของฉันมีข้อความ "Windows" (แทนที่ด้วยชื่อรายการจริง (เช่นบางส่วน) ที่คุณต้องการใช้จากนั้นคุณสามารถป้อนสิ่งนี้ให้กับด้วง:

echo "savedefault --stage2=/boot/grub/stage2 --default=4-1 --once" | sudo /sbin/grub

และในการรีบูตครั้งต่อไปมันควรบูตโดยอัตโนมัติรายการที่คุณบอก

ทั้งหมดนี้สามารถรวมเข้าด้วยกันในสคริปต์ดังต่อไปนี้:

#!/bin/sh
let NEWBOOT=`sudo grep ^title /boot/grub/grub.conf | grep -n Windows | cut -f 1 -d:`-1
echo Booting $NEWBOOT - `sudo grep ^title.\*Windows /boot/grub/grub.conf`
echo "savedefault --stage2=/boot/grub/stage2 --default=$NEWBOOT --once" | sudo /sbin/grub
sudo reboot

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

สำหรับ gui คุณสามารถเพิ่มไอคอนทางลัดไปยังเดสก์ท็อปของคุณเพื่อให้ได้สิ่งนี้


1
ไฟล์กำหนดค่าสำหรับ grub-legacy คือ menu.lst ไม่ใช่ grub.conf สำหรับ grub2 มันคือ grub.cfg แต่คำสั่งที่สองของคุณใช้สำหรับ grub-legacy เท่านั้น
psusi

-4

เพียงแก้ไข/boot/grub/grub.cfgและเปลี่ยนรายการเริ่มต้นเพื่อชี้ไปยังรายการที่คุณต้องการบูต ค่าอาจเป็นเลขลำดับของรายการ (เริ่มต้นจากศูนย์สำหรับหมายเลขแรก) หรือคุณสามารถวางชื่อเต็มของรายการที่คุณต้องการในเครื่องหมายคำพูด


2
อย่าให้คำแนะนำในการปรับเปลี่ยนก็จะถูกเรียกคืนในแต่ละตนเองหรือโดยอัตโนมัติboot.cfg update-grubผู้ใช้ควรแก้ไข/etc/default/grubแทน
enzotib

1
@enzotib เนื่องจากการเปลี่ยนแปลงนั้นเกี่ยวข้องกับการบู๊ตครั้งถัดไปจึงไม่มีเหตุผลที่จะทำเช่นนั้น
psusi

2
คุณลืมว่าการแก้ไขไฟล์ผิดอาจทำให้ระบบไม่สามารถ
บู๊ตได้

1
@enzotib ไม่ได้จริงๆ; หนึ่งในสิ่งที่สวยงามเกี่ยวกับ grub2 คือคุณสามารถกู้คืนได้ด้วยตนเองที่พรอมต์ ความเสี่ยงที่จะทำให้ส่วนอื่น ๆ ของไฟล์ผิดพลาดเป็นข้อโต้แย้งที่กว้างขวางและหากคุณได้รับบรรทัดเริ่มต้นที่ไม่ถูกต้อง
psusi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.