post Image
Go 1.5をRaspberry Pi 2で使う

はじめに

Raspberry Pi 2でソースからGo 1.5をビルドしたのでメモします。

環境:

$ uname -a
L Linux raspberrypi 4.1.6-v7+ #810 SMP PREEMPT Tue Aug 18 15:32:12 BST 2015 armv7l GNU/Linux

OSはRaspbianです。以降はユーザpiとして実行してください。

Go 1.4のビルド

まずはGoのソースを取得します。

$ mkdir ~/build && cd ~/build
$ git clone https://github.com/golang/go

後でGo 1.5をビルドするため、リポジトリをコピーしておきます。

$ cp -r ~/build/go ~/build/go1.5

Go 1.5のビルドにはGo 1.4が必要です。まずはGo 1.4をビルドします。

$ cd ~/build/go/src
$ git checkout release-branch.go1.4
$ export GOROOT=/usr/local/go
$ export GOARM=7
$ ./all.bash

ビルドが成功すると、次のメッセージが表示されます。

...
ALL TESTS PASSED

---
Installed Go for linux/arm in /home/pi/build/go
Installed commands in /home/pi/build/go/bin
*** You need to add /home/pi/build/go/bin to your PATH.

最後にgoディレクトリを/usr/local/に移動します。

$ sudo chown pi:pi /usr /usr/local
$ mv ~/build/go /usr/local/go

Go 1.4のビルドはこれで完了です。なお、ビルドには1時間ほど必要です。気長に待ちましょう

$ time ./all.bash
...
real    30m10.077s
user    52m6.540s
sys 5m51.220s

Go 1.5のビルド

続いて、Go 1.5をビルドします。

$ cd ~/build/go1.5/src
$ git checkout release-branch.go1.5
$ # ulimit -s unlimited
$ ulimit -s 1024
$ # sed -i 's/300/600/g' ~/build/go1.5/src/cmd/dist/test.go
$ export GO_TEST_TIMEOUT_SCALE=10
$ export GOROOT_BOOTSTRAP=/usr/local/go
$ ./all.bash

追記 2015-10-06 コマンドを変更しました。

  • 変更前
    • ulimit -s unlimited
    • sed -i 's/300/600/g' ~/build/go1.5/src/cmd/dist/test.go
  • 変更後
    • ulimit -s 1024
    • export GO_TEST_TIMEOUT_SCALE=10

スタックのサイズは、デフォルトでは8192 KBです。この設定は、Goのランタイムが1スレッドに8192 KBのスタックを割り当てることを意味します。32 bitのユーザーモードでは8192という値は大きすぎるので1024に変更してください。

ulimit -s unlimitedでスタックのサイズを無制限にしていますが、この設定を忘れるとスタックが足りず次のエラーが発生します。

ok      cmd/vet 65.300s

##### GOMAXPROCS=2 runtime -cpu=1,2,4
--- FAIL: TestCgoCallbackGC (14.98s)

また、cmd/dist/test.goのタイムアウトをデフォルトの300から600に変更しています。この設定を忘れると、次のようなエラーが発生することがあります。

##### GOMAXPROCS=2 runtime -cpu=1,2,4
panic: test timed out after 10m0s

goroutine 232225 [running]:
testing.startAlarm.func1()
        /home/pi/build/go1.5/src/testing/testing.go:703 +0x10c
created by time.goFunc
        /home/pi/build/go1.5/src/time/sleep.go:129 +0x34
...

デフォルトの300という値は短いのか、OSインストール直後の環境で10回ビルドを試した結果7回失敗しました。今回はとりあえず倍の600に設定しましたが、この値に特に意味はないので、各々の環境に合わせて調整してください。

上記のようにsedでコードを書き換える代わりにGO_TEST_TIMEOUT_SCALEを変更することで対応できます。デフォルトは1ですが、10に設定することでタイムワウとの値が3000に変更されます。

ビルドが成功すると、次のメッセージが表示されます。

...
ALL TESTS PASSED

---
Installed Go for linux/arm in /home/pi/build/go1.5
Installed commands in /home/pi/build/go1.5/bin
*** You need to add /home/pi/build/go1.5/bin to your PATH.

最後にgo1.5/usr/local/goに移動して完了です。

$ rm -rf /usr/local/go &&  mv ~/build/go1.5 /usr/local/go

ちなみに、Go 1.5のビルドは完了まで2-3時間ほど必要です。首を長くして待ちましょう。

$ time ./all.bash
...
real    81m17.891s
user    191m12.890s
sys 30m8.290s

テスト

Go 1.5がインストールされたか確認します。

$ export PATH=$PATH:/usr/local/go/bin
$ go version
go version go1.5.1 linux/arm

バージョンが表示されれば成功です。
続いて、次の内容をhello.goとして作成してください。

package main

import "fmt"

func main() {
        fmt.Printf("🍺hello, world \n")
}

hello.goをテストします。

$ go run hello.go
🍺hello, world

Raspberry Pi 2でGo 1.5環境が整いました!!!

補足

Dave Cheney氏がブログ記事Unofficial ARM tarballs for Go _ Dave CheneyにてARMアーキテクチャ向けにコンパイル済のバイナリを配布されています。ビルドが終わらなくて待ちきれない、一刻も早くGoを使いたい、という方はARMv7のバイナリをダウンロードして下さい。なお、Unofficialと言っていますが、彼はGoのコミッタですので、バイナリは安全です。保証はしませんが。

参考

  1. Installing Go from source – The Go Programming Language
  2. Building Go 1.5 on the Raspberry Pi _ Dave Cheney
  3. Installing Go on the Raspberry Pi
  4. runtime: ./run.bash crash with Go tip on Raspberry Pi 2 #12035
  5. runtime: pthread_create failure in TestCgoCallbackGC on Raspberry Pi 2 linux/arm #11959

『 Go 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。