Plan 9とGo言語のブログ

主にPlan 9やGo言語の日々気づいたことを書きます。

Plan 9でTailscaleネットワークに参加する

Plan 9にはパスワード等シークレットを一元管理するための認証エージェントとしてfactotum(4)が存在しています。factotum はデータを永続化しませんし、そのメモリ領域はカーネルによって保護された状態にあって、デバッガは当然アタッチできないしプロセスの kill(1) さえできません*1。代わりに、暗号化した状態で永続化するためのsecstore(8)があって、この2つが協調して動作します。

筆者は現在、Google Cloud上でCompute Engineを使って3台モデルのPlan 9システムを運用していますが、普段はLinux上で plan9port も使っています。そうしたとき、plan9portfactotum からGCPにある secstored を参照したくなるのだけども、secstored には機密情報が入っているのでインターネットからアクセス可能な場所に置きたくはありません。なので今までは二重管理も仕方ないと思っていたのですが、2025年4月のエイプリルフールネタでTailscaleがPlan 9に対応したとあった*2ので試してみました。

エイプリルフールの記事は以下の2つです。9fansもとても盛り上がっていました。

必要なもの

Tailscaleアカウント

なければ取得しておきましょう。

Goコンパイラ

TailscaleはGoで実装されているのでPlan 9用のGoコンパイラが必要です。他OSでクロスコンパイルする方法がいちばん早いと思いますが、Plan 9の9k(64bit)カーネルでGoを最初からビルドするで紹介したのように最初から順に更新してもいいと思います。

カーネルの更新

9legacyを使っている場合は、Tailscale対応のために不動小数点の扱いと ndb/dns の修正が入っているので、最新のコードに更新しておきましょう。古いPlan 9を使っている場合は、tailscaled を実行したときに以下のようなエラーとなって動作しません。

cpu% tailscaled
logtail started
Program starting: v1.82.0-ERR-BuildInfo, Go 1.24.2: []string{"tailscaled"}
logpolicy: using UserCacheDir, "/usr/lufia/lib/cache/Tailscale"
logpolicy.ConfigFromFile /usr/lufia/lib/cache/Tailscale/tailscaled.log.conf: open /usr/lufia/lib/cache/Tailscale/tailscaled.log.conf: '/usr/lufia/lib/cache/Tailscale' does not exist
logpolicy.Config.Validate for /usr/lufia/lib/cache/Tailscale/tailscaled.log.conf: config is nil
dns: using dns.noopManager

インストール

準備ができたらTailscaleをソースからビルドします。

go install tailscale.com/cmd/tailscaled@latest
go install tailscale.com/cmd/tailscale@latest

tailscaleネットワークに参加

ビルドが終わればあとは tailscaled を実行するだけなのですが、オプションが色々あって難しいので、Arch Linuxtailscale パッケージを参考にオプションを与えました。具体的にはsystemdのユニットファイルが以下のようになっていたので

EnvironmentFile=/etc/default/tailscaled
ExecStart=/usr/sbin/tailscaled --state=/var/lib/tailscale/tailscaled.state --socket=/run/tailscale/tailscaled.sock --port=${PORT} $FLAGS
ExecStopPost=/usr/sbin/tailscaled --cleanup

なのでPlan 9でも次のようなで起動します。ここでは --socket オプションと --port オプションを渡していませんがデフォルトで動作します。

tailscaled --state $home/lib/tailscaled/tailscaled.state

デーモンが起動したら、あとは tailscale up とするとログインURLが出力されるので、それにアクセスすればネットワークに参加できます。

tailscale up

これで比較的安全に secstored とローカルの factotum が連携できるようになって嬉しいですね。

Plan 9端末からtailscaleネットワークに参加した画面です

*1:本当に誰もなにもできなくなる

*2:この少し前にRuss CoxがGitHubで9legacyをForkしていて、何しているんだろうねと社内のSlackで話をしていたのだった