WSL2 + subsystemctlの設定メモ
WSL2のおかげでLinuxからWindowsに移住できました。WSL2はデフォルトでsystemdが動いていないので、genieを使うのが定番ですが、自分はsubsystemctlを使っています。subsystemctlの設定方法はあまり見かけないので、メモを残しておきます。
インストール
コンパイルからインストールまでのコマンドを一気に書きます。
sudo apt-get install cargo systemd-container binfmt-support git clone https://github.com/sorah/subsystemctl.git cd subsystemctl cargo build --release sudo install -m6755 -oroot -groot ./target/release/subsystemctl /usr/local/bin/subsystemctl sudo systemctl disable systemd-resolved sudo systemctl disable systemd-networkd
Windows Terminalの設定と起動
Windows Terminalの設定で、起動時に"subsystemctl shell --start --quiet"を呼ぶように設定しておきます。
{ "guid": "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}", "hidden": false, "name": "Ubuntu", "source": "Windows.Terminal.Wsl", "commandline": "wsl -d Ubuntu subsystemctl shell --start --quiet", ... },
起動時に次のように表示されたら成功。このメッセージはWSL2の初回起動時だけに表示されますが、気になるなら"RUST_LOG=error subsystemctl shell --start --quiet"とすれば消えます。
[2020-09-26T07:05:16Z INFO subsystemctl] Starting systemd mame@hostname:~$
subsystemctlのための.bashrcの設定
.bashrcに次の一文を足しておきます。
stty -echoprt
これをしないと、バックスペースを押したときに表示が妙なことになることがあります。subsystemctlというより、machinectl shellを通すとechoprtが有効になるようなのですが、systemd側の設定でこれを止める方法を知ってる人がいたら教えてほしいです。
それから、WSL2はデフォルトでWindowsのPATH設定をすべて引き継いでくれますが、subsystemctlを通すとそれが消えます。個人的にはデフォルトの状態はパスが多すぎて補完がよくわからなくなったので、必要なものだけパスを通すことにしました。特に使うものはaliasにしています。
alias explorer="/mnt/c/Windows/SysWOW64/explorer.exe" alias chrome="/mnt/c/Program\ Files\ \(x86\)/Google/Chrome/Application/chrome.exe" alias code="/mnt/c/Users/ユーザ名/AppData/Local/Programs/Microsoft\ VS\ Code/bin/code" alias mery="/mnt/c/Users/ユーザ名/AppData/Roaming/Mery/Mery.exe"
あとsubsystemctlにすると、起動時のディレクトリが"/mnt/c/Users/ユーザ名"ではなく"/home/ユーザ名"になります。これも自分は満足していますが、不満なら適宜変えるとよいと思います。
subsystemctlに関係ないですがついでに。WSL2で大きいファイルや大量のファイルにアクセスしていると、たまにPCが激重になります。ホストのメモリ枯渇が原因(この記事が詳しい)で、topでbuff/cacheが巨大化していたらそれです。次のコマンドで軽くなるので、これもaliasを設定してます。
alias wsl2_drop_caches='sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"'
追記:WSLgのための設定
/tmp/.X11-unix/X0のunix socketで通信するようなので、systemdがtmpfilesを消してしまわないようにする。
sudo systemctl mask systemd-tmpfiles-setup-dev sudo systemctl mask systemd-tmpfiles-setup sudo systemctl mask systemd-tmpfiles-clean
.bashrcでDISPLAY環境変数を定義しておく。
export DISPLAY=:0
これでxclockなど立ち上がる、はず。