systemd (genie) on Gentoo on WSL2 (あとgpg-agent)

(追記)ストア版がv1になってビルトインサポートが安定化したのでややこしくないようにタイトル書き換えました

センセーショナルなタイトルのような気もするけど新規性のある所だけかいつまんでるので、抜けてるところは他のブログでも見てください。


新しいPCを買いました。

kakaku.com

いまのところ物理的にも論理的にも軽いので良いです。ぜんぜん使ってないけど。 ところで5800Uと5600XってCineBenchのスコアがあんまり変わらないらしいね。デスクトップェ……

環境検討

今回はデュアルブートをせずになんとかしようの試みをしました。

このPCなぜかWin11 Pro が入ってるのでHyper-Vを検討しましたが、別にめちゃくちゃパフォーマンスが良い訳ではないらしいのでやめました。

pmp-style.hatenablog.com

で次にWSL。せっかくなのでディストリはGentooにしました。

入れ方はかんたん。Stage3 tarballを落としてきてxz部分だけ解凍したらwsl --importするだけ。あと細かいのはあるけど↓に大体書いてあります。

wiki.gentoo.org

pacstrapするだけのArchはインスコ楽だよなあと思ってたけど、こう思うとGentooも大概楽だよなあと(最近GUIのLive USBも出たらしいし)。 ちなみにWSLでArchやるならarchwslがいいと思います(scoopで入るし)。

github.com

閑話休題(これが言いたいだけ)。

genie

以前からWSL環境でsystemd環境下っぽい動きのできるgenieというのを知っていたので導入を検討しましたが、配布パッケージがない模様。

github.com

しかたがないのでebuildを書きました。↓のoverlayに入っています。 github.com

時代は(laymanではなく) eselect-repositoryらしいのでこれ経由で(というかGitHubgit://を無効化したことに気付いてなくて執筆時点ではlayman経由だと無理です)。

emerge app-eselect/eselect-repository
eselect repository add gachicam-overlay git https://github.com/Gachicam/gachicam-overlay.git

あとemerge --syncとかいるんだっけ

genieはビルドの途中でpythonライブラリを(pip経由で)入れようとするんですが、portageは当然これを許さないので自前でsrc_compileとかを書き直しています。もちろん入れようとするパッケージのebuildも↑のoverlayに入っています。 1つはGitHubから直pullするやつになっていて(PyPIにはあるけどgenieが使っているバージョンのものではない)、それはNo Keywordsになっています。悪しからず。

ということでflaggieが入っているなら↓からどうぞ。

flaggie +~amd64 sys-apps/genie dev-python/python-hosts
flaggie dev-python/nsenter '+kw::**'
emerge sys-apps/genie

あとは~/.profileとかで適当に

if [ ! -v INSIDE_GENIE ]; then
  genie -s
fi

(これはwikiに乗ってるやつ)

おまけ: YubiKey

YubiKeyが便利なので使っているんですが、genieの環境下だとwsl2-ssh-pageantが(READMEに乗ってるままだと)使えなくなる可能性が高いです(未検証)。

wsl2-ssh-pageant自体についての説明は省略(そのへんにいくらでも転がってるので)。 一応リンク。 github.com

で、

関係あった (https://lists.gnupg.org/pipermail/gnupg-devel/2016-June/031192.html あたり?)

/var/run/<uid>/gnupgが作られてしまうものはどうしようもないので便乗してgpgconf --list-dirsを使う方向に。 あとはGpg4Win 4.0あたりでソケットのパスが%LOCALAPPDATA%\gnupgになったらしいことを踏まえ、修正版

wsl2_ssh_pageant_bin="/path/to/wsl2-ssh-pageant.exe"
wsl2_ssh_pageant_opt="-verbose -logfile $HOME/.wsl2_ssh_pageant.log -gpgConfigBasepath 'C:/Users/<username>/AppData/Local/gnupg'"

if test -x "$wsl2_ssh_pageant_bin"; then
  ## SSH
  export SSH_AUTH_SOCK=$(gpgconf -L agent-ssh-socket)
  if ! ss -a | grep -q "$SSH_AUTH_SOCK"; then
    rm -f "$SSH_AUTH_SOCK"
    (setsid nohup socat UNIX-LISTEN:"$SSH_AUTH_SOCK,fork" EXEC:"$wsl2_ssh_pageant_bin $wsl2_ssh_pageant_opt" >/dev/null 2>&1 &)
  fi

  ## GPG
  export GPG_AGENT_SOCK=$(gpgconf -L agent-socket)
  if ! ss -a | grep -q "$GPG_AGENT_SOCK"; then
    rm -rf "$GPG_AGENT_SOCK"
    (setsid nohup socat UNIX-LISTEN:"$GPG_AGENT_SOCK,fork" EXEC:"$wsl2_ssh_pageant_bin $wsl2_ssh_pageant_opt -gpg S.gpg-agent" >/dev/null 2>&1 &)
  fi
else
  echo >&2 "WARNING: $wsl2_ssh_pageant_bin is not executable."
fi
unset wsl2_ssh_pageant_bin
unset wsl2_ssh_pageant_opt

ちなみにArchだと(?) gpg-agentのsystemdソケットが開いているせいかなんかで動かないことがあるので、そういうときは

$ systemctl --user mask gpg-agent.socket gpg-agent-ssh.socket

するといいかも(disableだとgenieが再起動した時に生き返る)。

追記: VSCodeとかでいい感じにするために/etc/wsl.confでデフォルトユーザを変更すると↑の作戦が使えなくなったのですが、私の場合wsl2-ssh-pageantのログファイルのownerがrootなことに気付いたので一旦消してみたところ(とりあえず)動いたので、同じ症状が出たら試してみてください(また動かなくなるかもしれん)。 逆になんでrootになっていたんだ……?(無知)


これでしばらく頑張ってみます。