LoginSignup
3
3

More than 3 years have passed since last update.

Raspberry Pi OSをx86_64 上のdockerで動かしたい

Posted at

これはなに?

いつもの如くの何番煎じシリーズです。

ちょっとラズパイを使って色々やってみたいことが増えてきたので、ハードをあまり持っていない自分として簡単に試せる環境を作りたいと思って調べたことの備忘録です。

以下の記事のほぼ丸パクリレベルになります。
https://qiita.com/autch/items/c8c9cdc7b8e5821e81a4
http://blog.guiraudet.com/raspberrypi/2016/03/03/raspbian-image-for-docker.html

変えたのは rasbianじゃないのをraspiosに変えたのと、qemu-arm-static を現時点で最新(v5.2.0-2)を入れたくらいです。

スクリプトは以下にあります。
https://github.com/shun/build-raspios-docker-image

docker imageは以下で取得できます。
タグ長げぇ。。。

$ docker pull kudoshunsuke/raspios-lite-for-x86_64:2021-03-04-raspios-buster-armhf-lite

コンテナ起動する前におまじないを実施する必要があるようです。
これをやらないと次のようなエラーが出力されます。本家 に書いてあります。
どうも、docker が multi-architecture 機能がサポートが有効化されていないと出力されるようです。

standard_init_linux.go:211: exec user process caused "exec format error"

ですので、multi-architecture 機能を有効化するため、おまじないを実行します。

$ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

実行するスクリプト

以下は実際のスクリプトですが参考までに載せておきます。まぁ、パクリですけど。。。

#!/bin/bash

# target sources
SRC=https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2021-03-25/2021-03-04-raspios-buster-armhf-lite.zip
QEMUARM=https://github.com/multiarch/qemu-user-static/releases/download/v5.2.0-2/qemu-arm-static

set -e
mkdir -p raspios-tmp
cd raspios-tmp

filename=`basename $SRC`
if [ ! -e $filename ]; then
    echo "Download image..."
    wget --trust-server-names $SRC
fi

DISK_IMG=$(ls *.zip | sed 's/.zip$//')
if [ ! -e $DISK_IMG.img ]; then
    unzip *.zip
fi

OFFSET=$(fdisk -lu $DISK_IMG.img | sed -n "s/\(^[^ ]*img2\)\s*\([0-9]*\)\s*\([0-9]*\)\s*\([0-9]*\).*/\2/p")

mkdir rootfs
sudo  mount -o loop,offset=$(($OFFSET*512)) $DISK_IMG.img rootfs
# Disable preloaded shared library to get everything including networking to work on x86
sudo mv rootfs/etc/ld.so.preload rootfs/etc/ld.so.preload.bak

filename=`basename $QEMUARM`
if [ ! -e $filename ]; then
    echo "Download image..."
    wget $QEMUARM
fi
chmod 755 ./qemu-arm-static
sudo cp ./qemu-arm-static rootfs/usr/bin

# Create docker images
cd rootfs
sudo tar -c . | sudo docker import - kudoshunsuke/raspios-lite-for-x86_64:$DISK_IMG
cd ..

# Clean-up
sudo umount rootfs
rmdir rootfs
rm $DISK_IMG.img
sudo docker images | grep raspios

echo "Test the image with:"
echo "docker run -ti --rm kudoshunsuke/raspios-lite-for-x86_64:$DISK_IMG /bin/bash -c \'uname -a\'"
if docker run -ti --rm kudoshunsuke/raspios-lite-for-x86_64:$DISK_IMG /bin/bash -c 'uname -a' | grep armv7l; then echo OK; else echo FAIL; fi

これで、ラズパイ用のビルドとか残念な気持ちにならずにやれるのは 最&高 !

3
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
3
3