Làm cách nào tôi có thể nói với GRUB tôi muốn khởi động lại vào Windows trước khi khởi động lại?


33

Tôi có một hệ thống Linux / windows khởi động kép được thiết lập và thường xuyên chuyển đổi từ cái này sang cái khác. Tôi đã suy nghĩ nếu tôi có thể thêm một mục menu vào một trong các menu để khởi động lại trực tiếp vào windows, mà không dừng lại ở dấu nhắc GRUB.

Tôi thấy câu hỏi này trên một diễn đàn, đó chính xác là những gì tôi muốn nhưng nó liên quan đến lilo, đó không phải là trường hợp của tôi.

Tôi đã nghĩ đến một giải pháp sẽ sửa đổi mục nhập mặc định trong menu GRUB và sau đó khởi động lại, nhưng có một số nhược điểm và tôi đã tự hỏi liệu có một sự thay thế sạch hơn không.

(Ngoài ra, tôi sẽ quan tâm đến giải pháp khởi động trực tiếp từ Windows vào Linux, nhưng điều đó có thể khó hơn và không thuộc về nơi này. mặc định

CẬP NHẬT Có vẻ như ai đó hỏi một câu hỏi tương tự , và nếu đó là những câu trả lời gợi ý, tôi có thể cũng chỉnh sửa /boot/grub/grubenvnhư grub-rebootgrub-set-defaultgrub-editenvlàm. )

Cám ơn vì đã nhiệt tình hướng dẫn.

CẬP NHẬT :

Đây là phiên bản GRUB của tôi: (GRUB) 1.99-12ubuntu5-1linuxmint1

Tôi đã thử chạy grubonce, lệnh không được tìm thấy. Và tìm kiếm nó trong kho lưu trữ cho tôi không có gì. Tôi đang dùng Linux Mint, vì vậy có thể là ...

Nhìn thấy man grub-reboot, có vẻ như nó làm những gì tôi muốn, cũng như grubonce. Nó cũng có sẵn ở khắp mọi nơi (ít nhất là đối với tôi, tôi nghĩ nó là một phần của gói grub). Tôi thấy hai lệnh liên quan: grub-editenvgrub-set-default.

Tôi phát hiện ra rằng sau khi chạy sudo grub-set-default 4, khi chạy grub-editenv listbạn nhận được một cái gì đó tương tự:

saved_entry=4

Và khi chạy grub-reboot 4, bạn nhận được một cái gì đó như:

prev_saved_entry=0
saved_entry=4

Điều đó có nghĩa là cả hai đều làm điều tương tự (một là tạm thời là không).

Đáng ngạc nhiên, khi tôi đã cố gắng:

sudo grub-reboot 4
sudo reboot now

Nó không hoạt động, như thể tôi chưa làm gì cả, nó chỉ hiển thị cho tôi menu như bình thường và chọn mục đầu tiên, nói rằng nó sẽ khởi động mục này sau 10 giây.

Tôi đã thử lại, tôi nghĩ rằng tôi có thể đã viết sai mục (nó không dựa trên, phải không?). Lúc đó, nó chỉ bị treo ở màn hình menu và tôi phải thiết lập lại PC để có thể khởi động.

Nếu bất cứ ai cũng có thể thử nó, chỉ để xem nếu đó chỉ là tôi, tôi sẽ đánh giá cao nó. (bạc hà đã cho tôi một thời gian khó khăn, và đó sẽ là một dịp tốt để thay đổi: P).

Đọc mã trong /boot/grub/grub.cfg, có vẻ như đây là cách để đi, nhưng theo quan sát của tôi, nó chỉ bỏ qua các cài đặt này ...


bạn đang đi đâu vậy Tôi nghĩ rằng tôi đã có nó hoạt động trên Debian của tôi.
jw013

Câu trả lời:


20

Để grub-rebootlệnh hoạt động, phải có một số thay đổi cấu hình bắt buộc:

  • Mục nhập mặc định cho grub phải được đặt thành saved. Một vị trí có thể cho điều này là GRUB_DEFAULT=dòng trong/etc/default/grub
  • Sử dụng grub-set-defaultđể đặt mục nhập mặc định của bạn thành mục bạn thường sử dụng.
  • Cập nhật cấu hình grub của bạn (ví dụ update-grub).

Điều này sẽ chăm sóc thiết lập ban đầu. Trong tương lai, chỉ cần làm grub-reboot <entry>cho một lần khởi động <entry>.


Tôi thấy các từ của bạn "mục nhập mặc định cho grub phải được đặt thành saved", trong khi việc giữ của tôi GRUB_DEFAULT=0cũng được thực hiện. Như vậy có savedcần thiết không?
zhangxaochen

Tôi không chắc mọi người có nhận ra tính năng này thực sự thú vị như thế nào không, tôi dự định khởi động win7ult64 với rrc64, và ngược lại, trong khi việc rrc trở nên tự động có sẵn cho một nhiệm vụ sao lưu được lên lịch của các hệ thống mạng khác, sẽ đẩy lên rrc zfs raidz2. Sau đó, khi sao lưu hoàn tất, hệ thống grubbed tự động khởi động lại vào một sân chơi máy chủ của game thủ iis trong phần còn lại của tuần, rửa sạch và lặp lại. Đó là một shifter hình dạng. :-)
Brian Thomas

Tôi mất nhiều thời gian để nhận thấy rằng grub-restart thất bại âm thầm, mang lại mã trả về thành công. Tôi hy vọng chỉnh sửa đề xuất của tôi là ok. :-)
Không ai vào

23
  1. Chỉnh sửa / etc / default / grub và thay thế GRUB_DEFAULT=0bằngGRUB_DEFAULT=saved
  2. sudo update-grub
  3. lệnh của bạn sẽ là:

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

một hàm đẹp trong ~ / .bashrc của bạn sẽ trông như thế

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

Trong trường hợp, grub.conf của bạn chứa nhiều dòng cho Windows, các hàm sau sẽ chỉ quan tâm đến các dòng bắt đầu bằng menuentryvà chỉ chọn dòng đầu tiên, tham khảo 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
}

Tệp của tôi /boot/grub/grub.cfgchứa nhiều dòng có "Windows" trong đó, nhiều trong số chúng nêu rõ một cái gì đó giống như ...=1 i915.semaphores=1 acpi_osi='!Windows 2012' $vt...vậy, vì vậy tôi cho rằng mã của bạn sẽ thất bại trên đó. Điều này có thể được sửa chữa bằng cách grepping cho ^menuentry 'Windows.
Jan Vlcinsky

Điều này nên được đánh dấu là câu trả lời chính xác.
Taha Rehman Siddiqui

Các chức năng là hữu ích hơn tôi nghĩ.
Carson Ip

2

Một cách cực kỳ dễ thực hiện là với tiện ích mở rộng GRUB Reboot Gnome Shell (nghĩa là, nếu bạn đang sử dụng Gnome).

Để sử dụng tiện ích mở rộng, hãy truy cập trang web được liên kết ở trên và nhấp vào nút chuyển đổi nhỏ ở góc trên cùng bên phải (có thể nó sẽ tắt khi bạn lần đầu tiên điều hướng đến trang). Bạn sẽ được yêu cầu xác nhận rằng bạn muốn tải xuống và cài đặt tiện ích mở rộng.

Sau khi được cài đặt, bạn có thể mở menu Hệ thống và nhấp vào nút nguồn như bình thường để khởi động lại. Cửa sổ bật lên xác nhận rằng bạn muốn tắt hoặc khởi động lại bây giờ có một nút có nhãn "Khởi động lại ...". Khi bạn nhấp vào nút đó, các mục trong menu grub của bạn sẽ xuất hiện trong danh sách để bạn có thể chọn hệ điều hành nào sẽ tự động khởi chạy sau khi khởi động lại. Nếu bạn chọn một trong những mục đó, hệ thống của bạn sẽ tắt và khởi động lại bằng các tùy chọn grub đã chọn.


1
Tôi đã chỉnh sửa bài đăng của mình để bao gồm chi tiết cài đặt và sử dụng tiện ích mở rộng.
Dylan Smith

1

Tôi sử dụng openSUSE đi kèm với một tập lệnh được gọi grubonce, nó thực hiện chính xác những gì bạn cần - đặt mục nhập grub sẽ được sử dụng trong lần khởi động lại tiếp theo.

# 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

Tôi không biết (nếu có) các bản phân phối khác gửi tập lệnh này, vì vậy trong trường hợp bản phân phối của bạn không có tập lệnh này, bạn có thể xem trang này:

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


Nó thực sự là một phần của grub và Trustedgrub (bất kể đó là gì) và KHÔNG grub2 vì vậy tôi không cài đặt nó trên tumbleweed tháng sáu 2019
redanimalwar

1

grub-set-defaultdường như có sẵn hơn ( gruboncekhông được liệt kê trong câu thơ của Ubuntu). Nó cũng có thể hữu ích hơn vì Windows 7 có thói quen thực hiện khởi động lại trong khi khởi động nếu các bản cập nhật được áp dụng ở lần tắt máy cuối cùng (nghĩa là nó bắt đầu khởi động, xử lý một số dữ liệu cập nhật, khởi động lại và sau đó hiển thị trang đăng nhập).
Tôi thường khởi động Windows 7 chỉ để quay lại và thấy Ubuntu đang chạy.


1
Tôi đã tắt bản cập nhật Windows, vì vậy đó không phải là vấn đề: D, tôi sẽ thử cái này. Từ những gì tôi thấy, có vẻ như điều này làm điều tương tự grub-reboot. Tôi đang chỉnh sửa câu hỏi của tôi với nhiều chi tiết hơn. Dù sao cũng cảm ơn bạn.
jadkik94

1

Trong Fedora, bạn có thể sử dụng tập lệnh sau. Lưu ý rằng điều này chủ yếu giống như được mô tả trong https://askubfox.com/a/18186/149422 , với một vài sửa đổi cho GRUB 2 trong 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

Tôi đang sử dụng Ubuntu 16.04 và các giải pháp trên không hoạt động với tôi ... vì một số lý do sudo grub-reboot 2dường như không bao giờ cập nhật /boot/grub/grubenvtệp, ngay cả sau khi thay đổi GRUB_DEFAULT=0thành GRUB_DEFAULT=savedcả hai /etc/default/grub/boot/grub/menu.lst. Sử dụng savedefault --default=2 --oncelệnh trong grub dường như cũng không hoạt động và cũng không thay đổi tệp grubenv. Nó cứ tiếp tục quay trở lại menu grub ban đầu như thể không có gì được thực hiện.

Vì vậy, tôi đã kết thúc việc thực hiện thủ công và nó đã hoạt động (mặc dù không chắc nó sẽ hoạt động như thế nào với các ổ RAID).

sudo grub-editenv - set next_entry=2
reboot

Trong đó 2 là vị trí nhập menu dựa trên số không cho mục nhập Windows trong menu khởi động grub.

Bạn có thể thấy lý do tại sao điều này hoạt động bằng cách xem /boot/grub/grub.cfgtệp, vì nó sử dụng giá trị next_entry và sau đó đặt lại cho lần khởi động tiếp theo.


0

Đồng ý với @ jw013. Và bạn cũng có thể cung cấp cho trình đơn menu để khởi động lại grub (bao gồm cả tiêu đề của menu cha). ví dụ:

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

Trong đó "Tùy chọn nâng cao cho Ubuntu" là menu chính, "Ubuntu, với Linux 4.13.0-26-generic" là menu con.


0

Khởi động lại máy đến một mục tiêu khởi động cụ thể (mục nhập Grub).
Mục tiêu khởi động được chọn tương tác với 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.