You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

157 lines
5.8 KiB
Plaintext

13 years ago
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
==============
12 years ago
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:
13 years ago
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.
13 years ago
Since support for QEMU_LD_PREFIX has now been added upstream it is now already
part of polystrap.sh
13 years ago
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
armel do:
13 years ago
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
13 years ago
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.
13 years ago
INNER WORKINGS
==============
13 years ago
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:
13 years ago
./polystrap.sh BOARD
13 years ago
13 years ago
BOARD is a directory that at least contains a multistrap.conf. The
13 years ago
multistrap.conf may contain variables from polystrap.sh.
13 years ago
In the normal case BOARD will contain some additional bits.
13 years ago
13 years ago
BOARD/config - A file that is sourced by ./polystrap.sh and
13 years ago
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.
13 years ago
BOARD/debconfseed.txt - as the name suggests
BOARD/hooks - A directory that contains files that are sourced by
13 years ago
polystrap after packages are installed.
13 years ago
BOARD/packages - Contains files with one debian package per line.
13 years ago
Grouping packages by that allows easier selection.
13 years ago
BOARD/root - Contains a rootfs tree that is copied to the target
13 years ago
directory after packages are unpacked by multistrap.
Reasonable examples of how those pieces look like can be found in the defaults
directory.
13 years ago
Everything from the BOARD/config file can be overwritten by commandline
13 years ago
options:
-s suite
-a arch
-d rootdir
-m mirror
12 years ago
-v verbose (set -x)
-f force (overwrite existing directories)
13 years ago
Additionally the following option allows to specify a list of packages that is
13 years ago
then used instead of the contents of the BOARD/packages directory:
13 years ago
-p packages
How the script works:
*) re-execute itself in fakeroot
*) source default/config
13 years ago
*) source BOARD/config
*) determine package selection by BOARD/packages or commandline argument
*) create multistrap.conf in /tmp from BOARD/multistrap.conf
13 years ago
*) run multistrap
13 years ago
*) copy contents of BOARD/root
13 years ago
*) copy qemu usermode binary
*) set debconf selections
*) run preinst scripts
*) configure packages
13 years ago
*) source BOARD/hooks
13 years ago
*) 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.