WSL2 + subsystemctlの設定メモ

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"'