Skip to content

9legacyの更新をCDイメージから取り込む

9fansで見たところ、replica(1)を使う方法が公式のアップデートらしい。

ローカルでfossilやkfsが動作しているなら /dist/replica/cd を使えばいいが、ネットワークブートしている場合は以下のようなファイルを作っておく。2026年6月に /dist/replica/9legacy が存在していることに気づいたので、これはもう不要かもしれない。

#!/bin/rc
s=/n/dist/dist/replica
serverroot=/n/dist
serverlog=$s/plan9.log
serverproto=$s/plan9.proto
fn servermount { status='' }
fn serverupdate { status='' }
if ( ! test -e /srv/boot && ! test -e /srv/kfs ) {
echo 'error: neither /srv/boot nor /srv/kfs present; make sure you are running on the file server'
exit '/srv/boot or /srv/kfs not present'
}
fn clientmount { mount -c /srv/boot /n/boot }
c=/n/boot/dist/replica
clientroot=/n/boot
clientdb=$c/client/plan9.db
clientexclude=(dist/replica/client)
clientlog=$c/client/plan9.log
clientproto=$c/plan9.proto
applyopt=(-u -T$c/client/plan9.time)

これでダウンロードして更新する。

Terminal window
cd /tmp
hget http://9legacy.org/download/9legacy.iso.bz2 >9legacy.iso.bz2
bunzip2 9legacy.iso.bz2
9660srv
mount /srv/9660 /n/dist 9legacy.iso
replica/pull -v /dist/replica/cdboot

ただし9legacy側で全部リセットしてからログを作り直しているようで、常に /sys/src/sys/manlocally modified 扱いされる。なので -s オプションでサーバ側の更新を取り込む。

Terminal window
replica/pull -s sys/src -v /dist/replica/cdboot sys/src
replica/pull -s sys/include -v /dist/replica/cdboot sys/include
replica/pull -s sys/man -v /dist/replica/cdboot sys/man
replica/pull -s sys/lib -v /dist/replica/cdboot sys/lib
replica/pull -s rc/bin -v /dist/replica/cdboot rc/bin
# 他にもあれば
replica/pull -s [file] -s [file] -v /dist/replica/cdboot [paths]

適用された状態はPlan 9のreplicaファイルを見れば判断できるのだが、9legacyのCDイメージでは plan9.log が全て新規扱いで配布されるので plan9.timegen (2つ目のフィールド)は常に0で固定しておく必要がある。

問題点

  • setgidがエラーになる
  • replica/pullでmkdirに失敗する

CDイメージの中身はPlan 9側で見てもいいし、udisksctlでCDイメージをマウントする方法のようにホスト側で見てもいい。