-
-
Save uxp/f5f7d03579c9e15d838cc537874d4f86 to your computer and use it in GitHub Desktop.
Build a custom RPI image
This file contains hidden or 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]" | |
# This attempts to build an image without systemd | |
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" | |
hostname="rpi" | |
device=$1 | |
buildenv="/root/${hostname}" | |
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 [ "$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 | |
echo "dd if=/dev/zero of=$device bs=512 count=1" | |
fi | |
if ! [ -b $device ]; then | |
echo "ERROR: Device: $device Is not a block device" | |
exit 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 --include sysvinit-core --variant=minbase ${deb_release} ${rootfs} ${deb_local_mirror}" | |
debootstrap --no-check-gpg --foreign --arch=armhf --include sysvinit-core --variant=minbase $deb_release $rootfs $deb_local_mirror | |
echo "debootstrap ok" | |
echo "--- sed -i -e 's/systemd systemd-sysv //g'" | |
sed -i -e 's/systemd //g' $rootfs/debootstrap/required | |
sed -i -e 's/systemd-sysv //g' $rootfs/debootstrap/required | |
echo "removed systemd" | |
echo "EXTRA_OPTS=\"-L/usr/lib/arm-linux-gnueabihf\"" > /etc/qemu-binfmt.conf | |
cp /usr/bin/qemu-arm-static usr/bin/ | |
LANG=C chroot $rootfs /debootstrap/debootstrap --second-stage --verbose | |
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 "# Device Mountpoint FStype Options Dump Pass# | |
proc /proc proc defaults 0 0 | |
/dev/mmcblk0p1 /boot vfat defaults 0 0 | |
" > etc/fstab | |
echo "${hostname}" > 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