public
Last active

pbulk chroot config example

  • Download Gist
README.md
Markdown

Our pbulk diffs are available in our miscfix branch:

https://github.com/joyent/pkgsrc/commits/joyent/feature/miscfix/trunk/pkgtools/pbulk

After building that, add this to pbulk.conf:

chroot_create=/scripts/mksandbox
chroot_delete=/scripts/rmsandbox
chroot_dir=/chroot/pkgsrc-trunk
build_chroots=4
scan_chroots=8

The variables should be obvious, but in case not:

  • chroot_create is a script to create the chroot
  • chroot_delete uncreates it
  • chroot_dir is the base dir of the chroot
  • build_chroots is the number of chroots to create for pbulk-build
  • scan_chroots is the number of chroots to create for pbulk-scan

Then, when running pbulk, for each build_clients and scan_clients the chroot scripts will be executed, creating individual chroot_dir areas and running the build/scan inside them.

scan_chroots can probably be set quite high. build_chroots will need to be adjusted based on your resources and e.g. MAKE_JOBS setting.

mksandbox.sh
Shell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
#!/bin/sh
#
# Create a per-build chroot area.
#
 
set -e
 
PATH=/sbin:/usr/sbin:/bin
 
if [ $# -eq 1 ]; then
chrootdir="${1%%/}"; shift
else
echo "usage: $0 <chrootdir>" >&2
exit 2
fi
 
if [ -d "${chrootdir}" ]; then
echo "Chroot directory ${chrootdir} already exists. Not recreating"
exit 0
fi
 
mkdir -p ${chrootdir}
 
#
# Create loopback/nfs mounts. SNGL brands are special.
#
sysdirs="/dev /lib /sbin /usr"
sysprefix=""
case "${chrootdir}" in
*-sngl)
sysprefix="/system"
# Compat symlinks only necessary for starting pbulk.
mkdir -p ${chrootdir}/usr/bin
ln -s /system/usr/bin/bash ${chrootdir}/usr/bin/bash
mkdir -p ${chrootdir}/usr/xpg4/bin
ln -s /system/usr/xpg4/bin/id ${chrootdir}/usr/xpg4/bin/id
;;
esac
 
for dir in ${sysdirs}
do
mkdir -p ${chrootdir}${sysprefix}${dir}
mount -F lofs -r ${dir} ${chrootdir}${sysprefix}${dir}
# SNGL symlinks except for /usr
if [ -n "${sysprefix}" -a "${dir}" != "/usr" ]; then
ln -s ${sysprefix}${dir} ${chrootdir}${dir}
fi
done
 
# /dev/fd
mount -F fd fd ${chrootdir}${sysprefix}/dev/fd
 
# /opt/pbulk
mkdir -p ${chrootdir}/opt/pbulk
mount -F lofs -r /opt/pbulk ${chrootdir}/opt/pbulk
if [ -d /opt/pbulk/var/spool/postfix ]; then
mount -F lofs /opt/pbulk/var/spool/postfix ${chrootdir}/opt/pbulk/var/spool/postfix
fi
 
# /proc
mkdir -p ${chrootdir}/proc
mount -F proc /proc ${chrootdir}/proc
 
# /system/lxproc, if supported
if [ -d /system/lxproc/1 ]; then
mkdir -p ${chrootdir}/system/lxproc
mount -F lxproc lxproc ${chrootdir}/system/lxproc
fi
 
# /tmp
mkdir -p ${chrootdir}/tmp
mount -F tmpfs swap ${chrootdir}/tmp
chmod 1777 ${chrootdir}/tmp
 
# /shared
mkdir -p ${chrootdir}/shared
mount -F nfs $INSERT_NFS_SERVER ${chrootdir}/shared >/dev/null
 
#
# Create files/symlinks
#
 
# /bin
ln -s ./usr/bin ${chrootdir}/bin
 
# /var/mail (for mutt's configure script)
mkdir -p -m 1777 ${chrootdir}/var/mail
 
# /var/tmp
mkdir -p -m 1777 ${chrootdir}/var/tmp
 
# /etc
mkdir -p ${chrootdir}/etc
(cd /etc; gtar -cf - . 2>/dev/null) | (cd ${chrootdir}/etc; gtar -xf -)
cp /etc/TIMEZONE ${chrootdir}/etc/TIMEZONE
 
# /root/.ssh
mkdir -p ${chrootdir}/root
(cd /root; gtar -cf - .ssh 2>/dev/null) | (cd ${chrootdir}/root; gtar -xf -)
 
# /home/pbulk only if user exists
if id pbulk >/dev/null 2>&1; then
mkdir -p ${chrootdir}/home/pbulk
rsync -a /shared/pbulk/homedir/ ${chrootdir}/home/pbulk/
chown -R pbulk:pbulk ${chrootdir}/home/pbulk
chmod 0400 ${chrootdir}/home/pbulk/.ssh/*_rsa
fi
rmsandbox.sh
Shell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
#!/bin/sh
#
# Delete a chroot area.
#
 
PATH=/sbin:/usr/sbin:/bin
 
if [ $# -eq 1 ]; then
chrootdir="${1%%/}"; shift
else
echo "usage: $0 <chrootdir>" >&2
exit 2
fi
 
sysprefix=""
case "${chrootdir}" in
*-sngl)
sysprefix="/system"
;;
esac
 
if [ -d "${chrootdir}" ]; then
 
# Unmount nested mounts first
umount ${chrootdir}${sysprefix}/dev/fd
if [ -d ${chrootdir}/opt/pbulk/var/spool/postfix ]; then
umount ${chrootdir}/opt/pbulk/var/spool/postfix
fi
 
# System directories with optional prefix
for dir in /dev /lib /sbin /usr
do
umount ${chrootdir}${sysprefix}${dir}
rmdir ${chrootdir}${sysprefix}${dir}
done
 
# Remaining mounts
for dir in /opt/pbulk /proc /shared /tmp
do
umount ${chrootdir}${dir}
rmdir ${chrootdir}${dir}
done
 
if [ -d ${chrootdir}/system/lxproc/1 ]; then
umount ${chrootdir}/system/lxproc
rmdir ${chrootdir}/system/lxproc
rmdir ${chrootdir}/system
fi
 
# This must be done carefully to avoid deleting anything in writeable
# mounts, most notable /shared!
rm -rf ${chrootdir}/{bin,etc,home,opt,root,var}
 
# pkgsrc leftovers
rm -rf ${chrootdir}/{news,media}
 
# SNGL specifics
if [ -n "${sysprefix}" ]; then
rm -rf ${chrootdir}/{dev,lib,sbin,usr}
rmdir ${chrootdir}${sysprefix}
rm -f ${chrootdir}/.setup
fi
 
# chrootdir should now be empty, if not print what's left.
rmdir ${chrootdir}
if [ $? -ne 0 ]; then
echo "Leftovers:"
find ${chrootdir} -mount -fstype zfs
fi
 
fi

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.