Created
October 19, 2012 10:21
-
-
Save abulte/3917357 to your computer and use it in GitHub Desktop.
Build a custom RPI image
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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." |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Really useful! Thank you!