Polystrap is a tool to create a foreign architecture rootfs without needing superuser privileges by using multistrap, fakeroot, fakechroot and qemu user mode emulation from the qemu-user package. QEMU USER MODE ============== qemu >= 1.0 is required for this to work out of the box. For older qemu versions, the (now outdated) instructions in the rest of this section: To make qemu user mode emulation work you need to install the packages qemu-user and binfmt-support. Until bug #632192 is fixed you will have to provide properly filled /etc/qemu-binfmt/$arch/ directories. $arch is a qemu arch (eg: arm for arm, armel and armhf). "properly filled" means, that you have to provide a root directory tree in that directory that fits the architecture you want to bootstrap debian for. There are a couple of ways to achieve that: 1. manually download and `dpkg -x` the required packages into /etc/qemu-binfmt/$arch/ 2. copy over a just extracted multistrap run for your target system into /etc/qemu-binfmt/$arch/ 3. run the following multistrap.conf, configured for your target system to create a root directory tree that you copy into /etc/qemu-binfmt/$arch/ -%<---------------------------- [General] arch= directory= cleanup=true unpack=true noauth=true aptsources=Debian bootstrap=Debian allowrecommends=false addimportant=false omitrequired=true [Debian] packages=libc6 libselinux1 libacl1 man-db libstdc++6 libfreetype6 libx11-6 libfontconfig1 source=http://cdn.debian.net/debian suite=sid omitdebsrc=true -%<---------------------------- You can also avoid all this trouble by either waiting for #632192 to be fixed or by applying the patch from there to qemu. Since support for QEMU_LD_PREFIX has now been added upstream it is now already part of polystrap.sh FAKEROOT/FAKECHROOT =================== Additionally you will need to have copies of libfakechroot.so and libfakeroot-sysv.so for your target architecture in /usr/lib//. Get the debian packages of fakeroot and fakechroot for your target architecture and copy the shared libraries into /usr/lib//. For example for armel do: sudo mkdir -p /usr/lib/arm-linux-gnueabi/ wget http://ftp.debian.org/debian/pool/main/f/fakeroot/fakeroot_1.18.1-1_armel.deb dpkg-deb --fsys-tarfile fakeroot_1.14.5-1_armel.deb | sudo tar -xf - --strip-components=4 -C /usr/lib/arm-linux-gnueabi/ ./usr/lib/libfakeroot/libfakeroot-sysv.so wget http://ftp.debian.org/debian/pool/main/f/fakechroot/libfakechroot_2.15-1_armel.deb dpkg -x libfakechroot_2.15-1_armel.deb / Alternatively, since libfakechroot is multiarch you can also do: apt-get install libfakechroot:armel if your system supports it instead of the last two lines. INNER WORKINGS ============== While I wanted to build without superuser privileges, multistrap would never offer mechanisms that would allow me to do so. Hence I wrote this script which wraps multistrap. Since I wanted to keep it as simple as possible, a fully functional polystrap will need nothing more than a multistrap.conf, a hooks directory and a rootfs tree skeleton. Stuff like packages directory, and config file are optional and can be replaced by editing multistrap.conf and passing commandline options. Without comments the scripts is currently around 120 lines and I have no intention to make it much more complex. Polystrap is invoked as such: ./polystrap.sh BOARD BOARD is a directory that at least contains a multistrap.conf. The multistrap.conf may contain variables from polystrap.sh. In the normal case BOARD will contain some additional bits. BOARD/config - A file that is sourced by ./polystrap.sh and contains variable declarations like: SUITE - stable, testing, unstable ARCH - armel, armhf, amd64, i386 ROOTDIR - where the rootfs is created MIRROR - debian mirror to use for packages The file is not strictly needed because the options can also be set by commandline arguments and the script will fall back to ./default/config. Correct settings for ARCH and ROOTDIR are necessary for proper operation, whereas other parameters are only used if your multistrap.conf references them. BOARD/debconfseed.txt - as the name suggests BOARD/hooks - A directory that contains files that are sourced by polystrap after packages are installed. BOARD/packages - Contains files with one debian package per line. Grouping packages by that allows easier selection. BOARD/root - Contains a rootfs tree that is copied to the target directory after packages are unpacked by multistrap. Reasonable examples of how those pieces look like can be found in the defaults directory. Everything from the BOARD/config file can be overwritten by commandline options: -s suite -a arch -d rootdir -m mirror -v verbose (set -x) -f force (overwrite existing directories) Additionally the following option allows to specify a list of packages that is then used instead of the contents of the BOARD/packages directory: -p packages How the script works: *) re-execute itself in fakeroot *) source default/config *) source BOARD/config *) determine package selection by BOARD/packages or commandline argument *) create multistrap.conf in /tmp from BOARD/multistrap.conf *) run multistrap *) copy contents of BOARD/root *) copy qemu usermode binary *) set debconf selections *) run preinst scripts *) configure packages *) source BOARD/hooks *) cleanup *) generate tarball When creating a directory for a new target one can either just copy the defaut directory or use the ./newtarget.sh script which will use symlinks where it makes sense, will not copy the whole package selection and will set hostname according to the target name.