ヽ(´・肉・`)ノログ

How do we fighting without fighting?

X86の上でARMのDebian8(Jessie)なDockerImageを作った

X86 環境にて,Docker に含まれている mkimage.sh を利用して ARM 環境の DockerImage を作ることができた.

Debian armhfなDocker imageを作ってみた - kotakのひまじめ日記 でも成功しているようだったが, こちらはスクリプトを自作なさって,それによってうまく動作させていた.

今回僕がやったのは,既存のスクリプトには手を加えずに,環境変数やパラメータだけで作る方法なので,最新版に追従するメンテナンスが楽であろう.

X86 の Debian8(Jessie) 環境で以下のコマンドを打つと debian-image ディレクトリにできる.

$ uname -a
Linux packer-virtualbox-iso-1441705744 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1+deb8u3 (2015-08-04) x86_64 GNU/Linux
$ cat /etc/debian_version
8.2
$ sudo sh -c "echo 'deb http://ftp.jp.debian.org/debian jessie-backports main' > /etc/apt/sources.list.d/jessie-backports.list"
$ sudo apt-get -q update && sudo apt-get install -qq -y debootstrap qemu-user-static git docker.io
$ git clone -b v1.8.2 --depth 1 https://github.com/docker/docker.git
$ sudo DEBOOTSTRAP=qemu-debootstrap docker/contrib/mkimage.sh --dir debian-image --tag niku/armhf-debian debootstrap --no-check-gpg --arch=armhf --variant=minbase jessie http://ftp.jp.debian.org/debian

もしこれを DockerHub へアップロードしたいときは,追加で以下の手順を行う

$ cd debian-image
$ sudo docker login --username="niku" --email="my_email_address@example.com" --password="my_password"
$ sudo docker push niku/armhf-debian

こうしてできたのが niku/armhf-debian になる.ARM 環境の Docker で動かしてみたところ動作した. ( ARM 環境で,X86 環境版の niku/debian を動かしてみたら想定通り動かなかった )

説明

以下は詳しくない人間が数日間調べた結果なので正しくない可能性がある. もし間違っていたら直すので教えてほしい.

  1. X86 上で ARM 環境を動かすには QEMU というエミュレータを使うのが一般的である.X86 なのに ARM のふりをしてくれる.ただし,ふりをするのは大変なので,すごく遅くなる.
  2. Linux には chroot という,仮想環境に入るコマンドがある.コマンドで指定したディレクトリを / とみなして作業を行えるコマンドだ.
  3. Debian には debootstrap という,Debian 環境を指定のディレクトリに作るコマンドがある.

この 3 つを組み合わせると 「debootstrap で作った debian 環境の動作を QEMU ですりかえて ARM のふりをさせる. そこに chroot で入ると,まるで ARM で動作する Debian 環境のように動く」 ということをさせられる.

これを手で行っているのが 東京エリアDebian勉強会 debootstrapを有効活用してみよう の 15-16 ページ目あたりだ.

ArmHardFloatChroot - Debian Wiki によると,最近は qemu-debootstrap という,一連のことを自動でやってくれるコマンドができたようだ.

さて,docker リポジトリの contrib には mkimage.sh という,Docker の Image を自分で作成するためのコマンドが含まれている.

mkimage.sh の引数には debootstrap を指定できる. すると debootstrap で作成した Debian を Docker の Image にしてくれる.

mkimage.sh の中で debootstrap コマンドを実行するとき, これを qemu-debootstrap へとすり替えて,引数をうまく渡せば ARM 環境での Docker Image になる.

mkimage.sh から呼ばれる contrib/mkimage/debootstrap#L28-L29 を見ると答えが書いてある. DEBOOTSTRAP という環境変数が,実行するコマンド名になるので DEBOOTSTRAP=qemu-debootstrap ./mkimage.sh ... するとよい.

まとめ

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