⬢ DragonFlyBSD Kernel Audit
DF-5473 / build_image.sh
← back to finding ↓ download raw
#!/bin/sh
# build_image.sh — assemble the minimal UFS root image the vkernel boots.
# Runs ON THE GUEST as root. Builds /root/vkrig/vkroot.img with just enough
# world (sh, sysctl, reboot + libs + vktrigger) for the DF-5472/DF-5473 rig.
set -e
RIG=/root/vkrig
IMG=$RIG/vkroot.img
MNT=/mnt/vkroot

mkdir -p $RIG $MNT
dd if=/dev/zero of=$IMG bs=1m count=200 status=none

vnconfig -u vn1 2>/dev/null || true
vnconfig -c -S labels vn1 $IMG
disklabel -w vn1s0 auto
# auto label has no partitions — replace with an 'a' spanning the slice
disklabel vn1s0 > $RIG/proto
grep -v "^#" $RIG/proto | grep -v "^$" > $RIG/proto2
printf "a: * 0 4.2BSD\n" >> $RIG/proto2
disklabel -R vn1s0 $RIG/proto2
# poke devfs so the partition node appears
i=0
while [ ! -c /dev/vn1s0a ] && [ $i -lt 20 ]; do
    dd if=/dev/vn1s0 of=/dev/null bs=512 count=1 2>/dev/null
    sleep 0.5
    i=$((i+1))
done
[ -c /dev/vn1s0a ] || { echo "vn1s0a did not appear"; exit 1; }
newfs /dev/vn1s0a
mount /dev/vn1s0a $MNT

mkdir -p $MNT/bin $MNT/sbin $MNT/lib $MNT/libexec $MNT/root $MNT/etc $MNT/dev $MNT/tmp

copy_bin() {
    local b="$1"
    cp "$b" "$MNT$b"
    # copy the shared-library closure
    ldd "$b" | awk '{for(i=1;i<=NF;i++) if ($i ~ /^\//) print $i}' | sort -u | while read -r lib; do
        case "$lib" in
            /lib/*)    d=/lib ;;
            /usr/lib/*) d=/usr/lib ;;
            *)         continue ;;
        esac
        mkdir -p "$MNT$(dirname "$lib")"
        cp -n "$lib" "$MNT$lib" 2>/dev/null || cp "$lib" "$MNT$lib"
    done
}

for b in /bin/sh /bin/echo /bin/ls /bin/cat /bin/sync \
         /sbin/init /sbin/sysctl /sbin/reboot /sbin/halt \
         /sbin/mount /sbin/umount; do
    copy_bin "$b"
done
cp /libexec/ld-elf.so.2 $MNT/libexec/ld-elf.so.2 2>/dev/null || \
    cp /usr/libexec/ld-elf.so.2 $MNT/libexec/ld-elf.so.2

# vktrigger (built earlier from vktrigger.c into $RIG)
cc -O -o $MNT/root/vktrigger $RIG/vktrigger.c

# minimal /etc so sh/sysctl don't complain
cp /etc/pwd.db $MNT/etc/ 2>/dev/null || true
cp /etc/group $MNT/etc/ 2>/dev/null || true
echo nameserver 127.0.0.1 > $MNT/etc/resolv.conf

df -h $MNT
umount $MNT
vnconfig -u vn1
echo "IMAGE READY: $IMG"