5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DockerとQEMUでRaspbianイメージをカスタマイズする

Last updated at Posted at 2019-11-25

TL;DR

dockerとqemuでRaspbianのイメージファイル.imgにchrootし、直接カスタマイズする

何がうれしい

  • 設定がコード化できる
  • 同じ環境をたくさん作れる
  • 完成物が小さい
  • PCだけで作業できる(シリアルケーブル不要)

作業用Dockerイメージ

FROM ubuntu:18.04
RUN apt update &&\
    apt install -y kpartx libarchive-tools wget qemu-user-static binfmt-support --no-install-recommends &&\
    apt clean &&\
    rm -rf /var/lib/apt/lists/*

適当に作業用ディレクトリを作成し、マウントする

$ mkdir workspace
$ docker build -t nullsnet/raspbian_customizer .
$ docker run --rm -v ${PWD}/workspace:/workspace -it nullsnet/raspbian_customizer bash

Ubuntu in Docker

ここからdockerのUbuntu内での作業

マウント

作業用ディレクトリに移動した後、Raspbianのイメージファイルをダウンロード&展開する

$ cd workspace
$ wget https://downloads.raspberrypi.org/raspbian_lite_latest -O-|bsdtar -xvf
$ image=$(ls -1tr *.img)
$ echo $image
2019-09-26-raspbian-buster-lite.img

kpartxでマッピングして、適当なディレクトリにマウントする
loop[0-9]p1bootパーティション、loop[0-9]p2rootfsパーティションになる

$ kpartx -av $image
$ add map loop8p1 (253:16): 0 524288 linear 7:8 8192
$ add map loop8p2 (253:17): 0 3858432 linear 7:8 532480
$ mkdir rootfs boot
$ mount $(ls /dev/mapper/loop*p1) boot
$ mount $(ls /dev/mapper/loop*p2) rootfs

この時点でbootrootfsの中身が触れるようになる
ファイルを改変するだけの設定で良いなら、ここまででよい

$ ls rootfs
bin  boot  dev  etc  home  lib  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
$ ls raspbian-boot/
COPYING.linux           bcm2708-rpi-cm.dtb      bcm2710-rpi-2-b.dtb       bcm2711-rpi-4-b.dtb  fixup.dat     fixup4x.dat   issue.txt     kernel8.img  start4cd.elf  start_db.elf
LICENCE.broadcom        bcm2708-rpi-zero-w.dtb  bcm2710-rpi-3-b-plus.dtb  bootcode.bin         fixup4.dat    fixup_cd.dat  kernel.img    overlays     start4db.elf  start_x.elf
bcm2708-rpi-b-plus.dtb  bcm2708-rpi-zero.dtb    bcm2710-rpi-3-b.dtb       cmdline.txt          fixup4cd.dat  fixup_db.dat  kernel7.img   start.elf    start4x.elf
bcm2708-rpi-b.dtb       bcm2709-rpi-2-b.dtb     bcm2710-rpi-cm3.dtb       config.txt           fixup4db.dat  fixup_x.dat   kernel7l.img  start4.elf   start_cd.elf

chroot

qemu-arm-staticをコピーする

$ cp /usr/bin/qemu-arm-static rootfs/usr/bin/

ld.so.preloadを書き換える
chroot時は$PLATFORMが定義されないため,これをやっておかないとバイナリ実行時にエラーが出てしまう

$ sed -i 's/${PLATFORM}/v7l/' rootfs/etc/ld.so.preload

rootfsにchrootしてbashを起動する

$ chroot rootfs /bin/bash

これであとは好きなように設定できる

raspi-config

raspi-configによる設定も可能

$ raspi-config nonint do_hostname raspi
$ raspi-config nonint do_wifi_country JP
$ raspi-config nonint do_change_timezone 'Asia/Tokyo'
$ raspi-config nonint do_change_locale ja_JP.UTF-8

apt

aptも当然可能

$ apt update
$ apt upgrade -y
$ apt install -y git

systemd

sshを有効にしておき、実機起動直後にすぐ接続できるようにもできる

$ systemctl enable ssh

docker

dockerのインストールだってできる

$ curl -sSL https://get.docker.com/ | sh
$ systemctl enable docker

Shell Script

設定をシェルスクリプトにしておき、chroot時に呼び出すこともできる

$ chroot rootfs /bin/bash -C YOUR_SCRIPT.sh

後片付け

chrootを抜けた後、qemu-arm-staticを削除してld.so.preloadを元に戻す

$ exit
$ rm rootfs/usr/bin/qemu-arm-static
$ sed -i 's/v7l/${PLATFORM}/' rootfs/etc/ld.so.preload

イメージファイルをアンマウントしてマッピングを削除する

$ umount boot rootfs
$ rmdir boot rootfs
$ kpartx -d $image
$ rm /dev/mapper/loop*

SDカードの作成

作成した*.imgファイルを、普通にdd等でSDカードへ書き込めばよい

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?