再起動する前に、GRUBにWindowsを再起動するよう指示するにはどうすればよいですか?


33

デュアルブートLinux / Windowsシステムをセットアップしており、頻繁に一方から他方に切り替えます。GRUBプロンプトで停止することなく、メニュー項目の1つにメニュー項目を追加して、ウィンドウを直接再起動できるかどうかを考えていました。

私はフォーラムでこの質問を見ました。それはまさに私が望むものですが、liloを扱っていますが、それは私の場合ではありません。

GRUBメニューのデフォルトのエントリを変更してから再起動するソリューションを考えましたが、いくつかの欠点があり、よりクリーンな代替手段があるかどうか疑問に思いました。

(また、WindowsからLinuxに直接ブートするソリューションに興味がありますが、それは難しいかもしれません。ここには属していません。デフォルト。

UPDATE誰かが尋ねたと思われる同様の質問をし、それらが推奨的回答であれば、私も編集かもしれない/boot/grub/grubenvなどgrub-rebootgrub-set-defaultしてgrub-editenvください。)

ヒントを事前に感謝します。

更新

これは私のGRUBバージョンです。 (GRUB) 1.99-12ubuntu5-1linuxmint1

実行してgrubonceみましたが、コマンドが見つかりません。リポジトリで検索しても何も得られません。私はLinux Mintを使用しています。

を見てman grub-reboot、それは私が望むように、それがするように思えgrubonceます。それはどこでも利用可能です(少なくとも私にとっては、grubパッケージの一部だと思います)。2つの関連コマンドを見ました: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

私は何もしなかったかのように機能しませんでした。いつものようにメニューを表示し、最初のエントリを選択しました。

もう一度試してみましたが、間違ったエントリを書いたのではないかと思いました(ゼロベースですよね?)。そのとき、メニュー画面でハングし、起動できるようにするにはPCをハードリセットする必要がありました。

誰かがこれを試してみることができれば、それが私だけであるかどうかを確認するために、私はそれを感謝します。(ミントは私に苦労を与えており、それは変更する良い機会になるでしょう:P)。

でコードを読み取ると、/boot/grub/grub.cfgこれが進むべき道のように見えますが、私の観察から、これらの設定を無視しています...


あなたはどんなディストリビューションをしていますか?私は自分のDebianで動作していると思います。
jw013

回答:


20

grub-rebootコマンドが機能するためには、いくつかの必要な構成変更が必要です。

  • grubのデフォルトエントリはに設定する必要がありますsaved。これの可能な場所の1つGRUB_DEFAULT=/etc/default/grub
  • を使用grub-set-defaultして、デフォルトのエントリを通常使用するエントリに設定します。
  • grub設定を更新します(例update-grub)。

これにより、初期設定が処理されます。将来的にはgrub-reboot <entry>、の1回限りのブートを実行してください<entry>


「grubのデフォルトエントリはに設定する必要があります」という言葉が表示されますがsaved、私の管理GRUB_DEFAULT=0も十分です。だから、あるsaved不要?
-zhangxaochen

誰もがこの機能が本当にクールだと気付いているかどうかわかりませんが、rhel64でwin7ult64を起動し、その逆も同様です。その後、バックアップが完了すると、グラビングされたシステムは、その週の残りの間、Windowsゲーマーiisサーバーのプレイグラウンドに自動起動し、すすぎを繰り返します。その形状シフター。:-)
ブライアントーマス

grub-rebootがサイレントに失敗し、成功のリターンコードが返されることに気付くのに長い時間がかかりました。私の提案した編集が大丈夫であることを願っています。:
誰も

23
  1. 編集は、/ etc / default / grubのと交換するGRUB_DEFAULT=0GRUB_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
1月Vlcinsky

これは正解としてマークする必要があります。
タハレーマンシディキ

この機能は思ったよりも便利です。
カーソンIp

2

それを行う非常に簡単な方法は、 GRUB Reboot GNOME Shell Extension を使用することです(つまり、GNOMEを使用している場合)。

拡張機能を使用するには、上記のリンク先のサイトに移動し、右上隅の小さなトグルをクリックします(最初にページに移動したときにオフになっている可能性があります)。拡張機能をダウンロードしてインストールすることを確認するよう求められます。

インストールしたら、通常の再起動の場合と同様に、システムメニューを開いて電源ボタンをクリックします。シャットダウンまたは再起動することを確認するポップアップウィンドウには、「...に再起動」というラベルのボタンがあります。そのボタンをクリックすると、grubメニューの項目がリストに表示され、再起動後に自動的に起動するOSを選択できます。これらの項目のいずれかを選択すると、システムはシャットダウンし、選択したgrubオプションを使用して再起動します。


1
投稿を編集して、拡張機能のインストールと使用の詳細を含めました。
ディラン・スミス

1

と呼ばれるスクリプトが付属するopenSUSEを使用します。このスクリプトはgrubonce、必要なことを正確に実行します。grubエントリを次回の再起動時に使用するように設定します。

# 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

他のどのディストリビューションがこのスクリプトを出荷しているのかわかりませんので、ディストリビューションにない場合は、このページをご覧ください。

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


実際にはgrubとtrustedgrubの一部であり(grub2ではありません)、grub2ではないため、2019
redanimalwar

1

grub-set-defaultより利用できるようです(grubonceUbuntuの「詩に記載されていません)。また、Windows 7には、最後のシャットダウン時に更新プログラムが適用された場合、起動時に再起動を実行するという習慣があるため、より役立つ場合があります(つまり、起動を開始し、更新データを処理し、再起動してからログインページを表示します)。
Windows 7を頻繁に起動して、Ubuntuが実行されていることを確認しました。


1
私はWindowsアップデートをオフにしたので、それは問題ではないはずです:D、私はこれを試してみます。私が見たものから、これはと同じことをするようgrub-rebootです。質問をより詳細に編集しています。とにかくありがとう。
jadkik94

1

Fedoraでは、次のスクリプトを使用できます。これはhttps://askubuntu.com/a/18186/149422で説明されているものとほぼ同じであることに注意してください。FedoraのGRUB 2にいくつかの変更が加えられています。

#!/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

私はUbuntuの16.04を使用していますが、上記のソリューションは、私のために動作しませんでした...何らかの理由でsudo grub-reboot 2更新するように見えたことはありません/boot/grub/grubenvでも変更した後、ファイルをGRUB_DEFAULT=0するGRUB_DEFAULT=savedの両方で/etc/default/grub/boot/grub/menu.lstsavedefault --default=2 --oncegrubでコマンドを使用しても、grubenvファイルが機能せず、変更もされていないようです。何も行われていないかのように、元のgrubメニューに戻り続けました。

だから私は結局それを手動でやることになり、それは機能している(しかし、RAIDドライブでどのように機能するかはわからない)。

sudo grub-editenv - set next_entry=2
reboot

2は、grubスタートアップメニューのWindowsエントリのゼロベースのメニューエントリの場所です。

/boot/grub/grub.cfgファイルがnext_entry値を使用し、次のブートのためにそれをリセットするので、ファイルを見ると、これが機能する理由を確認できます。


0

@ jw013に同意します。また、メニュータイルをgrub-rebootに指定することもできます(親メニューのタイトルを含む)。例えば:

$ 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.