Skip to content

Instantly share code, notes, and snippets.

@abulte
Created October 19, 2012 10:21
Show Gist options
  • Star 13 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save abulte/3917357 to your computer and use it in GitHub Desktop.
Save abulte/3917357 to your computer and use it in GitHub Desktop.
Build a custom RPI image
#!/bin/bash
# Based on work by Klaus M Pfeiffer at http://blog.kmp.or.at/2012/05/build-your-own-raspberry-pi-image/
# you need to do: "sudo apt-get install binfmt-support qemu qemu-user-static debootstrap kpartx lvm2 dosfstools"
# run with "sudo bootstrap.sh /dev/sd[x]"
echo "Use like: sudo bootstrap.sh /dev/sd[x]"
#deb_mirror="http://ftp.debian.org/debian"
#deb_local_mirror="http://ftp.debian.org/debian"
deb_mirror="http://archive.raspbian.org/raspbian"
deb_local_mirror="http://archive.raspbian.org/raspbian"
bootsize="64M"
deb_release="wheezy"
device=$1
buildenv="/root/rpi"
rootfs="${buildenv}/rootfs"
bootfs="${rootfs}/boot"
mydate=`date +%Y%m%d`
if [ "$deb_local_mirror" == "" ]; then
deb_local_mirror=$deb_mirror
fi
image=""
if [ $EUID -ne 0 ]; then
echo "ERROR: This tool must be run as Root"
exit 1
fi
if ! [ -b $device ]; then
echo "ERROR: Device: $device Is not a block device"
exit 1
fi
if [ "$device" == "" ]; then
echo "WARNING: No block device given, creating image instead."
mkdir -p $buildenv
image="${buildenv}/rpi_basic_${deb_release}_${mydate}.img"
dd if=/dev/zero of=$image bs=1MB count=1000
device=`losetup -f --show $image`
echo "Image $image Created and mounted as $device"
else
dd if=/dev/zero of=$device bs=512 count=1
fi
fdisk $device << EOF
n
p
1
+$bootsize
t
c
n
p
2
w
EOF
if [ "$image" != "" ]; then
losetup -d $device
device=`kpartx -va $image | sed -E 's/.*(loop[0-9])p.*/\1/g' | head -1`
echo "--- kpartx device ${device}"
device="/dev/mapper/${device}"
bootp=${device}p1
rootp=${device}p2
echo "--- rootp ${rootp}"
echo "--- bootp ${bootp}"
else
if ! [ -b ${device}1 ]; then
bootp=${device}p1
rootp=${device}p2
if ! [ -b ${bootp} ]; then
echo "ERROR: Can't find boot partition, neither as ${device}1, nor as ${device}p1. Exiting."
exit 1
fi
else
bootp=${device}1
rootp=${device}2
fi
fi
mkfs.vfat $bootp
mkfs.ext4 $rootp
mkdir -p $rootfs
mount $rootp $rootfs
cd $rootfs
echo "--- debootstrap --no-check-gpg --foreign --arch=armhf --variant=minbase ${deb_release} ${rootfs} ${deb_local_mirror}"
debootstrap --no-check-gpg --foreign --arch=armhf --variant=minbase $deb_release $rootfs $deb_local_mirror
echo "debootstrap ok"
cp /usr/bin/qemu-arm-static usr/bin/
LANG=C chroot $rootfs /debootstrap/debootstrap --second-stage
mount $bootp $bootfs
echo "deb $deb_local_mirror $deb_release main contrib non-free
" > etc/apt/sources.list
echo "dwc_otg.lpm_enable=0 console=ttyUSB0,115200 kgdboc=ttyUSB0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait" > boot/cmdline.txt
echo "proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 0
" > etc/fstab
echo "raspberrypi" > etc/hostname
echo "auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
" > etc/network/interfaces
echo "vchiq
snd_bcm2835
" >> etc/modules
echo "console-common console-data/keymap/policy select Select keymap from full list
console-common console-data/keymap/full select de-latin1-nodeadkeys
" > debconf.set
echo "#!/bin/bash
debconf-set-selections /debconf.set
rm -f /debconf.set
apt-get update
apt-get -y install git-core binutils ca-certificates
wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update
chmod +x /usr/bin/rpi-update
mkdir -p /lib/modules/3.1.9+
touch /boot/start.elf
rpi-update
apt-get -y install locales console-common ntp ntpdate openssh-server less vim screen
echo \"root:raspberry\" | chpasswd
sed -i -e 's/KERNEL\!=\"eth\*|/KERNEL\!=\"/' /lib/udev/rules.d/75-persistent-net-generator.rules
rm -f /etc/udev/rules.d/70-persistent-net.rules
rm -f third-stage
" > third-stage
chmod +x third-stage
LANG=C chroot $rootfs /third-stage
echo "deb $deb_mirror $deb_release main contrib non-free
" > etc/apt/sources.list
echo "#!/bin/bash
apt-get clean
rm -f cleanup
" > cleanup
chmod +x cleanup
LANG=C chroot $rootfs /cleanup
cd
umount $bootp
umount $rootp
if [ "$image" != "" ]; then
kpartx -d $image
echo "Created Image: $image"
fi
echo "Done."
@torralbaalla
Copy link

Really useful! Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment