The key point: make a symlink of jailed /libexec/ld-elf.so.1 to /libexec/ld-elf32.so.1. Of course, your kernel should have COMPAT_IA32 option compiled.
# cd /usr/src && make TARGET_ARCH=i386 TARGET=i386 buildworld
# mkdir -p /home/jails/i386 && make TARGET_ARCH=i386 TARGET=i386 DESTDIR=/home/jails/i386 installworld
# make TARGET_ARCH=i386 TARGET=i386 DESTDIR=/home/jails/i386 distribution
# ln -s /home/jails/i386/libexec/ld-elf.so.1 /home/jails/i386/libexec/ld-elf32.so.1
Then, edit rc.conf in jail to run sshd and start jails. Some utilities, like w/ps/top can not run because they retrieve data from FreeBSD kernel, and the kernel returns 64-bit structures, not 32-bit.
w
4:37AM up 12 days, 8:40, 1 user, load averages: 0.03, 0.18, 0.20
USER TTY FROM LOGIN@ IDLE WHAT
w: kinfo_proc size mismatch (expected 768, got 1088): No such file or directory
I am doing further test to make sure there aren’t any mines
that is a great idea. i’m still trying to get it to work though, my freebsd cd install had no i386 libraries by default
i think it should be
ln -s /libexec/ld-elf.so.1 /home/jails/i386/libexec/ld-elf32.so.1
Thanks for the tips! I’m running this under 7.1-RELEASE now. But a symlink in /libexec was unneccessary. What I had to do instead was mount the host’s /usr/lib32 over the jail’s /usr/lib. Also, added ARCH=i386 to the jail’s /etc/make.conf. Everything seems to build and run fine except for ps, top, pkill, killall, and oddly, “screen”. However, I got a working ps by copying the statically linked binary from the host’s /rescue/ps.
“cd /usr/src/usr.bin/killall && make NO_SHARED=true depend all && cp killall /usr/local/jail/host.jail.com/usr/bin/killall” on host amd64 environment produces static killall for jail. you can make these command with any utility of FreeBSDs’ world.