From: Petter Reinholdtsen Date: Sun, 27 Oct 2013 15:53:09 +0000 (+0000) Subject: New post. X-Git-Url: https://pere.pagekite.me/gitweb/homepage.git/commitdiff_plain/9bf345ab6c3805bc718fc29dbfffeef8565e0cab?ds=sidebyside New post. --- diff --git a/blog/data/2013-10-27-vmdebootstrap-rpi.txt b/blog/data/2013-10-27-vmdebootstrap-rpi.txt new file mode 100644 index 0000000000..150502d8e0 --- /dev/null +++ b/blog/data/2013-10-27-vmdebootstrap-rpi.txt @@ -0,0 +1,106 @@ +Title: Teaching vmdebootstrap to create Raspberry Pi SD card images +Tags: english, freedombox, mesh network +Date: 2013-10-27 17:00 + +

The +vmdebootstrap +program is a a very nice system to create virtual machine images. It +create a image file, add a partition table, mount it and run +debootstrap in the mounted directory to create a Debian system on a +stick. Yesterday, I decided to try to teach it how to make images for +Raspberry Pi, as part +of a plan to simplify the build system for the FreedomBox project. +The FreedomBox project already uses vmdebootstrap for the virtualbox +images, but its home made multistrap based system for Dreamplug +images, and it is lacking support for Raspberry Pi.

+ +

Armed with the knowledge on how to build "foreign" (aka non-native +architecture) chroots for Raspberry Pi, I dived into the vmdebootstrap +code and adjusted it to be able to build armel images on my amd64 +Debian laptop. I ended up giving vmdebootstrap five new options, +allowing me to replicate the image creation process I use to make +Debian +Jessie based mesh node images for the Raspberry Pi. First, the +--foreign /path/to/binfm_handler option tell vmdebootstrap to +call debootstrap with --foreign and to copy the handler into the +generated chroot before running the second stage. This allow +vmdebootstrap to create armel images on a amd64 host. Next I added +two new options --bootsize size and --boottype +fstype to teach it to create a separate /boot/ partition with the +given file system type, allowing me to create an image with a vfat +partition for the /boot/ stuff. I also added a --variant +variant option to allow me to create smaller images without the +Debian base system packages installed. Finally, I added an option +--no-extlinux to tell vmdebootstrap to not install extlinux +as a boot loader. It is not needed on the Raspberry Pi and probably +most other non-x86 architectures. The changes were accepted by the +upstream author of vmdebootstrap yesterday and today, and am now +available from +the +upstream project page.

+ +

To use it to build a Raspberry Pi image using Debian Jessie, first +create a small script (the customize script) to add the non-free +binary blob needed to boot the Raspberry Pi and the APT source +list:

+ +

+#!/bin/sh
+set -e # Exit on first error
+rootdir="$1"
+cd "$rootdir"
+cat < etc/apt/sources.list
+deb http://http.debian.net/debian/ jessie main contrib non-free
+EOF
+# Install non-free binary blob needed to boot Raspberry Pi.  This
+# install a kernel somewhere too.
+wget https://raw.github.com/Hexxeh/rpi-update/master/rpi-update \
+    -O $rootdir/usr/bin/rpi-update
+chmod a+x $rootdir/usr/bin/rpi-update
+mkdir -p $rootdir/lib/modules
+touch $rootdir/boot/start.elf
+chroot $rootdir rpi-update
+

+ +

Next, fetch the latest vmdebootstrap script and call it like this +to build the image:

+ +
+sudo ./vmdebootstrap \
+    --variant minbase \
+    --arch armel \
+    --distribution jessie \
+    --mirror http://http.debian.net/debian \
+    --image test.img \
+    --size 600M \
+    --bootsize 64M \
+    --boottype vfat \
+    --log-level debug \
+    --verbose \
+    --no-kernel \
+    --no-extlinux \
+    --root-password raspberry \
+    --hostname raspberrypi \
+    --foreign /usr/bin/qemu-arm-static \
+    --customize `pwd`/customize \
+    --package netbase \
+    --package git-core \
+    --package binutils \
+    --package ca-certificates \
+    --package wget \
+    --package kmod
+

+ +

The list of packages being installed are the ones needed by +rpi-update to make the image bootable on the Raspberry Pi, with the +exception of netbase, which is needed by debootstrap to find +/etc/hosts with the minbase variant.

+ +

The build host need debootstrap, kpartx and qemu-user-static and +probably a few others installed. I have not checked the complete +build dependency list.

+ +

The resulting image will not use the hardware floating point unit +on the Raspberry PI, because the armel architecture in Debian is not +optimized for that use. So the images created will be a bit slower +than Raspbian based images.