Windows11でLinuxのGUIアプリを動かしてみた
Windows10のWSL2とWSLgを試してみたいと思い、Insider Previewを用意してアプデをしてみたら、Windows11のInsider Previewになってしまったので、今回はWindowsでLinuxのGUIアプリを動かせるWSLgをWindows11にて試してみることにしました。
また、今回は少々パワーが必要になるので、デスクトップ機にてVMware Workstation 16環境上のWindows11にて、WSL2gの環境を用意して検証してみました。ただ、大抵のアプリはWindowsにも移植されてたりするので、GUIアプリ目的で使う機会は少ないかなぁ。Hyper-Vで仮想環境としてLinux運用するよりも、WSL2としてLinuxを運用するほうがメリットは大きいような気がする。
※しかし、MicrosoftがLinuxを扱う時代が来るとは。ジョークサイトのネタが本物に。
今回利用するアプリ等
今回の環境は仮想環境内で仮想環境を動かすNested Virtualizationという環境になるので、環境設定のプロセッサにおいて、Windows11の環境を用意するにあたって、Intel VT-x/EPTまたはAMD-V/RVIを仮想化にチェックを入れておく必要性があります
※VMware Workstationのvmx設定ファイルに記述するならば、以下のような記述を追加しておく
1 2 3 |
vhv.enable = "TRUE" hypervisor.cpuid.v0 = "FALSE" mce.enable = "TRUE" |
※Windows10の場合、Insider Preview Build 21364以降ならば利用することが可能です。
図:仮想化支援機能をONにする必要性がある
事前準備
Hyper-VとWSLの有効化
環境構築の前に、Windows Subsystem for LinuxおよびHyper-Vの2つを有効化しておく必要があります。有効化しておかないと、Ubuntuのインストールやwslコマンドの利用に影響します。
- コントロールパネルを開く
- プログラムと機能を開く
- 左サイドパネルの「Windowsの機能の有効化または無効化」をクリックする
- Hypyer-VおよびLinux用Windowsサブシステムの2つにチェックを入れて有効化する
- 管理者権限でPowerShellを起動して、以下のコマンドを実行してサービスを有効化する
1 |
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All |
これをしておかないと、WSLは利用が出来ないので必ず行っておきます。きちんとHyper-Vが稼働してるかどうかは以下のコマンドで確かめることが可能です。
※仮想化
1 |
Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V |
図:追加機能を有効化しないと使えない
Ubuntuをインストール
インストールと言っても、ISOファイルから仮想環境を起動してインストールではなく、Microsoft Storeアプリからインストールが可能になっています。コマンドラインからもインストールは出来ますが、こちらのほうが手軽です。
- Microsoft Storeアプリを起動する
- 検索にて、Ubuntuを検索する。今回はUbuntu Linux 18.04 LTSというものを選びます。
- 画面が出てきたらインストールをクリックする
- しばらく時間が経過すると、コマンドプロンプトが起動する
- トラブルが無ければ、UNIXNAMEを入れろという文が出てくるので、ユーザ名とパスワードを登録する
- installation successfullyと出たら完了。これでUbuntu Linuxが使えるようになってる
なお、コマンドラインの場合、管理者権限のPowerShellから
1 2 3 4 5 |
//ubuntuのインストール wsl --install -d Ubuntu-20.04 //アップデート wsl --update |
にてインストールする事が可能です。特に、Microsoft Storeから入れて0x80370109エラーが出て止まる場合は、コマンドラインからのインストールを推奨します。
図:手軽に入手することが可能になってる
図:アカウント登録の様子
Ubuntuのアンインストール
Ubuntu Linuxはアプリの1つとしてインストールされるので、他のアプリ同様に以下の手順でアンインストールする事が可能です。非常にお手軽ですね。
- 設定アプリを開く
- アプリと機能を開く
- Ubuntuがいるので、「︙」をクリックして、アンインストールをクリックするだけ。
図:Linuxを1アプリ扱いするWindows
システムのアップデート
Ubuntu Linuxが使えるようになったら、以下のコマンドを入力してOSのアップグレードを行っておきましょう。Linux自体のアップデート作業は結構掛かります。
1 |
sudo apt update && sudo apt upgrade -y |
なお、初期のカレントディレクトリは、Windows側の環境変数に於ける%USERPROFILE%のディレクトリとなっています。Linux側ではこのフォルダが、/mnt/c/Users/ユーザ名としてマウントされている状態で共有されます。このカレントディレクトリはWindows Terminalの設定->Ubuntu18.04のディレクトリの開始のパスで変更をすることが可能です。
図:これは定番の作業です
GUIアプリのインストールと起動
Chromebookの場合、コンテナにDebianをインストール後にそのままGUIアプリをインストールすれば、ChromeOS上でLinuxアプリが動作しました。同様に、WSLgではaptにてGUIアプリをインストールし、コマンドラインを叩けば、GUIアプリが起動する仕掛けになっています。
- Ubuntu Linuxを起動する
- ターミナル状態なので、コマンドラインからsudo apt install x11-apps -yを実行して、X11アプリをインストール
- 特にエラーがでなければ、続けて、xeyesを入力して起動する(結構起動まで時間が掛かります)
- 目玉のアプリが起動する
インストールしたアプリは、スタートメニューにも登録されているので、コマンドラインではなくクリックひとつで起動できるのも、Chromebookと同じですね。
図:Linux上でGUIアプリ開発もこれで手軽になる
追加作業
ネットワークが遅い
以前から言われていたWSLのネットワークの通信速度が遅い問題。どうやら、利用してるHyper-Vの仮想イーサネットアダプタが原因らしいのですが、デバイスマネージャ上には、該当するHyper-V Virtual Switch Extension Adapterは見当たらない。
しかし、PowerShell上で以下のコマンドラインを実行する事で、直接設定変更を行い、ネットワークの速度問題を解決できるとのこと。
- PowerShellを管理者権限で起動する
- 以下のコマンドラインを実行する
- その後再起動する
1 2 3 4 5 |
Set-NetAdapterLso -IPv4Enabled $False -Name 'vEthernet (WSL)' もしくは Disable-NetAdapterLso -Name 'vEthernet (WSL)' |
WSLを再起動する
まだ正式版ではなく、WSL2自体もInsider Previewとしてリリースされてるものであるため、挙動が怪しいシーンはたくさんあります。そんな場合、マシンの再起動も良いのですが、Windows Terminalから、wsl --shutdownしてから再度作業を再開すると上手くいくかもしれません。
実際、Ubuntuがなかなかストアからインストールできないなぁと思ってたシーンでは、一度シャットダウンしてから再度インストールを実行するとあっさりインストールできたりしました。
悩むよりも、wsl --shutdownですね。
ファイルシステムへのアクセス
WindowsからWSLのファイルシステム
WSL2からは、エクスプローラより簡単にWSL側のファイルシステムにネットワークドライブといった形でアクセスができるようになりました。アドレスに「\\wsl$」を入れてアクセスをするか?エクスプローラのサイドバーにある「Linux」をクリックすると、インストールしたUbuntuなどが見えるので、直接開いてファイルシステムの操作をすることが可能になっています。
図:簡単にアクセスできるようになった
WSLからWindowsのファイルシステム
WSLのUbuntu側から、Windowsのファイルシステム側を操作するにはどうしたらよいか?といったら、そちらも簡単に可能です。/mnt/ドライブ名でアクセスできるので、/mnt/cでCドライブを開くことが可能です。ターミナルからコマンドで開いても良いですし、WSLgが使える環境ならば、NautilusやNemoなどのファイラーをインストールして、そちらから開くのも良いでしょう。
ちなみに、Linux側のターミナルで、explorer.exe .とうつと、カレントディレクトリをWindows側のExplorerで開くということが可能になっています。
図:NautilusでCドライブを開いてみた
WSLから外部のディスクをマウント
これまで出来なかった外部ディスクのマウントができるようになりました。wsl --mountコマンドを利用することで、例えばext4フォーマットなUSBメモリやらHDDなどを直接WSL側へマウントが可能になりました。ただし管理者権限が必要です。手順は以下の通り
- USBメモリを刺す
- Windows側、管理者権限にてコマンドプロンプトよりwmic diskdrive list briefを実行して、ドライブ一覧を調べ、DeviceIDおよびpartitionを調べる
- 続けて、コマンドプロンプトより、例:wsl --mount \\.\PHYSICALDRIVE1 --partition 1を実行して、マウント開始(filesystemオプションの指定がない場合はext4をマウント)
- /mnt/wsl/PHYSICALDRIVE1p1としてマウントされる
図:まずはディスク一覧を調べておく
サウンドの設定
アップデート前のWSL2はオーディオデバイスの認識が無く、音声を出力するにはこちらのサイトのようにややこしい仕組みが必要でした。しかし、WSLgでは標準で音声出力をサポートしているようで、試しにWineでブロック崩しを動かしてみたところ、若干ノイジーながら音は普通に出力されてました。着実に進化しています。
よって、WSLgでは特に何もすることなく音の出力ができるようなので、より手間が減りました。
図:16bitゲームでも音の出力をWine経由で出せました
日本語化と日本語入力を可能にする
日本語環境を準備する
WSL2環境を用意した段階では、日本語入力や日本語化の為の処理がされていない、素の環境になっています。Chromebookのエントリーでも記述しましたが、日本語化と日本語入力環境を整えて上げる必要があります。ターミナルから作業を行います。
1 2 3 4 5 6 |
sudo apt update sudo apt upgrade -y sudo apt -y install language-pack-ja sudo update-locale LANG=ja_JP.UTF8 sudo apt install -y fcitx-bin fcitx-mozc dbus-x11 sudo apt install gedit |
日本語化に必要なものが上記コマンドでインストールされます。
続けて、設定ファイルを編集し色々とフォント関係の参照やMozcの設定を追加します。
1 2 3 4 5 |
cat << EOS | sudo tee /etc/fonts/local.conf <?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig><dir>/mnt/c/Windows/Fonts</dir></fontconfig> EOS |
これで、Windows側のFontsディレクトリもWSL2側で参照できるように加える設定ファイルを作成しました。続けて
1 2 3 4 5 6 7 |
cat << EOS >> ~/.profile export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS=@im=fcitx export DefaultIMModule=fcitx fcitx-autostart &> /dev/null EOS |
とすることで、Linux側のIMの設定にfcitxが加わります。最後に、一旦exitでWSLを終了させて、もう一度起動します。
日本語入力を可能にする
fcitx-config-gtk3をターミナルから起動して、IMの設定を進めます。
一番上に「キーボード – 英語」がいますが、そのままでもOK。但し、106日本語キーボードにしたい場合には、これを削除して別途キーボードを左下の+から追加する必要性があります。
図:mozcの設定画面
次に、アドオンタブに移動し、advancedにチェックを入れ、Fcitx XIM Frontendを選んで設定ボタンを押します。XIMでOn The Spotスタイルを使うにチェックを入れて、OKを押します。このウィンドウは閉じてしまってOKです。
図:拡張の設定変更
最後にIMの細かい設定変更をしたい場合には以下のコマンドを入力して、入力様式などのカスタマイズが可能です。かな入力にしてみたり、句読点の変更などなどですね。お好みです。日本語入力は、これまで通り左上のかな/英数でも良いですし、Ctrl+Spaceで切り替えが可能です。
1 |
/usr/lib/mozc/mozc_tool --mode=config_dialog |
図:入力カスタマイズはお好みで
一旦ここで、Ubuntuを閉じて、Windows側のコマンドプロンプトからwsl --shutdownで閉じる。再度、Ubuntuを起動し、ターミナルからgeditを起動して日本語入力をオンにして入力してみて出来たら成功。
図:無事に日本語入力が出来た
バックアップ
WSL環境をバックアップしたり、他のマシンでそのまま活用したいケースはたくさんあります。再度1から構築するのも大変なので、Windows Terminalを利用してバックアップを取っておくと良いでしょう。
エクスポート
以下の手順でWindows Terminalを利用して、tarボール形式で固めてエクスポートしておくことが可能です。
- wsl --list -vを実行してWSL環境のリストを出す
- 今回は1個しか入れてないのですが、Ubuntu-20.04が出てきます。
- cd Documentsでドキュメントフォルダに移動する
- wsl --export Ubuntu-20.04 ./ubuntu2004.tar で、ドキュメントフォルダにubuntu2004.tarというファイルでエクスポートされます。
図:難しいコマンドは必要ありません
インポート
逆に予めエクスポートしておいたtar玉のWSL環境をインポートする場合には、wsl --import Ubuntu-20.04 ~/AppData/Local/Ubuntu-20.04 ./ubuntu2004.tar --version 2と入力することで、WSL2の環境としてインポートされます。
インポート完了してるかどうかは、同じくwsl --list -vコマンドにて確認をすると良いでしょう。
WSL2のメモリ上限を設定する
WSL2はこちらの記事によると、メモリは75%を上限として動的割当になっているようです(vmmemというプロセスがソレ)。仮想マシンという形で割り当ててるわけではなく共有してるので、場合によっては全体的にパフォーマンスが落ちる可能性もあります。仮想マシンのように割当上限を決めて置くと極端にWSL2に持っていかれる事がなくなるので、十分なリソースが無いPCの場合には以下の設定を追加して、メモリの上限を設定しておくと良いでしょう。
- テキストエディタで以下のような内容でファイルを作成する
- ファイルの保存場所は、%USERPROFILE%\.wslconfig (フルパスだとc:\Users\ユーザ名の直下)。ドットファイルなので、ドットファイルで保存できるテキストエディタで作業を行う。
- wsl --shutdownで一旦シャットダウンし、再度Ubuntuを起動すれば反映する
1 2 3 |
[wsl2] memory=4GB swap=0 |
上記の設定では、4GBの上限を設定し、尚且swapを0にしてるので、スワップファイルを使用しないという設定になります(通常swapの行は不要)。swapを設定しておくとHDDやSSDへメモリが足らなくなるとスワップで書き込み読み込みが発生するので、SSD的にはちょっと負担になる。ので、敢えて不具合が出る恐れがあってもそれを避けたい人は追記すると良いでしょう。
リソースが十分なPCならばこのような作業は不要なので、スペックが厳しいシーンでのみ使うべしだと思います。
MySQLなどのサーバをインストールする
今回はGUIアプリを動かすのが主目的であるため、サーバは範疇外ですが、WSL2でも各種サーバを動かすことが可能です。Ubuntuのコンソールより以下のコマンドでインストールが可能です。
1 2 3 4 |
sudo apt install mysql-server sudo /etc/init.d/mysql start sudo service mysql status sudo mysql_secure_installation |
mysql_secure_installationの質問等はお好みに応じてYes/No回答すればセットアップは完了です。
但し、WSL2はPID 1がinitdになっており、systemdが動作しないようです。よって、systemctlなどでの操作や自動起動などがしてくれない。こちらのサイトを参考に、systemdを起動しPID 1にする設定をしてみたものの、genie -sで起動を掛けるとWaiting for systemd….!!!!と出てしまう。180秒でタイムアウトするようなのですが、なんか具合が悪いので、手動で上記のように起動するようにしています。起動しても動作が不安定という話もあります。
サーバ運用するならば、Hyper-Vなどを利用して構築したほうが良いかもしれません。Twitterによると、Ubuntu 22.04では、/etc/wsl.confに以下の記述を追加するとsystemdが使えるようになるとか。
1 2 |
[boot] command = /usr/libexec/wsl-systemd |
※2022年9月21日、このWSL上でsystemdが動作しない問題について解決が図られたようです。利用するにはMicrosoft Store版のWSLが必要で初期状態では設定が無効化されている(Storeアプリから開く場合はこちらのリンク)。/etc/wsl.confに対して以下の記述を追加することで有効化する。
1 2 |
[boot] systemd=true |
図:Store版ならばsystemdが使える
Wineを利用する
Windows11になってから、32bit版のOSが廃止された結果、Windows10では動いていた16bitのアプリケーションはNTVDMがなくなった結果動かなくなりました。また、年々古いアプリケーションとの互換性は徐々に失われつつあり、動かなくなるアプリケーションも増えています。VMwareなどで過去のOS環境を構築すれば、問題なく動くものも多いのですが、過去のOSを持っていない人にとっては容易なことではありません。
そこで利用するのが、WSLgのUbuntu環境にWineを入れることで、古いWindowsアプリを活用する手段として利用する事です。WSLg + Wine以外の過去の資産活用手段については、以下のエントリーで記述していますので合わせて御覧ください。
Wineをインストール
WSLgのUbuntu環境を起動してターミナルな状態になったら、以下のコマンドを打ち込んでwineをインストールします。今回はWSLとしてはUbuntu 20.04を利用しているので、それに合わせたものを使います。
1 2 3 4 5 6 |
sudo dpkg --add-architecture i386 wget -nc https://dl.winehq.org/wine-builds/winehq.key sudo apt-key add winehq.key sudo add-apt-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ focal main' sudo apt update sudo apt install --install-recommends winehq-stable |
つづけて、ライブラリなどを入れるwinetricksをインストールします。
1 2 3 4 |
wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks sudo chmod +x winetricks sudo cp winetricks /usr/local/bin sudo apt-get install cabextract -y |
追加のセットアップ
Wineはフォント関係や日本語関係がそのままだと具合が悪いので、色々と追加のセットアップが必要です。以下の手順でセットアップを行います。今回は32bitのprefixで作っています。
- WINEARCH=win32 WINEPREFIX=~/win32 winecfgと実行する事で、32bit環境のprefixを独立して作成可能です。デフォルトだと64bit環境のprefixが作成されてしまいます。
- wine winebootもしくはWINEARCH=win32 winebootを実行して、MonoおよびGeckoのパッケージをインストールして初期化する
- 続けてwine winecfgを実行して、OSを例えばWindows95等に変更をしておく(winetricksからも起動出来ます。winecfgが失敗したらこちらから起動しましょう)
- 多分まだwinecfgなどが文字化けしていると思われるので、フォントを追加する
- winetricks fakejapanese_ipamonaを実行して、日本語フォントを追加しておく(結構時間が掛かる)
なお、WSLgの場合にだけ有効な手法として、Windows側のfontsディレクトリとWine側のFontsディレクトリをシンボリックリンクでつなげることで、Wine側でWindows側のフォントを参照できるようになり、文字化けなどで困らなくなります。必要な場合は以下のコマンドを実行しておくと良いでしょう。
1 2 |
rm -rf $HOME/.wine/drive_c/windows/Fonts ln -s /mnt/c/Windows/Fonts $HOME/.wine/drive_c/windows/Fonts |
また、追加のライブラリをインストールしたい場合には、winetricksを単体で実行すると、GUIのインストール管理画面が出てくるので、Visual Basicのランタイムなどをこちらでインストールしておくと良いでしょう。
なお、Cドライブなどは、/home/ユーザ名/以下にある.wineディレクトリに作成されているので、リセットしたい場合はこのフォルダ毎削除(rm -r -f ~/.wine)して、再度作り直すと良いでしょう。
図:WinetricksのGUI画面
図:Wine6.0がインストール出来ました。
アプリを起動してみる
ここまで来たらあとはもう簡単です。ターミナル画面からwine xxxx.exeと実行すれば起動します。試しに16bitアプリであるアリーナを起動してみましたが、バッチリ起動出来ました。WAVEサウンドも普通に出力されてました。
これで古いWindows資産をWindows11でも十分に活用できる手段が出来ました。
図:16bitアプリもバッチリ動作
インストール時のエラー
0x800701bc・0x80370109
インストール時、まだUNIXNAME設定をしていない段階でのターミナルに表示されて止まるエラーです。?????といった表記になっていてわけがわからない状態ですが、エラーナンバーが出ているので、これをもとに調べます。自分も遭遇しましたが、このエラーの場合は、このリンク先に飛んで、x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージをダウンロード -> インストールし、再度、Ubuntuをインストールしなおせば解決するとのこと。
ただ、実際にはWindows11で同様のエラーに遭遇時にインストールしようとしても、最新ですと言われてNG。Hyper-Vの有効化の手順およびvmxファイルへの記述の追加などをして再度起動した後、Ubuntu 20.04を再インストールしてみたら解決しました(あくまで一例です)。ウェブでもこのケースはHyper-Vのサービスがきちんと動いていないのが原因との指摘があります。
図:こんな感じでエラーが出て止まる
0x80370102
当初、VMware Fusionでの設定ミスで、仮想化支援のチェックをいれずにUbuntuをインストールしようとして出たエラーです。Intel VT-xの支援機能をチェックいれて再度インストールすればOKです。また、実機の場合には、そのマシンでHyper-Vがインストールされていないであったり、CPU自体が仮想化支援のサポートに未対応というケースも考えられます。
0x8000000d
これが意味不明だったエラー。仮想化支援に問題が無いのは確認済みであったにも関わらず、NGであった。これの原因は、Windows Subsystem for Linuxの機能を有効化していなかった もしくは、有効化出来ていなかった場合に発生します。有効化したはずなのに、もとに戻るといったケースの場合があるので、その際は管理者権限のPowerShellから以下のコマンドを実行して有効化しましょう。
1 |
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux |
BIOS で仮想化が有効?
Hyper-Vが有効化されてる場合、「Windows の仮想マシン プラットフォーム機能を有効にして、BIOS で仮想化が有効になっていることを確認してください。」というエラーが出て、WSL2が起動できないことがあります。これは、以下の手順で追加の機能を有効化し再起動すれば解消します。
- タスクバーの検索窓より、「Windowsの機能の有効化または無効化」を開きます。
- 仮想マシンプラットフォームにチェックを入れます。
- Windowsハイパーバイザープラットフォームにチェックを入れます。
- OKをクリックすると、機能が有効化されます。
- 再起動します。
Windows Terminalで、bcdeditを実行し、hypervisorlaunchtype AutoになっていればOK。そうでない場合は、bcdedit /set hypervisorlaunchtype autoを実行して再起動させる。
なお、ホスト側でHyper-Vが入っており、VMwareのゲスト側にWindows11を入れ共存を図っている場合、ゲストのWindows11内でWSL2を起動しようとすると同じくエラーが発生します。これはIntel-VTやCPUパフォーマンスカウンタの設定をオフにしたことが原因ですので、仮想環境内でWSL2を使う場合、ホスト側でHyper-Vを使うようになっている場合は、停止させておく必要があります。
※なお、仮想マシンプラットフォームを追加すると、VMwareが入ってる場合、共存設定をしてあげないと起動しなくなるので注意
図:追加の機能がないと動かない。
図:遭遇したエラー
VMware Fusionで起動しない
Macbook Pro 2016のVMware Fusion 12でインストールを試してみましたが、0x80370109エラーが出続けて結局動かず。こちらのエントリーを参考に、以下の処置をしてみました。設定で、
- PowerShellを管理者権限で起動し以下のコマンドを実行
12bcdedit /set hypervisorlaunchtype autowsl --set-default-version 1 - この状態で、Ubuntu-20.04をインストール
- インストールは完了し、UNIXNAMEの設定までたどり着けた
- その後、以下のコマンドを実行
12wsl --set-version Ubuntu-20.04 2wsl -l -v - 変換が終了するまで待つ
エントリーによると、WSL2実行には、Hyper-VのSecond Level Address Translation (SLAT)に対応していなければ、WSL2は実行出来ないようです。調べてみると、Macbook Pro 2016はこの要件を満たしていないようで・・・しかし、変換は完了。一応表記上はWSL2は有効になってる。Intel VT-x/EPTまたはAMD-V/RVIを仮想化およびこの仮想マシンでIOMMUを有効化はチェックを入れています。
WSLとしては使えているものの、WSLgは使えませんでした。また、この環境下ではHyper-Vや仮想マシンプラットフォームがインストールされてると頻繁にブルスクで落ちるので、Windows11環境からは除去しておきましょう。
図:あと一歩で動かず
Windows10でも実現したい場合
WSLgは今の所、Windows11からの機能となっている為、WSL2が利用できるWindows10であってもWSLgは利用ができません(厳密には、Insider Program にしておけば使えるのですが、アプデでWindows11になってしまうので、望ましくない)。しかし、Windows10側にXserverを用意できれば、WSL2内の画面をXを使って飛ばすことが出来るので、GUIアプリを利用する事が可能になります。Insider Programへの登録は不要です。
WSL2を有効化する
Windows10の場合、KB4566116、KB5004296適用済みのBuild 1903以降でWSL2が利用可能になっています。まずは、Windows10を最新の状態(21H1以降)にアップデートしておきましょう。以下の手順で有効化します。
- コントロールパネルを開き、プログラム -> プログラムと機能を開き、サイドバーのWindowsの機能の有効化または無効化を開く
- Linux用Windowsサブシステムにチェックを入れる
- 仮想マシンプラットフォームにチェックを入れる
- OKをクリックすると有効化されます。
- OSを再起動する
PowerShellからならば、管理者権限で実行して以下のコマンドを入れれば同じ事が可能です。
1 2 |
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart |
図:コマンドラインからでなくても有効化は出来る
WSL2をデフォルトにする
この時点ではWSL1と2の両方が使える状態にあるものの、2がデフォルトになっていないので、PowerShellを管理者権限で起動して以下のコマンドを入力します。
1 |
wsl --set-default-version 2 |
しかし、以下の画像のようなカーネルをアップデートせよというようなメッセージが出た場合には、x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージをインストールする必要があります。アップデートしたら再度コマンドを実行して、2をデフォルトにする。
※古いbash on windowsが入ってる場合には、wsl --unregister Legacyを実行して削除しておきましょう。入っているとWSL2をデフォルトに出来ません。
図:カーネル更新用パッケージのインストーラ
図:このエラーが出たらアップデートが必要
Ubuntuをインストール
WSLに対して、Ubuntuをインストールします。Microsoft Storeを起動して、Ubuntu-20.04を探し入手をクリック。インストールをクリックする。500MB程度のサイズです。
Debianなどもインストールする事が可能で、コマンドラインからwsl --install -d Debianを実行するだけです。Ubuntuの場合は、wsl --install -d Ubuntu-20.04でインストールが可能なので、こちらのほうが手軽だと思います。wsl --list -vでインストール済みLinuxに対するWSLのバージョンを確認出来ます。
図:Ubuntu最新版を入れる。
図:PowerShellからインストール
VcXsrvをインストール
Windows10にXserverをインストールします。利用するのはオープンソースで開発されてるVcXsrvです。ダウンロードしたら実行して、セットアップを始めます。
- 普通にインストールを進めて完了させる
- スタートメニューからXLaunchを実行する
- Display Numberには0を入力する(デフォルトでは-1が入ってる)
- Start no clientのままでOK
- Additional parameters for VcXsrvには、-ac -nowglを入力する
- save configurationはこの設定を起動時に自動で使う場合はクリックして、config.xlaunchファイルとして保存しておく
- OS起動時に自動で6.の設定で起動したい場合は、Winキー+Rで「shell:startup」にてスタートアップフォルダを開き、6.のファイルを入れておく
- 完了をクリックする
- Windowsセキュリティの警告が出てくるので、パブリックネットワークにチェックを入れてアクセスを許可をクリック
- これで完了
図:-1だとNGなので0を入れておく
図:WSLの場合、-acを入れておかないと接続できない
図:パブリックネットワークでないとつながらない
Xserverの設定
とりあえず、UbuntuおよびXServerのインストールは完了しましたが、Ubuntu側からWindows側のXserverに飛ばす為のいろいろな設定が必要です。以下の手順で必要な設定を追加しましょう。
追加パッケージのインストール
Ubuntuを起動してコンソールから以下のコマンドで追加のパッケージを導入します。途中、インストールするかと問われるので、Yを入力して進めます。x用の各種ライブラリがたくさん導入されますが、結構短時間で完了します。
1 |
sudo apt install libgl1-mesa-dev xorg-dev fontconfig |
Display環境変数をセット
Xに飛ばす為のディスプレイ変数のセットを行います。コンソールからnanoを使って、セットします。WSL2は起動する毎にWindows側のIPが変わるため、Xserverへ手動でIP指定して飛ばすのはちょっと現実的ではないので、以下のように記述を追加して、常にXserverのIPアドレスを追随できるようにします。
1 |
nano ~/.profile |
最終行に以下のコードを追記して、Ctrl+Xを実行し、YでEnterにて上書きします。完了後一度、PowerShellでwsl --shutdownした後、Ubuntuを再度起動しましょう。
1 |
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0 |
図:この設定がとっても重要
日本語フォントを参照
基本環境ですとUbuntu内のフォントしか見えないため、日本語フォント類を扱う上で追加する必要があるのですが、Windows側のフォントを参照させてしまえば、追加の必要もなくなるので、以下のようにコンソールから作業して、Fontsディレクトリを参照できるようにします。
1 |
sudo nano /etc/fonts/local.conf |
以下の記述を追加して、同じようにCtrl+xした後にYを実行、Enterで保存します。
1 2 3 4 5 |
<?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> <dir>/mnt/c/Windows/Fonts</dir> </fontconfig> |
アプリを追加して起動する
試しに、sudo apt install geditでエディタを一個インストールしてみます。そして、geditで起動してみてGUI表示が成功するか試してみましょう。無事に表示すれば、アプリがあたかもネイティブ環境で動作しているかのようにウィンドウが表示されます。
Ubuntu Desktopなどもインストールできるようですが、そういった用途はWSL2というよりHyper-Vで行えば良いので、こちらで行うメリットはあまりないかも。あとは前項にあるような日本語入力のセットアップなどをしておけば、Mozcで日本語入力もできるようになります。
図:無事にgeditが起動して表示されました
関連リンク
- Windows 11にWSL 2、WSLgをインストール
- WSL2 で systemctl を使えるようにする
- Windows11 WSL2 で systemd
- Windows 10 2004の累積更新でWSL2がクラッシュする問題
- Windows11 の WSL2 + WSLg で GUI アプリ実行時に発生するエラー「Error: Can’t open display: 0」の対処方法
- WslRegisterDistribution failed with error: 0x800701bc
- Windows 10 用 Windows Subsystem for Linux のインストール ガイド
- Windows 10でLinux GUIアプリケーション対応、プレビュー版登場
- Windows 10 HomeでWSLgをさっそく試してみた
- WSL2でMySQLを起動するときは mysqld --daemonize を使う
- DockerDesktopからWSL2上のみで動くDockerに移行する
- Windows Subsystem for LinuxからUbuntuをアンインストール
- (四訂版) GPD PokcetでWindows Subsystem for Linuxを運用する
- WSL install fails with errors on Windows 10 guest VM #2872
- WslRegisterDistributionがエラー0x8007019eで失敗しました-WSL
- Win11のWSL2 (WSLg)を日本語化 & Mozcで日本語入力
- WSLが立ち上がらない⁉
- WindowsでLinuxを使い人向けの「Cygwin」「gnupack」
- WSL(Windows Subsystem for Linux)のターミナル比較とcygwin/Dockerとのベンチマーク
- ついにDockerに対応したWSL2を私見で解説してみた
- 【Hyper-V】Windows10にHyper-Vをインストールする[クライアントHyper-V]
- Windows 10 上に Hyper-V をインストールする
- WSL 2 docs: Hyper-V should be enabled #445
- 待ってました CUDA on WSL 2
- CUDA on Windows Subsystem for Linux (WSL) - Public Preview
- 【記事】Windows Subsystem for Linux 2(WSL2)のGPUサポートについて【3/3】
- Windows10でHyper-Vを有効化したのに起動出来ない(アイコンが見つからない)時の対処法。
- WSLとwindows間のファイル連携
- Windows 10と「WSL 2」でLinuxファイルシステムへのアクセスが可能に
- 概要 WSL 2 で Linux ディスクをマウントする方法 (プレビュー)
- WSL2上のGUI(GWSL)で日本語入力を行う際の最低限の設定
- UNIX互換環境を実現するSUA(Subsystem for UNIX-Based Application)を利用する
- WSL2で(Linux版の)intellij ideaを使う方法
- Windows Subsystem for LinuxでWineを動かしてみる。
- Diablo環境色々 – Wine on Windows10(X+WSL2)編
- めくるめくLinuxカーネルじゃないLinux実装の世界
- WineでWin16ビットアプリケーションを実行する
- Wine で 32bit 専用環境を構築する
- WSL2:PCから音を出す方法
- WSL用ユーティリティ「wslu」を使ってみる
- WSL2をインストールして使うときの注意点
- Microsoft、「WebView2」ランタイムをWindows 11に同梱 ~古い環境へのバックポートも進める
- VPN を有効にすると WSL2 でインターネットに出られない問題に対処する
- WindowsにWSL2とDockerをインストールする手順
- System requirements for Hyper-V on Windows Server