Download Ubuntu Hardy Heron iso (or whatever version you want).
Download {{:howtos:unetbootin-linux-216.zip|unetbootin-linux-216.zip}} (find the newest version here: http://unetbootin.sourceforge.net/
Format your usb pen with fat32.
Make LiveUSB with unetbootin (just unpack unetbootin-linux-216.zip and execute unetbootin as root) or use the usb-builder tool within Ubuntu.
===== Version 1 =====
sudo mount -o loop -t squashfs /media/disk/casper/filesystem.squashfs /home/tdd/No-rsync-stuff/usb
sudo mkdir /tmp/ubuntu_usb_image
sudo cp -aR /home/tdd/No-rsync-stuff/usb/* /tmp/ubuntu_usb_image/
sudo mount -t proc none /tmp/ubuntu_usb_image/proc
sudo mount -o bind /dev /tmp/ubuntu_usb_image/dev
sudo chroot /tmp/ubuntu_usb_image /bin/bash
Inside chroot edit /etc/apt/sources.list to enable the repositories you need and insert a dns server into /etc/resolv.conf. If you don't do this you can't download anything through apt-get.
To choose a different keyboard layout:
apt-get install console-data
dpkg-reconfigure console-data
Make you apt-get install's and configurations.....
Start rebuilding the LiveUSB:
cd /tmp
sudo umount /tmp/ubuntu_usb_image/proc
sudo mksquashfs ubuntu_usb_image ubuntu_usb.squashfs -no-sparse
sudo cp ubuntu_usb.squashfs /media/disk/casper/filesystem.squashfs
===== Version 2 =====
This is more or less copied from https://wiki.ubuntu.com/MobileTeam/Mobile/HowTo/ImageModification. The difference is that my source is a build and ready usb stick and not an image file.
I also found it necessary to give tmpfs an upper size of 2GB, otherwise it ran out of space during updates.
===== The manual way =====
* Preparation:
mkdir /tmp/squashfs
mkdir /tmp/tmpfs
mkdir /tmp/mergemount
* Mount the filesystems:
sudo modprobe unionfs
sudo mount -o loop -t squashfs /casper/filesystem.squashfs /tmp/squashfs
sudo mount -o size=2G -t tmpfs tmpfs /tmp/tmpfs
sudo mount -t unionfs -o dirs=/tmp/tmpfs:/tmp/squashfs=ro none /tmp/mergemount
* Make sure essential filesystems are mounted inside the image:
sudo chroot /tmp/mergemount mount -t proc proc /proc
sudo chroot /tmp/mergemount mount -t sysfs sysfs /sys
sudo chroot /tmp/mergemount mkdir -p /dev/pts
sudo chroot /tmp/mergemount mount -t devpts devpts -o noexec,nosuid,gid=5,mode=620 /dev/pts
Make sure packagelists are up to date and install the software you like:
LANG=C sudo chroot /tmp/mergemount apt-get update
LANG=C sudo chroot /tmp/mergemount apt-get install
* Clean up:
sudo chroot /tmp/mergemount apt-get clean
sudo chroot /tmp/mergemount umount /proc
sudo chroot /tmp/mergemount umount /sys
sudo chroot /tmp/mergemount umount /dev/pts
sudo chroot /tmp/mergemount rm -rf /dev/pts
* Build a new squashfs with your changes:
sudo mksquashfs /tmp/mergemount /tmp/filesystem.squashfs
* Clean up the temporary mountpoints:
sudo umount /tmp/mergemount
sudo umount /tmp/tmpfs
sudo umount /tmp/squashfs
* Copy the new squashfs in place:
sudo cp /tmp/filesystem.squashfs /image/casper/
* Clean up the rest:
sudo rm -rf /tmp/tmpfs /tmp/squashfs /tmp/mergemount /tmp/filesystem.squashfs
Have fun with your changed imagefile ....
===== The same as shellscript =====
The script below uses the same setup as above and spawns a rootshell inside the squashfs, you can then run "apt-get update" and install your package or make other changes, if you exit the shell with Ctrl-D or the 'exit' command it will offer you to re-roll the squashfs for you.
#!/bin/sh
if [ -z $1 ];then
echo 'I need a path to the usb mount point as first argument'
exit 0
fi
SQUASHFS=/home/tdd/tmp/squashfs
TMPFS=/home/tdd/tmp/tmpfs
MERGEMOUNT=/home/tdd/tmp/mergemount
SQUASHFSFILE=/home/tdd/tmp
mkdir $SQUASHFSFILE
mkdir $SQUASHFS
mkdir $TMPFS
mkdir $MERGEMOUNT
sudo modprobe unionfs
sudo mount -o loop -t squashfs $1/casper/filesystem.squashfs $SQUASHFS
sudo mount -o size=3G -t tmpfs tmpfs $TMPFS
sudo mount -t unionfs -o dirs=$TMPFS:$SQUASHFS=ro none $MERGEMOUNT
sudo chroot $MERGEMOUNT mount -t proc proc /proc
sudo chroot $MERGEMOUNT mount -t sysfs sysfs /sys
sudo chroot $MERGEMOUNT mkdir -p /dev/pts
sudo chroot $MERGEMOUNT mount -t devpts devpts -o noexec,nosuid,gid=5,mode=620 /dev/pts
sudo cp /etc/resolv.conf $MERGEMOUNT/etc/
LANG=C sudo chroot $MERGEMOUNT
sudo chroot $MERGEMOUNT rm /etc/resolv.conf
sudo chroot $MERGEMOUNT umount /proc
sudo chroot $MERGEMOUNT umount /sys
sudo chroot $MERGEMOUNT umount /dev/pts
sudo chroot $MERGEMOUNT rm -rf /dev/pts
echo -n 'do you want to build a squashfs with the changes ? (y/n) '
read yesno
if [ -z $yesno ];then
yesno='n'
fi
if [ $yesno = 'y' ];then
sudo mksquashfs $MERGEMOUNT $SQUASHFSFILE/filesystem.squashfs -wildcards -e proc/*
fi
sudo umount -t unionfs $MERGEMOUNT
sudo umount -t tmpfs $TMPFS
sudo umount -t squashfs $SQUASHFS
if [ $yesno = 'y' ];then
sudo cp $SQUASHFSFILE/filesystem.squashfs $1/casper/
fi
echo -n 'do you want to cleanup in /tmp ? (y/n) '
read yesno
if [ -z $yesno ];then
yesno='n'
fi
if [ $yesno = 'y' ];then
sudo rm -rf $TMPFS $SQUASHFS $MERGEMOUNT $SQUASHFSFILE/filesystem.squashfs
fi
===== Important Notes =====
For unknown reasons the three mounted filesystems (tmpfs, squashfs and proc) are always lock by something, thus the cleanup phase will not work. I can only get it of by rebooting the computer (fairly annoying!). Because of the locks I was forced to include an exclude statement not digging into /proc.