WSL2を試したくてWindowsPCを購入した
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のロゴが出てきたのは意外でした。
さて、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に変更するには次のように設定します。mask
がand
ではなくsub
なのに注意が必要です。
これらを設定し、 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
を実行すると、
なぜか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を利用している例です。
若干動作にFPSが不足気味な部分を感じるものの、試せないレベルではないなという感じでした。
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