polystrap/README

150 lines
5.8 KiB
Text
Raw Normal View History

2011-07-06 15:30:52 +00:00
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
==============
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 and using the newly introduced
environment variable QEMU_LD_PREFIX like so:
QEMU_LD_PREFIX=/tmp/debian-sid/ ./polystrap.sh -d /tmp/debian-sid/ om-gta02
FAKEROOT/FAKECHROOT
===================
Additionally you will need to have copies of libfakechroot.so and
libfakeroot-sysv.so for your target architecture in /usr/lib/<arch-triplet>/.
Get the debian packages of fakeroot and fakechroot for your target architecture
and copy the shared libraries into /usr/lib/<arch-triplet>/. For example for
arm do:
wget http://ftp.debian.org/debian/pool/main/f/fakechroot/fakechroot_2.14-1_armel.deb
wget http://ftp.debian.org/debian/pool/main/f/fakeroot/fakeroot_1.14.5-1_armel.deb
sudo mkdir -p /usr/lib/arm-linux-gnueabi/
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
dpkg-deb --fsys-tarfile fakechroot_2.14-1_armel.deb | sudo tar -xf - --strip-components=4 -C /usr/lib/arm-linux-gnueabi/ ./usr/lib/fakechroot/libfakechroot.so
INNER WORKINGS
==============
2011-06-22 08:47:23 +00:00
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:
2011-07-17 11:48:06 +00:00
./polystrap.sh BOARD
2011-06-22 08:47:23 +00:00
2011-07-17 11:48:06 +00:00
BOARD is a directory that at least contains a multistrap.conf. The
2011-06-22 08:47:23 +00:00
multistrap.conf may contain variables from polystrap.sh.
2011-07-17 11:48:06 +00:00
In the normal case BOARD will contain some additional bits.
2011-06-22 08:47:23 +00:00
2011-07-17 11:48:06 +00:00
BOARD/config - A file that is sourced by ./polystrap.sh and
2011-06-22 08:47:23 +00:00
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.
2011-07-17 11:48:06 +00:00
BOARD/debconfseed.txt - as the name suggests
BOARD/hooks - A directory that contains files that are sourced by
2011-06-22 08:47:23 +00:00
polystrap after packages are installed.
2011-07-17 11:48:06 +00:00
BOARD/packages - Contains files with one debian package per line.
2011-06-22 08:47:23 +00:00
Grouping packages by that allows easier selection.
2011-07-17 11:48:06 +00:00
BOARD/root - Contains a rootfs tree that is copied to the target
2011-06-22 08:47:23 +00:00
directory after packages are unpacked by multistrap.
Reasonable examples of how those pieces look like can be found in the defaults
directory.
2011-07-17 11:48:06 +00:00
Everything from the BOARD/config file can be overwritten by commandline
2011-06-22 08:47:23 +00:00
options:
-s suite
-a arch
-d rootdir
-m mirror
Additionally the following option allows to specify a list of packages that is
2011-07-17 11:48:06 +00:00
then used instead of the contents of the BOARD/packages directory:
2011-06-22 08:47:23 +00:00
-p packages
How the script works:
*) re-execute itself in fakeroot
*) source default/config
2011-07-17 11:48:06 +00:00
*) source BOARD/config
*) determine package selection by BOARD/packages or commandline argument
*) create multistrap.conf in /tmp from BOARD/multistrap.conf
2011-06-22 08:47:23 +00:00
*) run multistrap
2011-07-17 11:48:06 +00:00
*) copy contents of BOARD/root
2011-06-22 08:47:23 +00:00
*) copy qemu usermode binary
*) set debconf selections
*) run preinst scripts
*) configure packages
2011-07-17 11:48:06 +00:00
*) source BOARD/hooks
2011-06-22 08:47:23 +00:00
*) 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.
Example config and multistrap.conf for usage of armhf is given in the default
directory as config.armhf and multistrap.conf.armhf. Some fakechroot bugs
(#611156) is unfortunately blocking this functionality right now.