Raspberry Pi 3をarm64で起動してdockerを利用する

まとめ

  • 構築済みarm64のOSイメージを使ってRaspi3をarm64で起動する手順を解説
  • デフォルトではCPUが省電力モード(powersave)になっているため、必要に応じて設定変更
  • OSイメージにはdocker(v1.13.1)が最初から導入されているが、現時点で最新の v17.09.0-ce に更新する手順を解説
  • Wi-FiやBluetoothやGPIO周りの動作は未確認

概要

Raspberry Pi 3のCPUは64bit(arm64)対応ですが、Raspbian等のOSイメージで起動すると32bitのarmv7互換モードで動作します。

以前からRaspi3をarm64で利用したいと思っていたのですが、下記のハンズオン記事を見つけ、紹介されている手順を試してみたところ、Raspi3をarm64で起動してdockerを利用できるようになりました。(2017年3月下旬頃から特に問題なく運用中)

ハンズオン記事: Building a 64bit Docker OS for the Raspberry Pi 3

記事では、 Bootloader, Kernel, Root Filesystem, SD Card Image と順を追ってRaspi3で起動する debianベースの64bit OSの構築方法が解説されており、手順に従って作業することで、docker導入済みのarm64で起動するOSイメージを構築できます(が、かなり時間がかかります)。

この記事では、イメージ構築手順は省き、ハンズオン記事作者が公開してくれている構築済みのOSイメージをダウンロードしてmicroSDカードに書き込む手順と、
利用における補足事項を解説します。

64bit Docker OS for the Raspberry Pi 3 の導入手順

macOS で実際に導入した手順を紹介します。

1. 構築済みOSイメージのダウンロード

構築済みのOSイメージは
https://github.com/DieterReuter/image-builder-rpi64/releases からダウンロードできます。

OSイメージをダウンロードして展開します。

2. microSDのデバイス名を確認

macにmicroSDを挿入し、接続されているデバイス名を確認します。

microSDが /dev/disk2 として認識されていることが分かります。

3. microSDをアンマウント

microSDにイメージを書き込むための準備として、microSDをアンマウントします。

アンマウントしてもmicroSDはmacに挿したままにしておきます。

4. OSイメージの書き込み

さきほど展開したイメージ (hypriotos-rpi64-v20170303-185520.img) を dd コマンドで書き込みます。

if に書き込むイメージファイル名を指定し、 of に書き込み先のmicroSDのデバイス名を指定します。(注:指定するデバイス名のdiskの前にrを付けます /dev/disk2 なら /dev/rdisk2 )

bs=1m はイメージを書き込む際のブロックサイズを指定しています。

of は、手順2で確認した各自のデバイス名に読み替えて実行してください。

書き込みが終わったあとに再度microSDをアンマウントし取り外します。
(書き込みによって再度マウントされた状態になっています)

5. OSの起動

OSイメージを書き込んだmicroSDをRaspi3に差し込んで起動します。
有線LANに接続しておけばDHCPで自動的にIPアドレスを取得します。

nmapコマンドやルータの設定画面等からRaspi3に割り当てられたIPアドレスを確認してsshでログインします。

初期ID/PASSは pirate/hypriot です。ログイン後にパスワードを変更しておきましょう。

ログインすると、以下のように、arm64で起動しており、debian-jessieベースであることが確認できます。

CPUガバナーの設定確認・変更

デフォルトの状態ではCPUが省電力モード(powersave 600MHz動作)になっており、本来の性能を活かしていない状態になっています。

そこで、cpufrequtilsを導入します

導入した時点でCPUガバナーが ondemand になります。

この場合はCPU負荷に応じて周波数が600MHzから1.2GHzに変動するようになります。

CPUガバナーの設定には ondemand 以外にも、 performance conservative 等あり、
ざっくりと以下のような動作をします。

  • performance 1.2GHz固定
  • ondemand 600MHz 〜 1.2GHz可変 (負荷に応じて素早く変動)
  • conservative 600MHz 〜 1.2GHz可変 (負荷に応じてゆっくりと変動)
  • powersave 600Mhz固定

docker-ce v17.09.0-ce を導入する

イメージには最初から docker-engine (v1.13.1) が入っています。

このまま使っても問題ないですが、最新のdocker-ceに更新する手順も以下に解説します。

arm64用のdocker-ceはaptでインストールできないため、ソースからビルドしdebパッケージを作成してインストールします。

構築済みのdebパッケージを以下からダウンロードできるようにしておきました。

docker-ce 17.09.0-ce debian-jessie arm64

2018/05/19追記 18.03.1-ce のパッケージも作成しました。
docker-ce 18.03.1-ce debian-jessie arm64

こちらをダウンロードして、以降のパッケージインストール手順から実行することもできます。

debパッケージ作成の流れ

docker-ceのソースをcloneして、現時点で最新の v17.09.0-ce にチェックアウトし、
arm64 debian-jessie向けのビルド用Dockerfileを手動で追加した後に、ソースのビルドとdebパッケージ作成を行います。

またビルドに make が必要なためにインストールしておきます

docker-ceのクローンとチェックアウト

arm64 debian-jessie向けビルド用Dockerfileを作成する

components/packaging/deb/debian-jessie/Dockerfile.aarch64 というファイルを以下の内容で作成します。
(armv7 debian-jessie向けのビルド用Dockerfileをarm64用に修正したものです)

スワップ領域の設定

残念な事に、メモリ1GBのRaspi3でdocker-ceのdebパッケージを作成しようとするとメモリ不足によるエラーで失敗します。

今回解説した手順で起動したRaspi3はswapパーティションがないため、手動で1GBのswap用のファイルを作成してswap領域として有効化します。

この手順では、システム再起動後にはswap領域は無効となります。
作業後にスワップ用ファイルが不要であればswap領域を無効化してファイル削除してかまいません。

ソースのビルドとdebパッケージ作成

ここまで準備できたら、makeでdebパッケージの作成まで自動で行えます。

dockerのビルドにはdockerを使うのですが、今回の環境ではdocker(v1.13.1)が最初から入っているためビルドできます。

arm64化したRaspi3上でのビルドとパッケージ作成に45分程度かかります。

作成されたdebパッケージは components/packaging/deb/debbuild/debian-jessie/ 配下に docker-ce_17.09.0~ce-0~debian_arm64.deb という名前で保存されています。

手順の冒頭にも書きましたが、お急ぎの場合はここから作成済みのdebパッケージをダウンロードできます docker-ce 17.09.0-ce debian-jessie arm64

docker-ce 17.09-ce のインストール

最初から入っているdocker(v1.13.1)をまず削除してから、作成したdebパッケージを使って docker-ce をインストールします。

ちなみに、これまで、dockerはCPUアーキテクチャに応じたdockerイメージを利用者側が考慮してpullして利用する必要がありましたが、
2017年9月中旬からマルチアーキテクチャに対応しました。

例えば、 docker run hello-worlddocker pull redis 等を実行した場合に、これまではx86_64向けバイナリのdockerイメージがダウンロードされていたのですが、今回構築したarm64のdocker環境でpullすると、自動的にarm64バイナリのhello-worldやredisのdockerイメージがダウンロードされることが確認できます。

マルチアーキテクチャの対応は現状では以下のような状況のようです。

その他

Wi-FiやBluetoothやGPIO周りの動作について

今のところ、有線LAN接続でarm64のdockerホストとしてRaspi3を利用しているのみで、Wi-FiやBluetoothやGPIO周りの動作については未確認です。

OSのディスク領域の拡張について

今回利用したOSイメージは初回起動時にmicroSDの容量に応じてディスク領域が自動的に拡張されるため、手動での拡張する等の対応は特に必要ありません。

参考

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメント