CentOS 5 chroot with schroot
By gildor on Thursday, August 26 2010, 17:43 - Permalink
OCaml compiles native executables in static mode. It allows to have a minimal set of dependencies when delivering an executable. It has also disadvantages like the size of the executable and problems arising when considering libraries update -- but this is another topic. There is still one strong dependency that you should not forget when you want to deliver a product for most of the Linux distributions: dependency on the glibc version.
Trying to run OASIS compiled with Debian Lenny, on CentOS 5.5:
$ OASIS .../OASIS: /lib64/libc.so.6: version `GLIBC_2.7' not found (required by .../OASIS)
So when compiling for delivery, one should choose the oldest distribution he targets. In my case, I choose CentOS 5 which comes with glibc v2.5. I usually choose Debian stable at the moment of writing Debian Lenny. But for now, the Debian Lenny's glibc is newer (v2.7) than the one coming from the CentOS 5.5 stable release. CentOS is a Red Hat like Linux distribution.
I use a Debian Lenny amd64 host system and I decided to setup a chroot of CentOS 5 i386 and amd64. I also setup schroot to use my CentOS chroot.
CentOS 5 amd64 setup
First of all we use rinse, which can setup a RPM based distribution in a chroot. The version v1.3 shipped with Debian Lenny has some bugs: it doesn't install nss and other mandatory packages. So I downloaded v1.7 directly from Debian Sid. There is no dependencies problems and the package is arch:all, so it is straightforward to install:
$ wget http://ftp.de.debian.org/debian/pool/main/r/rinse/rinse_1.7-1_all.deb # Replace ftp.de.debian.org by your preferred Debian mirror $ dpkg -i rinse_1.7-1_all.deb
Then I create the chroot directory and launch rinse:
$ mkdir /srv/chroot/centos5-amd64 $ rinse --arch amd64 --distribution centos-5 --directory /srv/chroot/centos5-amd64 # N.B. you must use --arch, the default is i386
Once installation is complete, you can add an entry for this distribution in /etc/schroot/schroot.conf:
[centos5-amd64] description=Centos 5 (amd64) location=/srv/chroot/centos5-amd64 priority=3 users=XXX groups= root-groups=root type=directory run-setup-scripts=true run-exec-scripts=true
Replace XXX by your login.
If you try to login directly, you will get warnings:
$ schroot -c centos5-i386 I : [chroot centos5-i386-a952de23-7f4b-4bae-a9b9-752ecee4a185] Exécution de l'interpréteur de commandes initial : « /bin/bash » -bash: /dev/null: Permission denied -bash: /dev/null: Permission denied -bash: /dev/null: Permission denied -bash: /dev/null: Permission denied -bash: /dev/null: Permission denied
This is a bit misleading because the real problem is that nothing is created in /dev/. CentOS delegates creating char/block devices to udev. You have two solutions to solve this issue:
- login and call MAKEDEV to create missing devices:
$ MAKEDEV random $ MAKEDEV console $ MAKEDEV zero $ MAKEDEV null $ MAKEDEV stdout $ MAKEDEV stdin $ MAKEDEV stderr
- use an already setup Debian chroot to copy the missing devices:
$ rsync -av /srv/chroot/lenny-amd64/dev/* /srv/chroot/centos5-amd64/dev/
That's it, you now have a functional chrooted CentOS 5 environment:
$ schroot -c centos5-amd64 cat /etc/redhat-release I : [chroot centos5-amd64-b9bae264-285b-4d17-a046-13386736cecd] Exécution de la commande : « cat /etc/redhat-release » CentOS release 5.5 (Final)
CentOS 5 i386 setup
To setup an i386 environment, we follow almost the same scheme, except we need to fix a bug in rinse v1.7: we need to call linux32 before executing chroot. The problem is that the first stage installation of rinse install an i386/686 environment but as soon as you call chroot yum install ..., it will guess that the system is amd64 and will install missing packages. See the Debian bug report and the example patch attached to correct this behavior.
WARNING: this patch is just an example, you can apply it for creating CentOS i386 chroot on Lenny amd64 host but you should remove the patch as soon as the installation is complete.
$ mkdir /srv/chroot/centos5-i386/ $ rinse --arch i386 --distribution centos-5 --directory /srv/chroot/centos5-i386 # With /usr/lib/rinse/centos-5/post-install.sh patched $ rsync -av /srv/chroot/lenny-i386/dev/* /srv/chroot/centos5-i386/dev/
Add this distribution to /etc/schroot/schroot.conf:
[centos5-i386] description=Centos 5 (i386) location=/srv/chroot/centos5-i386 priority=3 users=XXX groups= root-groups=root type=directory run-setup-scripts=true run-exec-scripts=true personality=linux32
You now have a schroot of CentOS 5 i386:
$ schroot -c centos5-i386 cat /etc/redhat-release I : [chroot centos5-i386-9acafa91-9862-4488-aaef-4ab2a482771e] Exécution de la commande : « cat /etc/redhat-release » CentOS release 5.5 (Final)
Happy schroot hacking!
Comments
One other option for /dev would be to bind-mount your system's instance, possibly recursively (depending on whether you need /dev/pts or /dev/shm as well).
Aaron: Indeed bind mounting is also a solution. However, this is not the default way used by debootstrap/schroot and it will also give more than necessary access to some hardware.
I have just copied the way deboostrap works.
Thanks for the suggestion.
Regarding your rinse bug w/ patch. You don't need to patch rinse to work around the issue. You can just run rinse with linux32 prefixed.
$ linux32 rinse --arch i386 ...