Linuxからタスクバーピン留めで確認ダイヤログ付き2クリックだけでDualbootしているWindowsに移行できるスクリプトを作る方法。
初めまして。YuePlushと書いてゆえと読みます。(本名の一部をもじった。)
今まではNoteに技術記事書いてたのですが、サイト属性的にあまり面白くなさそうな感じだったので急遽Zenn.devさんの方で記事をコピペして精査して移植してます。エンジニアさん的に盛り上がれる話題になったら嬉しいなぁと思ってます。とりあえずそんな感じでよろしくお願いします。
こんにちは、最近色々Amazonで物色しているゆえちゃんですが、世の中便利になりましたね…(飛んでいくお金に遠い目を向けながら…)
さて単刀直入に本題に入ります。ヘッダーの写真に載せてあるとおりなんですが、これまではGrub経由でDualbootのWindowsに切り替えるしか方法がなく、テンポが悪かったため、かなり長い間シングルブートのLinuxで修行してたんですが…まあ、クリスタを無理やりLinux上で動かす方法がありますが、Wineで動かすと動作はするがそもそも素材を探す機能が使えなくて、WinApps for LinuxというLinux上にWin10を仮想実行してRDPでバイパスしながらLinux上でネイティブに動作させる方法なんかについても色々試してましたが、筆圧が死ぬのと、システムが不安定になるのとで、色々と見送ってしまいました。そんなある日、この動画にめぐりあいます。
簡単に説明するとLinuxのefibootmgrを経由してシェルスクリプトを特定の条件で実行するとSteamDeckモードでAdminパスワード無しにWindowsに移行できてしまう優れものの方法でした。詳しくは動画内で。
ただ、自分のラップトップのBazziteではSteamDeckモードは使えず、最近Zorin OSに移行したので、たとえ実装できてもいちいちSteamランチャーからシェルスクリプト叩くのって、なんかダサいなって思ったんで、今回はこれらの動画内の方法を元にChatGPTシバいてうまく動作するスクリプトを組みました。
✅出来ること。
確認ダイヤログ付きのシェルスクリプトをLinuxタスクバーにピン留めして
デュアルブートの利便性を強化する。
✅必要なモジュール
Zenityモジュールを使うので事前にLinuxシステムにターミナルから組み込むこと。
BazziteなどのImmutable Fedora SystemではDistroboxなんかを使えば
理論上出来るかもしれないが、動作未検証。
sudo apt install zenity
✅事前に知らなければいけない事
以下を実行してWindows Boot Managerの管理番号をメモしておく。
たとえば0001という番号がWindows Boot Managerに割り振られていたらそれをどこかに簡単にメモする。
sudo efibootmgr
またWhichコマンドを使えばefibootmgrのフォルダ位置や、rebootのフォルダ位置も確認可能なため、事前に以下のコマンドで場所を把握しておく。OSによっては微妙に変わったりしてうまく動作しないので下調べを入念にしておくこと。
which efibootmgr
which reboot
❌出来ないこと
同じようにWindowsからEfibootmgrを叩いてLinuxシステムに移行するシェルスクリプトを作成することは不可。Linuxだから出来ます。
それじゃあやっていきましょう。
■セットアップ
シェルスクリプトと.desktop用の保存先をターミナルから作成する
YOURUSERNAMEは削除して”あなたのPCのユーザー名”を代わりに入れてください。
mkdir -p /home/YOURUSERNAME/ShellScripts
以下のコマンドでShellscriptsフォルダ内にswitch-to-windows.shというシェルスクリプトを作成する。(メモ帳からテキストファイルを作って.shに拡張子を変更しても動作します。)
nano /home/YOURUSERNAME/ShellScripts/switch-to-windows.sh
するとNanoの編集画面が新規ファイルで開くので、以下をコピペ。
#!/bin/bash
zenity --question
--title="Windowsに切り替え"
--text="本当にWindowsに再起動しますか?"
if [ $? -eq 0 ]; then
sudo /usr/bin/efibootmgr -n 0001
sudo /sbin/reboot
else
exit 0
fi
コピペ終わったらCtrl+Xで保存ダイヤログを開き、YキーでYesを入力してEnter入力で、switch-to-windows.shファイルを保存します。
そして、以下のコマンドで実行権限を付与して、シェルスクリプトを実行可能な状態にします。(YOURUSERNAMEはLinuxのあなたのユーザー名に置き換える。)
chmod +x /home/YOURUSERNAME/ShellScripts/switch-to-windows.sh
🟥注意
/usr/bin/efibootmgr と /sbin/reboot はOSによっては微妙に位置が違うのでコマンドミスが発生する可能性があります。なので…以下のコマンドをターミナルに打ってコマンド位置を確認して微修正してください。
which efibootmgr
実行すると /usr/bin/efibootmgr みたいな感じで表示されます。
お使いのOSによって異なります。
which reboot
同様にこれも /sbin/reboot みたいに表示されます。
■SUDOパスワードを特定の条件でパスワード不要にする
以下をターミナルに入力。
sudo visudo -f /etc/sudoers.d/switch-to-windows
中身を以下のコピペで対処。
(YOURUSERNAMEはLinuxのあなたのユーザー名に置き換える。)
YOURUSERNAME ALL=(ALL) NOPASSWD: /usr/bin/efibootmgr, /sbin/reboot
保存して閉じる(Ctrl+X, Y, Enter)。
なぜユーザー名を指定するかというと、セキュリティ上の懸念であります。無条件でユーザーが再起動可能になった場合ちょっと危ういので、YOURUSERNAMEだけが実行できるパスワード無しの再起動コマンド>Windows移行という流れになります。
■.desktopファイルを作成してGUIランチャーにする
shellscriptsフォルダ内に.desktopというファイルを作成します。
以下のコマンドをターミナルに入力。
(YOURUSERNAMEはLinuxのあなたのユーザー名に置き換える。)
nano /home/YOURUSERNAME/ShellScripts/SwitchToWindows.desktop
以下の内容をコピペ。
[Desktop Entry]
Version=1.0
Type=Application
Name=Switch to Windows
Exec=/home/YOURUSERNAME/ShellScripts/switch-to-windows.sh
Icon=system-reboot
Terminal=false
Categories=Utility;
Ctrl+X, Y, Enterで保存。
保存後、以下のコマンドで.desktopファイルに実行権限を付与。
(YOURUSERNAMEはLinuxのあなたのユーザー名に置き換える。)
chmod +x /home/YOURUSERNAME/ShellScripts/SwitchToWindows.desktop
最後にタスクバーピン留めのためにメニューに登楼するため以下のコマンドをターミナルに打ち込み実行。
(YOURUSERNAMEはLinuxのあなたのユーザー名に置き換える。)
cp /home/YOURUSERNAME/ShellScripts/SwitchToWindows.desktop ~/.local/share/applications/
すると、LinuxのスタートメニューにSwitch to Windows(中身がSwitchToWindows.desktop)が表示されるのでそれを右クリックしてタスクバーにピン留めすれば一連の流れは完了であります。
タスクバーにピン留めされているSwitch To Windowsのアイコンをクリックして確認ダイヤログが出たあとに、NOを押したら処理が中断され、YESを押したらWindowsに移行するように動作するはずです。(この確認ダイヤログを入れたのも何か作業中に保存し忘れてそのままクリックしたときに悲劇が起きないようにするための予防策です。)
もしシェルスクリプトがうまく動作しない場合、ChatGPTに聞いてみてください。無料プランで大丈夫です。お使いの環境に合わせてうまく修正出来ると思います。
おつかれさまでした。
待って、じゃあこれ全部Linuxなん?
(銃を構えながら)いつもそうだった。
Discussion