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イメージをダウンロードして展開します。

$ curl -LO https://github.com/DieterReuter/image-builder-rpi64/releases/download/v20170303-185520/hypriotos-rpi64-v20170303-185520.img.zip
$ gsha256sum hypriotos-rpi64-v20170303-185520.img.zip
c142af60feaa87115537c744f3abf67c7f8bd2c8c1c188f4aee38e21212b8e6f  hypriotos-rpi64-v20170303-185520.img.zip
$ unzip hypriotos-rpi64-v20170303-185520.img.zip
Archive:  hypriotos-rpi64-v20170303-185520.img.zip
  inflating: hypriotos-rpi64-v20170303-185520.img

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

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

$ diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage                         250.1 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
...
(省略)
...
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *64.5 GB    disk2
   1:                 DOS_FAT_32 BOOT                    64.5 GB    disk2s1

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

3. microSDをアンマウント

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

$ diskutil unmountdisk /dev/disk2
Unmount of all volumes on disk2 was successful

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

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

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

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

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

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

$ sudo dd if=hypriotos-rpi64-v20170303-185520.img of=/dev/rdisk2 bs=1m

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

5. OSの起動

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

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

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

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

$ arch
aarch64
$ getconf LONG_BIT
64
$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=debian
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

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

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

$ sudo cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
powersave

そこで、cpufrequtilsを導入します

$ sudo apt-get update
$ sudo apt-get install -y cpufrequtils

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

$ sudo cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
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 version
Client:
 Version:      1.13.1
 API version:  1.26
 Go version:   go1.8
 Git commit:   7c08210
 Built:        Tue Feb 21 08:52:13 2017
 OS/Arch:      linux/arm64

Server:
 Version:      1.13.1
 API version:  1.26 (minimum version 1.12)
 Go version:   go1.8
 Git commit:   7c08210
 Built:        Tue Feb 21 08:52:13 2017
 OS/Arch:      linux/arm64
 Experimental: true

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

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

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

docker-ce 17.09.0-ce debian-jessie arm64

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

debパッケージ作成の流れ

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

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

$ sudo apt-get install make

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

$ git clone https://github.com/docker/docker-ce
$ cd docker-ce
$ git checkout v17.09.0-ce

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

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

FROM arm64v8/debian:jessie

# allow replacing httpredir or deb mirror
ARG APT_MIRROR=deb.debian.org
RUN sed -ri "s/(httpredir|deb).debian.org/$APT_MIRROR/g" /etc/apt/sources.list

RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential cmake curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libltdl-dev libudev-dev pkg-config vim-common libsystemd-journal-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*

ENV GO_VERSION 1.9
RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-arm64.tar.gz" | tar xzC /usr/local
ENV GOPATH /go
ENV PATH $PATH:/usr/local/go/bin:$GOPATH/bin
ENV DOCKER_BUILDTAGS apparmor pkcs11 selinux
ENV RUNC_BUILDTAGS apparmor selinux

COPY common/ /root/build-deb/debian
COPY build-deb /root/build-deb/build-deb

RUN mkdir -p /go/src/github.com/docker && \
  mkdir -p /go/src/github.com/opencontainers && \
  ln -snf /engine /root/build-deb/engine && \
  ln -snf /cli /root/build-deb/cli && \
  ln -snf /root/build-deb/engine /go/src/github.com/docker/docker && \
  ln -snf /root/build-deb/cli /go/src/github.com/docker/cli


ENV DISTRO debian
ENV SUITE jessie

WORKDIR /root/build-deb

ENTRYPOINT ["/root/build-deb/build-deb"]

スワップ領域の設定

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

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

$ sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
$ sudo mkswap /swapfile
$ sudo swapon /swapfile

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

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

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

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

$ make deb DOCKER_BUILD_PKGS=debian-jessie

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 をインストールします。

$ sudo apt-get purge docker-engine
$ sudo dpkg -i docker-ce_17.09.0~ce-0~debian_arm64.deb
$ docker version
Client:
 Version:      17.09.0-ce
 API version:  1.32
 Go version:   go1.9
 Git commit:   afdb6d4
 Built:        Thu Sep 28 04:39:05 2017
 OS/Arch:      linux/arm64

Server:
 Version:      17.09.0-ce
 API version:  1.32 (minimum version 1.12)
 Go version:   go1.9
 Git commit:   afdb6d4
 Built:        Thu Sep 28 04:32:10 2017
 OS/Arch:      linux/arm64
 Experimental: true

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

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

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

ベースとなるOSはUbuntu、BusyBox、Debian
プログラミング言語とランタイムはGo、Python、Java
データベースはPostgreSQL、Neo4j、Redis
アプリケーションはWordPress、Ghost、Redmineなど

その他

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

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

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

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

参考

スポンサーリンク
レクタングル(大)

シェアする

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

フォローする

スポンサーリンク
レクタングル(大)