😎

WSL2を試したくてWindowsPCを購入した

2022/07/17に公開

WSL2を試したくてWindowsPCを購入した

仕事に使うPCをWindowsにするかMacにするか選べるような会社にいたとして、どちらを選ぶべきなのか問題があります。
正直自分で開発環境を用意できるのであればどちらでもいいのですが、Webであれば「とりあえずMacを選んでおけ」みたいなとろこはありました。
個人的には開発機として選べるのであればLinuxが一番だと思いつつ、PCブラウザをターゲットにしているのであれば、Windowsの検証環境は外せないですし、モバイルをターゲットにしているのであればry。開発機はどうあれ仕事でやるのであれば各ターゲット機の検証機は必要ですよね。
検証機ではなく今回は開発機の話なのですが、「WSL2だとDockerの開発環境がうまく起動しない」という報告を前々からもらっていたものの「自分はWindows使ってないから自己解決して」と放置していました。が、たまたまWindows機を借りてWSL2で遊ぶ開発環境を構築する機会を得たときにめちゃめちゃ楽しくて「家で遊べる環境が必要だ」と10万JPYくらいのThinkPadE14を購入しました。

PC SPEC
  • CPU: Ryzen5500U
  • Memory: 24GB
  • SSD: 512GB

これはその備忘録として作成しています。

WSL2環境構築

購入した時期的にWindows11がPre Installされているのですが、デフォルトでWindowsTerminalが入っているしwslももともと入っているし、と至れり尽くせりの環境があらかじめ揃っています。
WindorsTerminalを起動するとPowerShellが立ち上がるので、次のコマンドを入力してLinuxのインストールを実行します。

wsl --install -d debian

wsl --help で利用できるコマンド一覧を確認できます。 distroを指定しなかった場合は、デフォルトでUbuntuになるみたいです。
この時、Hypervisorが有効でなかったりすると再起動しろとか言われるのでそのあたりは指示に従いましょう。
installされると、wslとコマンドを入力すると Linuxを利用できるようになります。
初回はUNIX UserとPasswordを求められるので、そのあたりだけちゃんと自分のりようするものを設定しましょう。
WindowsTerminalは最初に起動するTerminalとしてWSL2を選択できます(この辺りはWindowsTerminalを再起動したりすると設定できるようになります)。
sudo apt install neofetch; neofetchなどを実行すると、次のように出てきました。てっきりDebianのロゴが出てくるものだと思ったのにWindowsのロゴが出てきたのは意外でした。
インストール直後のneofetchの結果

さて、WSL2のDocker開発環境が正しく動作しなかった問題の最大の原因はWindowsのPermit 777問題です。上記の画像にあるように、WSL2の最初の起動い位置はWindowsFS上の/mnt/c/Users/<yourname>になります(mount場所などは変更可能)。ではWindowsFS上のPermitがどうなっているのかと試しに ls -lなどでファイル一覧を見てみると言葉を失うのですが、 777になっています。
Linux側のhome dirに戻って ls -lを実行するともちろんそんなことはなく、、、これは歴史上そうなってしまっているという良い例ですね。
じゃあなぜこれがDocker環境が動かなくなる原因になりえるかというと、 MySQLなどPermit 777のconfig fileを危険と判断して読み込まないようにしているソフトウェアが存在します。
なので素のWSL2からWindowsFS上にgit cloneなどをしてきて MySQLに config fileを読ませると permit 777なので読み込んでくれず、必要な設定が読み込まれず開発環境が動作しないといった所に繋がっていました。
LinuxFS側に git cloneしてくればそんなことはなく正しくPermitが設定されますが、とはいえWindowsFS上で作成されたファイルがすべて777になってしまうのは非常に気持ちが悪いです。
MS側もそこは把握してくれているようで、対応するための方法を提供してくれています。

WSL Config

MS Docs: Advanced settings configuration in WSL

WSL2のconfigには2種類あります。 wsl.confと、.wslconfigです。
.wslconfigは WSL2全体にかかわる設定をでき、Windows側のhome dir(/c/Users/<yourname>)に配置します。
例えばCPUコアの割り当て数や、メモリ割り当て量を設定できます。
自分の場合はデフォルト設定から変更したかったのはメモリ割り当て量だけでしたので、次のように設定しました。ほかの設定に関してはMS Docsを確認してください。

[wsl2]
memory = 16GB

個々のLinuxに関する設定は /etc/wsl.confに設定します。今回でいうとmountしたWindowsFSのPermitに関するものがそうです。最低限一般的なPermitに変更するには次のように設定します。maskandではなくsubなのに注意が必要です。
https://github.com/a-skua/dotprofile/blob/4fe4ebe039357dbaf9dd3119f3dcc560f1719ffd/wsl/wsl.conf

これらを設定し、 wsl.exe --shutdown(WSL2上から実行できます)を実行してWSL2を再起動すると、Permitが変更されます。

WSLのDebian古すぎ問題

wsl --install -d debianで入れた debianはどうも Stretchのようでした(実はdistroを指定するときにバージョンも併せて指定できたりするのを自分が知らないだけなのかもしれませんが)。
さすがに古すぎるので、vimなどで /etc/apt/sources.listを開いて見える stretchの文字をすべて bullseyeに置換して apt update; apt upgradeを実行すると、
bullseyeに置換してapt update and upgradeを実行した後のneofetch
なぜかWindowsのロゴが消えてDebianのロゴになりました(ヨシ。

WSL2の開発環境のあれこれ

localhost

WSL2上でwebサーバーを立ち上げた場合に、Windows上からlocalhostでアクセス可能です(この可否については .wslconfigで変更可能)。
docker compose run --rm -p 80:80 httpdと設定し、Windowsのブラウザから http://localhostでアクセス可能です。
この記事も実際にそのようにして書いています。

Docker

Docker for Desktop(以下D4D)を利用しても良いですし、しなくとも良いです。
WSL2は ベースにあるLinux Kernel上にDistroを個別のコンテナとして起動しているようです。
D4Dをインストールすると wsl.exe -lを実行した際に Dockerのコンテナが立ち上がっているのを確認できます。
個人的にはD4Dの機能をそれほど使っていないので、Linux上にDockerをinstallして利用しています。

Docker Docs: Install Docker Engine on Debian

基本的には Docsに書いてある通りにinstallを実行すればDockerを利用できるようになりますが、そのあたり手間だという人は D4Dを利用しても良いでしょう。
ただし、DebianだとDaemonが起動に失敗するという状況があるので注意でが必要です(設定により回避可能です)。
stackoverflow: docker - start failed because /etc/fstab not found

Linux GUI

WSL2上のLinux GUIを表示できたりもします。次の画像は Linux上の FlutterとChromeを利用している例です。
https://comet.askua.dev の開発環境を立ち上げた例
若干動作にFPSが不足気味な部分を感じるものの、試せないレベルではないなという感じでした。

Windows上から flutter runを実行した例
FPSに関してはWindows上から試したほうが高く感じましたが、WSL2上のGUIが特別遅いという印象はありませんでした。

WSL2を使ってみてどうだったか

Permit 777には驚きましたが、個人的にWSL2のユーザー体験は非常に良かったです。
Windowsのコマンド周りを覚えずともすべてがWSL2上で使い慣れたコマンドで完結する実家のような安心感、WSLの設定を変更するために悪しきWindowsSettingを開かずに WSL Configを書き換えて再起動するだけで済むというのは自分がサービスのターゲット層だということ感じさせてくれるものでした。
WSL2の登場によって個人的にはWindowsとLinuxのDualBoot世界線は消えて世界はWindows+WSL2 or Linux Onlyになるのではという印象を受けました。
今までのように「WebならとりあえずMacを選んでおけ」というのは完全になくなった印象はあり、純粋な開発環境以外の付加価値を求めない、Dockerくらいしか使わないみたいな層にとってはWSL2は大いに選択肢になりえると思えました(なんたって安いですし)。

今更な内容の記事ではありますが、最後まで読んでいただきありがとうございました。

Discussion