chrooting in a 32-bit world from a 64-bit kernel+world

Olivier Smedts olivier at gid0.org
Tue Sep 30 21:35:42 UTC 2008


On Tue, Sep 30, 2008 at 10:38:10PM +0200, Mel wrote:
> On Tuesday 30 September 2008 21:57:22 Olivier Smedts wrote:
> > On Tue, Sep 30, 2008 at 09:28:39PM +0200, Mel wrote:
> > > On Tuesday 30 September 2008 20:44:02 Olivier Smedts wrote:
> > > > So far I've got a working FreeBSD (kernel+world) in a 512MB image I can
> > > > dump on a CompactFlash card :
> > > > # cd /usr/src
> > > > # make buildworld TARGET=i386
> > > > # make buildkernel TARGET=i386
> > > > # mount /dev/md0a /mnt
> > > > (md0 is a 512MB file backed image I bsdlabel'd and newfs'd before)
> > > > # make installworld TARGET=i386 DESTDIR=/mnt
> > > > # make distribution TARGET=i386 DESTDIR=/mnt
> > > > # make installkernel TARGET=i386 DESTDIR=/mnt
> > > >
> > > > The problem is that I can't chroot in this 32-bit world.
> > > > Say I want to install the sysutils/screen port in /mnt :
> > > >
> > > > # mkdir /mnt/usr/ports
> > > > # mount -t nullfs /usr/ports /mnt/usr/ports
> > > > # mount -t devfs devfs /mnt/dev
> > >
> > > It's a guess, but at this point:
> > > chroot /mnt /etc/rc.d/ldconfig start
> >
> > First, thank you for replying so fast !
> >
> > /etc/rc.d/ldconfig is a /bin/sh script, and I can't run /bin/sh in this
> > chroot. Same errors.
> >
> > > If that don't work:
> > > /sbin/ldconfig -32 -s -f /mnt/var/run/ld-elf.so.hints /mnt/lib \
> > > 	/mnt/usr/lib
> >
> > After that command, the shared libraries are found, but ld refers to /mnt :
> > # ldconfig -rf /mnt/var/run/ld-elf.so.hints
> > /mnt/var/run/ld-elf.so.hints:
> >         search directories: /mnt/lib:/mnt/usr/lib
> >         0:-lc.7 => /mnt/lib/libc.so.7
> >         1:-lcrypt.4 => /mnt/lib/libcrypt.so.4
> > [...]
> 
> Right.
> cd /mnt
> rmdir mnt
> ln -s . mnt
> 
> The old chroot symlink hack.
> 
> > And then when trying to chroot, still the same problem. I also can't launch
> > ldconfig in the jail :
> > # chroot /mnt/ /sbin/ldconfig -32 -s -f /var/run/ld-elf.so.hints /lib
> > /usr/lib ELF interpreter /libexec/ld-elf.so.1 not found
> > Abandon
> 
> If you have /rescue there, maybe chroot /mnt /rescue/ldconfig /lib /usr/lib 
> will help you. I'm pretty sure it's the missing hints causing this.
> 
> If all this fails, I'd try running /mnt as a jail.

Thanks for the advices. At least statically compiled binaries in /rescue work.
# chroot /mnt /rescue/sh 
# /rescue/ldconfig /lib /usr/lib
# /rescue/ldconfig -r
/var/run/ld-elf.so.hints:
        search directories: /lib:/usr/lib
        0:-lc.7 => /lib/libc.so.7
        1:-lcrypt.4 => /lib/libcrypt.so.4
[...]
# sh
ELF interpreter /libexec/ld-elf.so.1 not found
Abort trap
# 

No luck with the symlink hack or a jail :
Configuring jails:.
Starting jails:ELF interpreter /libexec/ld-elf.so.1 not found
 cannot start jail "fanless": 
Abort trap
.

I'll try to boot directly in the 32-bit world with my 64-bit kernel.
I think it should work. In that case, there's maybe something to configure
in the amd64 host's ldconfig or ld-elf.so.1 before chrooting in a 32-bit world.


> -- 
> Mel
> 
> Problem with today's modular software: they start with the modules
>     and never get to the software part.

-- 
Olivier Smedts                                              _
                          ASCII ribbon campaign            ( )
e-mail: olivier at gid0.org - against HTML email & vCards      X
www: http://www.gid0.org - against proprietary attachments / \

 "Il y a seulement 10 sortes de gens dans le monde :
 ceux qui comprennent le binaire,
 et ceux qui ne le comprennent pas."


More information about the freebsd-questions mailing list