2023/1/4更新:SteamOS 3.4ではこの方法が使えないことを確認しました。
2023/1/22更新
どうやらgrub.cfgの記述ミスが原因だったようで、SteamOS 3.4上でも動作することを確認しました!
セキュリティー上の懸念点があるため、os-proberを使わず、手動でWindowsのメニューエントリーを追加する手順に変更しました。
Steam Deck、ついに発売したね。12月に入ってから予約しても、発売日に届いたよ!
Linux環境でWindowsのゲームが動かせるのは本当にすごい!でも、一部のゲームはアンチチートなどが原因で、SteamOSでは動かすことはできない。
仕方なく、Windows環境も用意することにした。
Windowsをインストールすると、ブートローダーがWindowsのもの(Windows Boot Manager)に置き換わるため、デフォルトでWindowsが起動するようになる。これが気に入らなかった。
しかも、SteamOSを先に起動するようNVRAMを書き換えても、勝手に元に戻されるという、とてもお節介な仕様。
なんとかできないかといろいろ試してたら、GRUBでもデュアルブートできるようになったため、手順を紹介してみる。
- 内蔵SSDに、SteamOSとWindowsをインストールしてデュアルブートする。
- ブートローダーは、GRUBを使用する。
- これを書いた時点では、rEFIndを使うやり方が主流なのかな?
- Windowsのバージョンは、Windows 11 Home (22H2)でテストしています。
用意するもの
- USBハブ
- キーボード
- マウス
- Steam Deckのリカバリーイメージの入ったUSBメモリ
- Windowsインストールイメージの入ったUSBメモリ
前準備
Steam Deckの内蔵SSDのパーティション構成を変更していない場合は、飛ばしてもOK。
必要に応じて、リカバリーイメージで起動し、Re-image Steam Deckを選択して初期状態に戻す。
再起動後、ようこそ画面が出たら、Steamボタンを押し、電源→シャットダウン
セットアップ中はmicroSDカードを抜いておいて。ブートローダーがうまく動かなくなる可能性があるので。
SteamOSのセットアップ
- SteamOSの初期セットアップを進める
- ログインが完了したら、Steamボタンを押し、電源→シャットダウンでシャットダウンする。
home領域のリサイズ
- SteamOSのリカバリーイメージのUSBメモリを挿す。
- UEFI起動メニューに入り、上下キーでリカバリーイメージを選択し、Aボタンを押して起動
- UEFI起動メニューの入り方
- 音量マイナスボタンを押しながら、電源ボタンを1回押す。
- 「ピロリ」と鳴ったら、音量マイナスボタンを離す。
- UEFI起動メニューの入り方
- 起動したら、KDE Partition Managerを起動
- /dev/nvme0n1p8を選択し、Resize/Moveを選択
- 領域サイズはお好みで。自分は256GBモデルだったので、全領域のほぼ半分の位置となる、111,219 MiBに設定。
- Applyをクリック
- 確認画面が出るので、Apply Pending Operationsをクリック
- Successfulと出たら、スタートメニューを開き、Shutdownを選択してシャットダウンする。
Windowsのインストール
- Windowsインストールイメージの入ったUSBメモリに挿し替える
- UEFI起動メニューに入り、USB Deviceを選択
- 案内に従ってWindowsのインストールを進める。
アップグレードかカスタムかという選択画面では、カスタムを選択。 - 一番下の、「ドライブ0の割り当てられていない領域」を選び、次へをクリック
- Windowsの初期セットアップを進める。
- デスクトップが表示されたら、スタートボタンを右クリックして、ターミナル(管理者)を開く。
powercfg /h off
と入力してEnterpowercfg /a
と入力してEnter。「休止状態」と「高速スタートアップ」が使用不可になっていることを確認。- シャットダウンする。
ブートローダーの編集
- UEFI起動メニューに入り、SteamOSを起動。
- 電源→デスクトップに切り替え
- konsole(KDE用のコンソールアプリ)を開く
- passwd でパスワードを設定する。(sudoを使えるようにするため)
- btrfsの読み込み専用属性を解除
sudo btrfs property set -ts / ro false
- ブートローダーの設定ファイルを編集
sudo nano /etc/default/grub
- 下記の行を修正
GRUB_GFXMODE=1280x800x32
- Ctrl+oを押し、Enterで上書き保存
- Ctrl+xでnanoを閉じる
- EFIシステムパーティションのUUIDを確認
sudo grub-probe --target=fs_uuid /esp/efi/Microsoft/Boot/bootmgfw.efi
- /etc/grub.d/40_customを編集
sudo nano /etc/grub.d/40_custom
- 末尾に下の「/etc/grub.d/40_customに追記するコード」を追加
- (EFIシステムパーティションのUUID)の部分は実際のものに置き換える
- Ctrl+oを押し、Enterで上書き保存
- Ctrl+xでnanoを閉じる
- (オプション)40_customの数字部分を変更することで、メニュー内の順序を変更できる。
- 自分は25_customに変更した。
- grub.cfgの生成
sudo grub-mkconfig -o /efi/EFI/steamos/grub.cfg
- シャットダウン
- UEFIブートメニューを表示し、SteamOSを起動
- うまくいっていれば、メニューが表示される。
/etc/grub.d/40_customに追記するコード
menuentry 'Windows 11' --class windows --class os {
insmod part_gpt
insmod fat
search --no-floppy --fs-uuid --set=root (EFIシステムパーティションのUUID)
chainloader /efi/Microsoft/Boot/bootmgfw.efi
}
set timeout_style=menu
if [ "${timeout}" = 0 ]; then
set timeout=5
fi
Windows Boot Mangagerの起動無効化
- 起動デバイス一覧を表示
efibootmgr
- Windows Boot Mangagerのブート番号を確認する。Bootxxxx
- Windows Boot Mangagerの起動無効化
sudo efibootmgr -b xxxx -A
- xxxxの部分は、実際のWindows Boot Managerのブート番号、Bootxxxxの数字に変更する
- 実行後に表示される一覧で、Windows Boot Managerのブート番号からアスタリスクが消えていればOK
- 再起動
sudo reboot
5 comments
1 ping
Skip to comment form
「sudo efibootmgr -b xxxx -A」を実行した際、
efiへのアクセスが弾かれて
「Could not set active state for Bootxxxx : No such file or directory」
と出てしまいます。
そのため起動順を変更してもwindowsが起動してしまいます。
対処方法はありますか?
Author
稀に、efibootmgrコマンドでエントリーの状態が変更できなくなることがあるようですね。
私もその症状が出ました。
代替の方法として、EFI Shellを使う方法があります。
Arch Linuxのインストールイメージから起動できます。
ただこの方法だと、エントリーをinactiveにする方法がなさそうです。参考までにエントリーを確認、削除する方法を記載しておきます。
bcfg boot dump
bcfg boot rm xx
Author
追記します。WindowsもSteamOSのエントリーも、アクティブ状態が変更できなくなり
しばらくにっちもさっちもいかなかったのですが、
どちらが原因かはわかりませんが、下記を行った所状態変更ができるようになりました。
efibootmgrを実行するOSは、関係ないかもしれません。
注意:SteamOSのブートエントリーも一旦消えるようです
Arch Linuxのインストールイメージを起動し、ブートローダーの起動順序の設定を削除
sudo efibootmgr -O
Steam DeckのリカバリーイメージUSBから起動し、Konsoleを起動、Windows Boot Managerのエントリーを無効化
※この時点で状態変更ができるようになった
sudo efibootmgr -b xxxx -A
Windows Boot Managerのエントリーが複数勝手に作成されている場合は、重複分を削除
sudo efibootmgr -b xxxx -B
SteamOSのエントリーを作り直す
*64GBモデルの場合、NVMeでなくeMMCなので
/dev/nvme0n1
の部分が違うかもしれませんsudo efibootmgr -c -d /dev/nvme0n1 -p 1 -l '\EFI\steamos\steamcl.efi' -L 'SteamOS'
自分も同じCould not set active state for Bootxxxx : No such file or directoryメッセージが
表示されたため以下の方法で対応しました。
もしかしたらWindowsBootmanagerが何かでつかまれているのかもしれません。
(1)Windows上のコマンドプロンプト(管理者状態)で以下コマンドを入力実行する。
bcdedit /set “{globalsettings}” highestmode on
(2)Windowsをシャットダウン
(3)SteamDeckのリカバリイメージのUSBで起動。
いつもの電源+音量(-)で起動しリカバリイメージのUSBを選択。
注意:デスクトップモードではなく必ずリカバリイメージのUSBメモリで起動する事。
(4)リカバリイメージから起動したのち一番右のアイコン
Terminal with repair tools(リカバリーツール)を選択。
(5)Terminalより以下コマンドを実行
efibootmgr
でeif一覧を参照しWindows Boot Managerの番号を確認
sudo efibootmgr -b xxxx -A
でWindows Boot Managerno「*」が消える。
(6)リカバリイメージから起動したSteamOSをシャットダウンする。
これでWindowsを起動してもSteamOSを起動しても毎回Boot選択ができるようになります。
尚、SteamDeckで起動した後、Windowsを起動すると必ず9時間ずれるので
Windowsのコマンドプロンプト(管理者権限)から以下のコマンドを実行する。
reg add “HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation” /v RealTimeIsUniversal /d 1 /t REG_DWORD /f
(WindowsでUTCが有効になり、9時間ずれがなくなる。)
元に戻したければ以下を入力。
reg delete HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /f
コメント欄の内容まで実行して無事デュアルブート確認出来ました。ありがとうございます!
AMDのAPUのドライバのインストール前にgrubからWindowsを起動するとうまく表示されないので、外部ディスプレイをつないでセットアップするか、Windows Boot Managerを無効化する前にAPUドライバを入れておくかが、必要そうでした
[…] あと、過去にGRUBを編集することによるWindowsとのデュアルブート環境の構築方法を書いたけど、今はSteamOS、Windows、Arch Linuxのトリプルブート構成にしてる。Arch Linuxはブート環境構築用。 […]