WSL2中心のWindowsでの開発環境構築
2021-03-17 Wed.
WSL2 とは?
- Windows Subsystem for Linux の 2
- NT カーネルの上で動かしていた 1 と違い、 2 は Hyper-V による完全な VM
- もはや Subsystem じゃないじゃんという声も
WSL2 は普通の Linux VM とはどこが違うのか
- CPU/MEM を事前割当せず動的に Windows と共有
- ビルドのときだけちゃんと CPU 持っていくとか
- (PATH が通っていれば) Windows の exe が動く
- WSL2 側から Powershell.exe を叩ける
- explorer.exe で Mac の open 相当ができる
$ webstorm.exe .
でディレクトリを渡しながら開くなども(これは WebStorm が頭いい)
- Systemd がない
- Docker は Docker for Windows が使える(こちらも同様 Hyper-V ベース)
WSL2 の課題点
- fs と IO
- Linux 領域は ext4 なので高速
- Linux 領域を Windows から / Windows 領域(/mnt/c) を Linux からを触る場合は NFS 越しなので遅い
- Linux であり、 Windows ではない
- 自 OS 向けビルドをそのまま行うと当然 Linux 向けビルドが出てくる
- Windows 向けビルドをするには一工夫が必要
- クリップボードが別
- それぞれの OS のコマンドを叩いて行き来させるしかない
- ネットワークが分離されている
- localhost でのアクセスはブリッジされるがそれ以外は……
- ローカル IP が動的に生成されるのでポートフォワードは都度行わないといけない
- Systemd が動かない
- みんな大好き resilio sync が動かせない
そんな WSL2 をうまく使うための Workaround たち
Genie で systemd を動かす
- PID1 で systemd を動かすためのソフトウェア
- WSL2 の VM 起動時に genie を起動する必要がある
- 後述する Windows 起動時スクリプトを使用する
Windows 起動時スクリプト
- ローカルグループポリシーエディターの奥深くで任意のタイミングにコマンドを実行できるスクリプトという機能がある
- ログイン時に wsl.exe から genie を起動するなど
- ログイン時に powershell.exe からファイアウォールのポートフォワードの設定をするなど
win32yank と xsel でクリップボード共有をがんばる
- win32yank.exe という xsel のようなものを叩き Windows のクリップボードに送る
- Windows からの貼り付けは Ctrl(+Shift)+V を使う
- Vim 対応も
.exe を呼べばなんでもできる
- Windows から PATH を通してある .exe は WSL2 のシェル上から実行可能
- PATH を全部通すと補完が遅くなるので絞ったほうが良いです
- Windows に入れた node.exe を WSL から実行して Windows 向け Electron ビルドを作ったり
- 開発時に開かれる GUI も Windows 側で開かれる
- puppeteer も node.exe なら Windows で動く
- Powershell.exe を実行すればだいぶ色々できる
- 上記の起動時スクリプトでやっているようなことを WSL2 のライフサイクルにすることも
Windows まともなターミナルない問題も Windows Terminal が解決
- 当初のがっかり感はかなり解消し、現在は Windows で最も良さそう
- GPU レンダリングなので速い(Hyper が遅い……)
- 日本語入力もマウス操作も tmux も問題ない(Alacritty は日本語とマウスが……)
Powershell でさえいい感じにできる
- busybox を入れて PATH を通すだけでもかなり快適に
- 見た目を良するには starship がシュッと入って綺麗になって便利
- https://starship.rs/ja-jp/
- シェル言語としてはかなり高機能なので、使ってみると嬉しさがわかる
https://www.dropbox.com/s/hyyul82t93r120q/starship-demo.webm?dl=0
ArchWSL のすすめ
https://github.com/yuk7/ArchWSL
- 普段使いは最新のパッケージが降ってきてほしいしパッケージビルドもいい感じにしたい
- メジャーバージョンアップのたびにぶっこわれの修理も環境構築しなおしたくない
- 最近の Arch はなかなか壊れないので良いです
- Ubuntu の方が何が原因で壊れたのか分からなくて困ることありませんか
Other Works
2024-05-11 Sat.
Powerfully Typed TypeScript
- TSKaigi 2024
2024-05-10 Fri.
pnpm の node_modules を探検して理解しよう
- ドワンゴ教育サービス開発者ブログ
2024-03-17 Sun.
neverthrow で局所的に Result 型を使い、 try-catch より安全に記述する
- Zenn
2023-12-20 Wed.
レガシーブラウザ向けのビルドオプションを剪定する
- ドワンゴ教育サービス開発者ブログ
2023-05-26 Fri.
Next.js で dynamic import を使い Client だけで動かす Component を実現する
- Zenn
2023-05-02 Tue.
Node.js でファイル名から拡張子を取り除く/取り出すために path.parse を使う
- Zenn
2023-02-27 Mon.
WSL2 で外部からアクセス可能にするために bridge mode を有効にする
- Zenn
2023-01-26 Thu.
init.vim & dein から init.lua & lazy.nvim へ、シンプル設定で移行した
- Zenn
2023-01-13 Fri.
kindle の本をブクログ形式の csv でエクスポートする@2023初春
- Zenn
2023-01-10 Tue.
自宅サーバの移設に際して docker から nerdctl に移行した
- Zenn
2023-01-10 Tue.
自宅サーバを rootless に移行した際のトラブル対応
- Zenn
2021-11-11 Thu.
並列実行した Promise で throw されても全てハンドルしたいときの方法(allSettled, finally, etc...)
- Zenn