+#################### plain USB
+function build_usb() {
+ echo -n "* Creating USB image... "
+ local usb="$1" ; shift
+ local custom="$1"
+
+ rm -f "$usb"
+ mkfs.vfat -C "$usb" $(($(du -Lsk $ISOFS | awk '{ print $1; }') + $FREE_SPACE))
+
+ cat >${BUILDTMP}/mtools.conf<<EOF
+mtools_skip_check=1
+EOF
+ # environment variable for mtools
+ export MTOOLSRC="${BUILDTMP}/mtools.conf"
+
+ # Populate it
+ echo -n " populating USB image... "
+ mcopy -bsQ -i "$usb" "$ISOFS"/* ::/
+
+ # Use syslinux instead of isolinux to make the image bootable
+ tmp="${BUILDTMP}/syslinux.cfg"
+ cat >$tmp <<EOF
+${console_serial_line}
+DEFAULT kernel
+APPEND ramdisk_size=$ramdisk_size initrd=bootcd.img,overlay.img${custom:+,custom.img} root=/dev/ram0 rw ${KERNEL_ARGS}
+DISPLAY pl_version
+PROMPT 0
+TIMEOUT 40
+EOF
+ mdel -i "$usb" ::/isolinux.cfg 2>/dev/null || :
+ mcopy -i "$usb" "$tmp" ::/syslinux.cfg
+ rm -f "$tmp"
+ rm -f "${MTOOLSRC}"
+ unset MTOOLSRC
+
+ echo "making USB image bootable."
+ syslinux "$usb"
+}
+
+#################### utility to setup CRAMFS related support
+function prepare_cramfs() {
+ [ -n "$CRAMFS_PREPARED" ] && return 0
+ local custom=$1;
+
+ echo "* Setting up CRAMFS-based images"
+ local tmp="${BUILDTMP}/cramfs-tree"
+ mkdir -p "$tmp"
+ push_cleanup rm -rf $tmp
+ pushd $tmp
+ gzip -d -c $ISOFS/bootcd.img | cpio -diu
+ gzip -d -c $ISOFS/overlay.img | cpio -diu
+ [ -n "$custom" ] && \
+ gzip -d -c $ISOFS/custom.img | cpio -diu
+
+ # clean out unnecessary rpm lib
+ echo "* clearing var/lib/rpm/*"
+ rm -f var/lib/rpm/*
+
+ # bootcd requires this directory
+ mkdir -p mnt/confdevice
+
+ # relocate various directory to /tmp
+ rm -rf root
+ ln -fs /tmp/root root
+ ln -fs /sbin/init linuxrc
+ ln -fs /tmp/resolv.conf etc/resolv.conf
+ ln -fs /tmp/etc/mtab etc/mtab
+
+ # have pl_rsysinit copy over appropriate etc & var directories into /tmp/etc/
+ # make /tmp/etc
+ echo "* renaming dirs in ./etc"
+ pushd etc
+ for dir in `find * -type d -prune | grep -v rc.d`; do
+ mv ${dir} ${dir}_o
+ ln -fs /tmp/etc/${dir} ${dir}
+ done
+ popd
+
+ echo "* renaming dirs in ./var"
+ # rename all top-level directories and put in a symlink to /tmp/var
+ pushd var
+ for dir in `find * -type d -prune`; do
+ mv ${dir} ${dir}_o
+ ln -fs /tmp/var/${dir} ${dir}
+ done
+ popd
+
+ # overwrite fstab to mount / as cramfs and /tmp as tmpfs
+ echo "* Overwriting etc/fstab to use cramfs and tmpfs"
+ rm -f ./etc/fstab
+ cat >./etc/fstab <<EOF
+/dev/ram0 / cramfs ro 0 0
+none /dev/pts devpts gid=5,mode=620 0 0
+none /proc proc defaults 0 0
+none /sys sysfs defaults 0 0
+EOF
+
+ pushd dev
+ rm -f console
+ mknod console c 5 1
+ #for i in 0 1 2 3 4 5 6 7 8; do rm -f ram${i} ; done
+ #for i in 0 1 2 3 4 5 6 7 8; do mknod ram${i} b 1 ${i} ; done
+ #ln -fs ram1 ram
+ #ln -fs ram0 ramdisk
+ popd
+
+ # update etc/inittab to start with pl_rsysinit
+ for file in etc/inittab etc/event.d/rcS etc/init/rcS.conf; do
+ [ -f $file ] && sed -i 's,pl_sysinit,pl_rsysinit,' $file
+ done