Go Wiki: Plan 9 上の Go
はじめに
Go の実験的な移植版が、Plan 9 from Bell Labs オペレーティングシステムで利用可能です。
サポートされているアーキテクチャ
Plan 9 への Go の移植版は、以下のアーキテクチャで利用可能です
- 386
- amd64
- arm
サポートされているカーネル
現在の Go ディストリビューションは、以下で正常にテストされています
- Plan 9 from Bell Labs (386 および arm) カーネル
- 9front amd64 カーネル
- Bell Labs 9k (amd64) カーネル
要件
Plan 9 上の Go には、以下のシステムコールを提供するカーネルが必要です
- tsemacquire (2012-06-30 以降利用可能)
- nsec (2014-05-15 以降利用可能)
pread システムコールの修正が必要です。ファイルを読み取るときに、pread がチャネルオフセットを更新しないようにするためです
TCP 接続制御ファイルは、「close」メッセージを処理して TCP 接続を正常に閉じ、リーダーをウェイクアップできるようにする必要があります
wstat の後に Qid.vers をインクリメントするために Fossil の修正が必要です。そのため、切り捨て後に読み取りを行うと、キャッシュされたコンテンツではなく、新しいファイルのコンテンツが返されます。
X.509 証明書で SHA-2 署名をサポートする必要があります。そのため、GoogleSource、GitHub などでホストされているリポジトリからソースをダウンロードできます。
Raspberry Pi で Plan 9 を実行している場合は、Richard Miller の最新の bcm カーネルが必要です。
crypto/x509
パッケージの CA 証明書は、/sys/lib/tls/ca.pem
にインストールする必要があります。https://curl.haxx.se/ca/cacert.pem
からダウンロードするか、別のシステムからコピーできます。
9front の場合、標準ライブラリテストのためにループバックアドレスを設定する必要がある場合があります
ip/ipconfig -P loopback /dev/null 127.1
ip/ipconfig -P loopback /dev/null ::1
インストール
Go は Go で書かれているため、C で書かれた Go の最新リリースである Go 1.4.3 で Go をブートストラップすることをお勧めします。
ただし、Go 1.4 ランタイムは Plan 9 では十分に成熟していなかったため、別のオペレーティングシステムを使用して、より新しいバージョンの Go からブートストラップすることをお勧めします。
Plan 9 からのブートストラップ
まず、Go 1.4 をインストールします
cd /tmp
git clone -b go1.4.3 https://go.googlesource.com/go go1.4
cd go1.4/src
hget http://9legacy.org/go/patch/syscall-exec.diff | ape/patch -p2
make.rc
SMP 対応のマシンを実行している場合は、syscall-exec パッチが必要です。
次に、GOROOT_BOOTSTRAP
環境変数を設定します
GOROOT_BOOTSTRAP=/tmp/go1.4
最後に、最新バージョンの Go をインストールします
cd /tmp
git clone https://go.googlesource.com/go
cd go/src
all.rc
bind -a /tmp/go/bin /bin
これで Go を使用できるようになりました。
別のオペレーティングシステムからのブートストラップ
まず、Go インストール手順に従って、このオペレーティングシステムに Go をインストールしておく必要があります。
次に、Plan 9 用の Go ツールチェーンをクロスコンパイルできます
cd $GOROOT/src
GOOS=plan9 GOARCH=386 ./bootstrap.bash
すると、ブートストラップツールチェーンが ../../go-plan9-386-bootstrap.tbz
で利用可能になります。
最後に、このアーカイブを Plan 9 マシンに抽出できます。
例えば
cd /tmp
tar xzf go-plan9-386-bootstrap.tbz
bind -a /tmp/go-plan9-386-bootstrap/bin /bin
これで Go を使用できるようになりました。
GOROOT_BOOTSTRAP
環境変数を設定することで、この Go のインストールを使用して将来の Go リリースをブートストラップできます
GOROOT_BOOTSTRAP=/tmp/go-plan9-386-bootstrap
バイナリからのブートストラップ
plan9/386 用の バイナリパッケージ が利用可能です。
このバイナリパッケージは、plan9/386 ビルダで Go をブートストラップするために使用されます。
cd /tmp
hget -o gobootstrap-plan9-386.tar.gz https://storage.googleapis.com/go-builder-data/gobootstrap-plan9-386.tar.gz
mkdir gobootstrap-plan9-386
cd gobootstrap-plan9-386
tar xzf ../gobootstrap-plan9-386.tar.gz
GOROOT_BOOTSTRAP
環境変数を設定することで、この Go のバイナリパッケージを使用して Go をブートストラップできます
GOROOT_BOOTSTRAP=/tmp/gobootstrap-plan9-386
他のバイナリパッケージは、こちら と こちら で入手できます。
Git
Git は Plan 9 では利用できません。ただし、Git ラッパー がシンプルな rc スクリプトとして利用可能です。go ツールを使用するために必要なものがすべて含まれています。
ビルダ
現在、3 つの Plan 9 ビルダが稼働しており、Go ダッシュボード に結果を報告しています
- plan9-386 は、仮想マシン上で Plan 9 from Bell Labs (386 カーネル) を実行しています
- plan9-amd64-9front は、仮想マシン上で Plan 9 from Bell Labs (amd64 カーネル) を実行しています
- plan9-arm は、Raspberry Pi 3 上で Plan 9 from Bell Labs (arm カーネル) を実行しています
ステータス
Plan 9 への Go の移植は実験的と見なされており、まだ開発中です。Go イシュートラッカー には、既知の問題が多数あります。
問題
Go イシュートラッカー には、OS-Plan9 ラベルが付いた問題が現在多数開かれています。
ヘルプ
Plan 9 への Go の移植は、コミュニティ主導の移植です。Plan 9 上の Go ポートの改善にご協力いただければ幸いです。
メンテナ
多くの人が Plan 9 への Go の移植に貢献してきました。2013 年 12 月以降、Plan 9 への Go の移植は David du Colombier によって維持されています。
トリビア
Go の多くの部分は、3 人の主要設計者のうち 2 人が Bell Labs で Plan 9 に携わっていたため、Plan 9 システムから直接影響を受けています。これらのつながりのいくつかは次のとおりです
- Gopher は、Plan 9 のバニーである Glenda もデザインした Renée French によってデザインされました。
- このリポジトリでホストされている Gc コンパイラは、Plan 9 スタイルのローダー を使用しています。
- Go のアセンブラ は、Plan 9 の構文に基づいています。Go 1.x のスタックベースの ABI は Plan 9 から借用しています。
- お勧めできませんが、Plan 9 C のサポートも多少あり、元の標準ライブラリは Plan 9 の libc から派生したものです。セルフホスティング設計ドキュメント では、この歴史について説明しています。
このコンテンツは Go Wiki の一部です。