まとめ
- 構築済み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イメージをダウンロードして展開します。
1 2 3 4 5 6 7 |
$ 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を挿入し、接続されているデバイス名を確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ 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をアンマウントします。
1 2 3 |
$ 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で確認した各自のデバイス名に読み替えて実行してください。
1 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ベースであることが確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ 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動作)になっており、本来の性能を活かしていない状態になっています。
1 2 3 |
$ sudo cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor powersave |
そこで、cpufrequtilsを導入します
1 2 3 |
$ sudo apt-get update $ sudo apt-get install -y cpufrequtils |
導入した時点でCPUガバナーが ondemand
になります。
1 2 3 |
$ 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) が入っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ 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
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
が必要なためにインストールしておきます
1 2 |
$ sudo apt-get install make |
docker-ceのクローンとチェックアウト
1 2 3 4 |
$ 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用に修正したものです)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
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領域として有効化します。
1 2 3 4 |
$ 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)が最初から入っているためビルドできます。
1 2 |
$ 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 をインストールします。
1 2 3 |
$ sudo apt-get purge docker-engine $ sudo dpkg -i docker-ce_17.09.0~ce-0~debian_arm64.deb |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ 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-world
や docker pull redis
等を実行した場合に、これまではx86_64向けバイナリのdockerイメージがダウンロードされていたのですが、今回構築したarm64のdocker環境でpullすると、自動的にarm64バイナリのhello-worldやredisのdockerイメージがダウンロードされることが確認できます。
マルチアーキテクチャの対応は現状では以下のような状況のようです。
1 2 3 4 5 |
ベースとなる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の容量に応じてディスク領域が自動的に拡張されるため、手動での拡張する等の対応は特に必要ありません。
コメント
[…] 参考 https://docs.docker.com/config/daemon/systemd/#httphttps-proxy https://blog.knjcode.com/arm64-docker-on-raspberry-pi-3/ […]