[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: fakechroot + qemu user emulation (it works now)

Just as a followup on the question i posted back in january...

On Tue, Jan 18, 2011 at 10:29:56PM +0100, Marcus Osdoba wrote
>Am 09.01.2011 15:26, schrieb Johannes Schauer:
>> hi,
>> my goal is to build an armel rootfs without the need of super user
>> privileges.
>Hi, I have the same requirement and want to avoid superuser rights for
>launching multistrap and chroot'ing into generated rootfs.
>If you somehow found a solution for this, I am also interested in.

I solved it! :D

If you just put qemu-arm-static into the chroot and then execute:

$ fakeroot fakechroot chroot $ROOTDIR /bin/true

it would return: "Unable to load interpreter". But it will work whithout
fakeroot/fakechroot using the normal chroot(8). The solution is to help it
finding the shared armel libraries correctly.

With qemu-arm-static the solution is to append -L. For example this would
not work:

$ qemu-arm-static $ROOTDIR/bin/true
Unable to load interpreter

but this will work:

$ qemu-arm-static -L $ROOTDIR $ROOTDIR/bin/true

Since it is troublesome to pass over the ELF interpreter prefix when letting
qemu-arm-static being run automatically by the kernel's binfmt support the
solution is to put the shared libraries (armel in my case) into the default
directory for qemu-arm-static. The man page says /usr/gnemul/qemu-arm but
this is wrong and indeed is /etc/qemu-binfmt/arm/. It is sufficient to only
put the $ROOTDIR/lib directory there. Indeed it is sufficient to only put armel
versions of ld-2.11.2.so, ld-linux.so.3, libc-2.11.2.so and libc.so.6 into
/etc/qemu-binfmt/arm/lib/. Every armel binary on the system can now be
executed right away just as if it were a native one. This is damn cool!

$ $ROOTDIR/bin/true <= this works just like that!! :D

The next errors will be:

$ fakeroot fakechroot chroot $ROOTDIR /bin/true
ERROR: ld.so: object 'libfakechroot.so' from LD_PRELOAD cannot be preloaded: ignored.
ERROR: ld.so: object 'libfakeroot-sysv.so' from LD_PRELOAD cannot be preloaded: ignored.

To fix those, just put armel versions of libfakechroot.so and libfakeroot-sysv.so
into /usr/lib/arm-linux-gnueabi/.

It's done!! you can now create a full foreign debian rootfs without having to
use any root priviliges!

I have a small script that i use for this - it is not complete but does the most basic
things and outputs a tarball with the proper permissions:


The whole thing is of course run within a fakeroot call.
One interesting bit in this script is to temporary replace /sbin/ldconfig since
fakechroot can't handle it. It's switched back to the original one in the end.

I put the armel binary into the correct place by using these commands:

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
wget http://ftp.debian.org/debian/pool/main/e/eglibc/libc6_2.11.2-11_armel.deb
sudo mkdir -p /etc/qemu-binfmt/arm/
sudo mkdir -p /usr/lib/arm-linux-gnueabi/
sudo dpkg -x libc6_2.11.2-11_armel.deb /etc/qemu-binfmt/arm/
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
rm fakechroot_2.14-1_armel.deb fakeroot_1.14.5-1_armel.deb libc6_2.11.2-11_armel.deb

I hope this is useful for somebody.

have a nice day,

Reply to: