about summary refs log tree commit diff
path: root/mklive.sh.in
diff options
context:
space:
mode:
authorJuan RP <xtraeme@gmail.com>2012-11-22 14:35:37 +0100
committerJuan RP <xtraeme@gmail.com>2012-11-22 14:35:37 +0100
commit8783414cc73347ea78e6c2442ecc8f4678d40b84 (patch)
tree3e468f49fbb40139a09dc6402cd37a01c26c93d0 /mklive.sh.in
parent5159224c3da5c7b2faa06c4b1ae6aeeed62b2e29 (diff)
downloadhrmpf-8783414cc73347ea78e6c2442ecc8f4678d40b84.tar.gz
hrmpf-8783414cc73347ea78e6c2442ecc8f4678d40b84.tar.xz
hrmpf-8783414cc73347ea78e6c2442ecc8f4678d40b84.zip
Update for 0.18; new options -l (generates a local repo) and -r to set rootdir.
-l "pkg pkg1 ..." If set generates a local repository (/packages)
		  in the live image with the package list.
-r rootdir	  To specify an alternative rootdir to build the image.
Diffstat (limited to 'mklive.sh.in')
-rw-r--r--mklive.sh.in478
1 files changed, 246 insertions, 232 deletions
diff --git a/mklive.sh.in b/mklive.sh.in
index 801567d..a1d4c3f 100644
--- a/mklive.sh.in
+++ b/mklive.sh.in
@@ -23,38 +23,23 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #-
-trap "echo; error_out $?" INT QUIT
-
-info_msg() {
-	printf "\033[1m$@\n\033[m"
-}
 
-mount_pseudofs() {
-	local fs
+# vim: set ts=4 sw=4 et:
 
-	for fs in sys proc dev; do
-		if [ ! -d "$ROOTFS/$fs" ]; then
-			mkdir -p "$ROOTFS/$fs"
-		fi
-		mount --bind /$fs "$ROOTFS/$fs" || error_out $?
-	done
-}
+trap "echo; error_out $?" INT QUIT
 
-umount_pseudofs() {
-	local fs
+CHROOT_CMD="linux-user-chroot --unshare-ipc --unshare-pid --unshare-net \
+	--mount-bind /dev /dev --mount-bind /sys /sys --mount-proc /proc"
 
-	for fs in sys proc dev; do
-		umount -f "$ROOTFS/$fs" >/dev/null 2>&1
-	done
+info_msg() {
+	printf "\033[1m$@\n\033[m"
 }
 
 error_out() {
-	umount_pseudofs
-
 	info_msg "There was an error! cleaning up $BUILDDIR, exiting..."
 
 	[ -d "$BUILDDIR" ] && rm -rf "$BUILDDIR"
-	[ -f "$LOGFILE" ] && rm -f "$LOGFILE"
+	#[ -f "$LOGFILE" ] && rm -f "$LOGFILE"
 
 	exit 1
 }
@@ -62,15 +47,14 @@ error_out() {
 write_etc_motd() {
 	cat >> "$ROOTFS/etc/motd" <<_EOF
 ###############################################################################
-  Autogenerated by void-mklive @@MKLIVE_VERSION@@
+  Autogenerated by void-mklive "@@MKLIVE_VERSION@@"
 -------------------------------------------------------------------------------
 
 Welcome to the Void Linux Live system, you have been autologged in.
 This user has full sudo(8) permissions without any password, be careful
 executing commands through sudo(8).
 
-To play with package management use the xbps-bin(8) and xbps-repo(8)
-utilities. Please visit:
+To play with package management use the xbps-* utilities. Please visit:
 
 	http://code.google.com/p/xbps/
 
@@ -94,8 +78,9 @@ write_conf_file() {
 # Default configuration file for vmklive-@VERSION@.
 #
 # List of packages to be installed into the live image.
-# At least 'base-system' or 'base-system-live' is required.
-PACKAGE_LIST="base-system-live"
+# By default the 'base-system-live' pkg is always installed because
+# it is required to generate a working image.
+#PACKAGE_LIST="foo blah"
 
 # Syslinux splash image.
 SPLASH_IMAGE=/usr/share/void-artwork/splash.png
@@ -104,11 +89,14 @@ SPLASH_IMAGE=/usr/share/void-artwork/splash.png
 KEYMAP=us
 
 # Default locale to use.
-LOCALE=en_US
+LOCALE=en_US.UTF-8
 
 # Path to XBPS utilities.
-#XBPS_BIN_CMD=xbps-bin
-#XBPS_REPO_CMD=xbps-repo
+#XBPS_INSTALL_CMD=xbps-install
+#XBPS_QUERY_CMD=xbps-query
+#XBPS_RECONFIGURE_CMD=xbps-reconfigure
+#XBPS_REMOVE_CMD=xbps-remove
+#XBPS_RINDEX_CMD=xbps-rindex
 #XBPS_UHELPER_CMD=xbps-uhelper
 
 # XBPS cache directory to install packages from.
@@ -126,39 +114,194 @@ Usage: $(basename $0) [options]
 Options:
  -C file		Path to configuration file (defaults to ~/.mklive.conf)
  -c (gzip|bzip2|xz) 	Compression type for the squashfs/initramfs image.
- -k version		Kernel version to use.
+ -l "pkgname ..."	Generate a local repository in the image with these packages.
+ 			Packages must be delimited by blanks.
+ -r rootdir		Use this directory to generate the image (if unset,
+ 			current working directory will be used).
  -o outfile		Output file name for the ISO image.
  -s splash		Splash image file for isolinux.
 _EOF
 	exit 1
 }
 
+install_packages() {
+    for f in ${PACKAGE_LIST}; do
+	    info_msg "  $f"
+    done
+    # Check that all pkgs are reachable.
+    ${XBPS_INSTALL_CMD} ${XBPS_ARGS} -n xbps-git \
+        ${PACKAGE_LIST} >>$LOGFILE 2>&1
+    if [ $? -ne 0 ]; then
+	    info_msg "Missing required binary packages, exiting..."
+	    error_out
+    fi
+    ${XBPS_INSTALL_CMD} ${XBPS_ARGS} xbps-git ${PACKAGE_LIST} >>$LOGFILE 2>&1
+    [ $? -ne 0 ] && error_out $?
+    ${XBPS_INSTALL_CMD} ${XBPS_ARGS} -u >>$LOGFILE 2>&1
+    [ $? -ne 0 ] && error_out $?
+    ${XBPS_REMOVE_CMD} ${XBPS_ARGS} -o >>$LOGFILE 2>&1
+    [ $? -ne 0 ] && error_out $?
+    ${XBPS_QUERY_CMD} -r "$ROOTFS" -l > \
+	    "${OUTPUT_FILE%.iso}"-package-list.txt || error_out
+
+    # Reconfigure all pkgs again via linux-user-chroot.
+    $CHROOT_CMD $ROOTFS xbps-reconfigure -fa >>$LOGFILE 2>&1
+}
+
+generate_initramfs() {
+    # Install required pkgs in a temporary rootdir to create
+    # the initramfs and to copy required files.
+    $XBPS_INSTALL_CMD -r $ROOTFS/kernel_temp -y \
+	    base-system void-mklive >>$LOGFILE 2>&1
+
+    # Install some required utilities from util-linux.
+    install -Dm755 $ROOTFS/kernel_temp/usr/sbin/agetty \
+	    "$ROOTFS/usr/sbin/agetty" || error_out $?
+    install -Dm755 $ROOTFS/kernel_temp/usr/bin/lsblk \
+	    "$ROOTFS/usr/bin/lsblk" || error_out $?
+
+    $CHROOT_CMD $ROOTFS/kernel_temp dracut --no-hostonly \
+	    --add "dmsquash-live vmklive" --${COMPRESSTYPE} \
+	    "/boot/initrd.lz" 2>/dev/null || error_out
+    mv $ROOTFS/kernel_temp/boot/initrd.lz $BOOT_DIR
+    # We rely on pam now, so let's install the host login config.
+    install -Dm644 $ROOTFS/kernel_temp/etc/pam.d/login \
+        "$ROOTFS/etc/pam.d/login" || error_out $?
+}
+
+copy_kernel_and_modules() {
+    cp -a $ROOTFS/kernel_temp/boot/vmlinuz-${KERNELVERSION} \
+        $BOOT_DIR/vmlinuz
+    mkdir -p $ROOTFS/lib/modules
+    cp -a $ROOTFS/kernel_temp/lib/modules/${KERNELVERSION} \
+        $ROOTFS/lib/modules
+    # remove temporary rootfs.
+    rm -rf $ROOTFS/kernel_temp
+}
+
+generate_local_repository() {
+    mkdir -p $ROOTFS/packages
+    pkgs=$($XBPS_INSTALL_CMD -s -r /tmp/blah -n ${LOCALREPO_PKGLIST})
+    set -- ${pkgs}
+    while [ $# -ne 0 ]; do
+	    pkgn=$1; action=$2; ver=$3; repo=$4; binpkg=$5; arch=$6
+	    shift 6
+	    bpkg=$repo/$arch/$binpkg
+	    cp -f $bpkg $ROOTFS/packages
+    done
+    $XBPS_RINDEX_CMD -a $ROOTFS/packages/*.xbps 2>&1 >>$LOGFILE
+    rm -f $ROOTFS/packages/index-files.plist
+}
+
+generate_isolinux_boot() {
+    cp -f $SYSLINUX_DATADIR/isolinux.bin "$ISOLINUX_DIR" || error_out $?
+    cp -f $SYSLINUX_DATADIR/vesamenu.c32 "$ISOLINUX_DIR" || error_out $?
+    cp -f $MKLIVE_DATADIR/isolinux.cfg.in \
+	    "$ISOLINUX_DIR"/isolinux.cfg || error_out $?
+
+    if [ -f "$SPLASH_IMAGE" ]; then
+	    cp -f $SPLASH_IMAGE "$ISOLINUX_DIR" || error_out $?
+    fi
+    sed -i  -e "s|@@SPLASHIMAGE@@|$(basename $SPLASH_IMAGE)|" \
+	    -e "s|@@KERNVER@@|${KERNELVERSION}|" \
+	    -e "s|@@KEYMAP@@|${KEYMAP}|" \
+	    -e "s|@@ARCH@@|$(uname -m)|" \
+	    -e "s|@@LOCALE@@|${LOCALE}|" $ISOLINUX_DIR/isolinux.cfg
+}
+
+generate_grub_efi_boot() {
+    cp -f $MKLIVE_DATADIR/grub.cfg $GRUB_DIR || error_out $?
+    cp -f $MKLIVE_DATADIR/grub_void.cfg.in \
+        $GRUB_DIR/grub_void.cfg || error_out $?
+    sed -i  -e "s|@@SPLASHIMAGE@@|$(basename $SPLASH_IMAGE)|" \
+	    -e "s|@@KERNVER@@|${KERNELVERSION}|" \
+	    -e "s|@@KEYMAP@@|${KEYMAP}|" \
+	    -e "s|@@ARCH@@|$(uname -m)|" \
+	    -e "s|@@LOCALE@@|${LOCALE}|" $GRUB_DIR/grub_void.cfg
+    mkdir -p $GRUB_DIR/fonts $GRUB_DIR/locale || error_out $?
+    cp -f $GRUB_DATADIR/unicode.pf2 $GRUB_DIR/fonts || error_out $?
+    cp -f /boot/grub/locale/* $GRUB_DIR/locale || error_out $?
+
+    # Create EFI vfat image.
+    dd if=/dev/zero of=$GRUB_DIR/efiboot.img bs=1024 count=4096 \
+	    >>$LOGFILE 2>&1 || error_out $?
+    mkfs.vfat -F12 -S 512 -n "grub_uefi" "$GRUB_DIR/efiboot.img" \
+	    >>$LOGFILE 2>&1 || error_out $?
+
+    GRUB_EFI_TMPDIR="$(mktemp --tmpdir=$HOME -d)"
+    LOOP_DEVICE="$(losetup --show --find ${GRUB_DIR}/efiboot.img)"
+    mount -o rw,flush -t vfat "${LOOP_DEVICE}" "${GRUB_EFI_TMPDIR}" \
+	    >>$LOGFILE 2>&1 || error_out $?
+
+    mkdir -p "${GRUB_EFI_TMPDIR}/EFI/boot/" || error_out $?
+    cd "$BUILDDIR" || error_out $?
+    grub-mkstandalone --directory="/usr/lib/grub/x86_64-efi" \
+        --format="x86_64-efi" \
+	    --compression="xz" --output="${GRUB_EFI_TMPDIR}/EFI/boot/bootx64.efi" \
+		"boot/grub/grub.cfg" >>$LOGFILE 2>&1 || error_out $?
+    umount "$GRUB_EFI_TMPDIR" || error_out $?
+    losetup --detach "${LOOP_DEVICE}" || error_out $?
+    rm -rf $GRUB_EFI_TMPDIR || error_out $?
+}
+
+generate_squashfs() {
+    # Find out required size for the rootfs and create an ext3fs image off it.
+    ROOTFS_SIZE=$(du -sk "$ROOTFS"|awk '{print $1}')
+    mkdir -p "$BUILDDIR/tmp/LiveOS"
+    dd if=/dev/zero of="$BUILDDIR/tmp/LiveOS/ext3fs.img" \
+	    bs="$((${ROOTFS_SIZE}+($ROOTFS_SIZE/6)))K" count=1 \
+        >>$LOGFILE 2>&1 || error_out $?
+    mkdir -p "$BUILDDIR/tmp-rootfs"
+    mkfs.ext3 -F -m1 "$BUILDDIR/tmp/LiveOS/ext3fs.img" \
+        >>$LOGFILE 2>&1 || error_out $?
+    mount -o loop "$BUILDDIR/tmp/LiveOS/ext3fs.img" \
+        "$BUILDDIR/tmp-rootfs" || error_out $?
+    cd $BUILDDIR
+    cp -a rootfs/* tmp-rootfs/
+    umount -f "$BUILDDIR/tmp-rootfs"
+    mkdir -p "$BUILDDIR/LiveOS"
+
+    mksquashfs "$BUILDDIR/tmp" "$BUILDDIR/LiveOS/squashfs.img" \
+	    -comp ${COMPRESSTYPE} >>$LOGFILE 2>&1 || error_out
+    chmod 444 "$BUILDDIR/LiveOS/squashfs.img" || error_out $?
+    # Remove rootfs and temporary dirs, we don't need them anymore.
+    rm -rf "$ROOTFS" "$BUILDDIR/tmp-rootfs" "$BUILDDIR/tmp" || error_out $?
+}
+
+generate_iso_image() {
+    xorriso -as mkisofs \
+	    -iso-level 3 -rock -joliet \
+	    -max-iso9660-filenames -omit-period \
+	    -omit-version-number -relaxed-filenames -allow-lowercase \
+	    -volid "VOID_LIVE" \
+	    -eltorito-boot boot/isolinux/isolinux.bin \
+	    -eltorito-catalog boot/isolinux/boot.cat \
+	    -no-emul-boot -boot-load-size 4 -boot-info-table \
+	    -eltorito-alt-boot --efi-boot boot/grub/efiboot.img -no-emul-boot \
+	    -isohybrid-mbr /usr/share/syslinux/isohdpfx.bin \
+	    -output "$OUTPUT_FILE" "$BUILDDIR" >>$LOGFILE 2>&1 || error_out $?
+}
+
 #
 # main()
 #
-while getopts "C:c:k:o:s:h" opt; do
+while getopts "C:c:l:o:r:s:h" opt; do
 	case $opt in
 	C) CONFIG_FILE="$OPTARG";;
 	c) COMPRESSTYPE="$OPTARG";;
-	k) KERNELVERSION="$OPTARG";;
+	l) LOCALREPO_PKGLIST="$OPTARG";;
 	o) OUTPUT_FILE="$OPTARG";;
+	r) ROOTDIR="$OPTARG";;
 	s) SPLASH_IMAGE="$OPTARG";;
 	h) usage;;
 	esac
 done
 shift $(($OPTIND - 1))
 
-if [ -z "$KERNELVERSION" ]; then
-	KERNELVERSION="$(uname -r)"
-fi
-
 # Set defaults
 if [ -z "$CONFIG_FILE" ]; then
 	CONFIG_FILE="$HOME/.mklive.conf"
 fi
-if [ -z "$OUTPUT_FILE" ]; then
-	OUTPUT_FILE="$HOME/void-live-$(uname -m)-${KERNELVERSION}-$(date +%Y%m%d).iso"
-fi
 LOGFILE="$(mktemp -t vmklive-XXXXXXXXXX.log)"
 
 if [ -z "$SYSLINUX_DATADIR" ]; then
@@ -173,15 +316,24 @@ fi
 if [ -z "$SPLASH_IMAGE" ]; then
 	SPLASH_IMAGE=/usr/share/void-artwork/splash.png
 fi
-if [ -z "$XBPS_REPO_CMD" ]; then
-	XBPS_REPO_CMD=xbps-repo
+if [ -z "$XBPS_INSTALL_CMD" ]; then
+	XBPS_INSTALL_CMD=xbps-install
+fi
+if [ -z "$XBPS_REMOVE_CMD" ]; then
+	XBPS_REMOVE_CMD=xbps-remove
 fi
-if [ -z "$XBPS_BIN_CMD" ]; then
-	XBPS_BIN_CMD=xbps-bin
+if [ -z "$XBPS_QUERY_CMD" ]; then
+	XBPS_QUERY_CMD=xbps-query
+fi
+if [ -z "$XBPS_RINDEX_CMD" ]; then
+	XBPS_RINDEX_CMD=xbps-rindex
 fi
 if [ -z "$XBPS_UHELPER_CMD" ]; then
 	XBPS_UHELPER_CMD=xbps-uhelper
 fi
+if [ -z "$XBPS_RECONFIGURE_CMD" ]; then
+	XBPS_RECONFIGURE_CMD=xbps-reconfigure
+fi
 if [ -z "$COMPRESSTYPE" ]; then
 	COMPRESSTYPE=xz
 fi
@@ -197,7 +349,7 @@ fi
 if [ -z "$PACKAGE_LIST" ]; then
 	PACKAGE_LIST="base-system-live"
 else
-	PACKAGE_LIST="$PACKAGE_LIST"
+	PACKAGE_LIST="base-system-live $PACKAGE_LIST"
 fi
 if [ ! -f $SYSLINUX_DATADIR/isolinux.bin ]; then
 	echo "Missing required isolinux files in $SYSLINUX_DATADIR, exiting..."
@@ -211,7 +363,11 @@ if [ "$(id -u)" -ne 0 ]; then
 fi
 
 ISO_VOLUME="VOID_LIVE"
-BUILDDIR=$(mktemp --tmpdir=$HOME -d) || exit 1
+if [ -n "$ROOTDIR" ]; then
+	BUILDDIR=$(mktemp --tmpdir="$ROOTDIR" -d) || exit 1
+else
+	BUILDDIR=$(mktemp --tmpdir="$(pwd -P)" -d) || exit 1a
+fi
 BUILDDIR=$(readlink -f $BUILDDIR)
 ROOTFS="$BUILDDIR/rootfs"
 BOOT_DIR="$BUILDDIR/boot"
@@ -219,235 +375,93 @@ ISOLINUX_DIR="$BOOT_DIR/isolinux"
 GRUB_DIR="$BOOT_DIR/grub"
 ISOLINUX_CFG="$ISOLINUX_DIR/isolinux.cfg"
 
+mkdir -p $ISOLINUX_DIR $GRUB_DIR
 #
 # Check there are repos registered before anything.
 #
-${XBPS_REPO_CMD} list >/dev/null 2>&1
+${XBPS_QUERY_CMD} -L >/dev/null 2>&1
 if [ $? -ne 0 ]; then
 	echo "No repositories available, exiting..."
 	error_out
 fi
 
-#
-# Mount pseudofs in the target rootfs.
-#
-mount_pseudofs
-mkdir -p "$ROOTFS/tmp" "$ISOLINUX_DIR" "$GRUB_DIR"
-
 XBPS_ARGS="-r $ROOTFS -y"
 if [ -n "$REPOSITORY_CACHE" ]; then
 	XBPS_ARGS="$XBPS_ARGS -c $REPOSITORY_CACHE"
 fi
-XBPS_VERSION=$($XBPS_BIN_CMD -V|awk '{print $2}')
+XBPS_VERSION=$($XBPS_QUERY_CMD -V|awk '{print $2}')
 case $XBPS_VERSION in
-	# XBPS >= 0.17
-	[0-9].[1-9][7-9]*) XBPS_017=1;;
+	# XBPS >= 0.18
+	[0-9].[1-9][8-9]*) ;;
+	*) echo "Your xbps utilities are too old ($XBPS_VERSION), 0.18 is required." && exit 1;;
 esac
 
-info_msg "Redirecting stdout/stderr to $LOGFILE ..."
-info_msg "[1/10] Installing packages into the rootfs..."
-for f in ${PACKAGE_LIST}; do
-	info_msg "  $f"
-done
-# Check that all pkgs are reachable.
-${XBPS_BIN_CMD} ${XBPS_ARGS} -n install ${PACKAGE_LIST} >>$LOGFILE 2>&1
-if [ $? -ne 0 ]; then
-	info_msg "Missing required binary packages, exiting..."
-	error_out
+KERNELVERSION=$($XBPS_QUERY_CMD -R --property version kernel)
+
+if [ -z "$OUTPUT_FILE" ]; then
+	OUTPUT_FILE="$HOME/void-live-$(uname -m)-${KERNELVERSION}-$(date +%Y%m%d).iso"
 fi
-${XBPS_BIN_CMD} ${XBPS_ARGS} install ${PACKAGE_LIST} \
-	2>&1|cat >> $LOGFILE || error_out
-${XBPS_BIN_CMD} ${XBPS_ARGS} autoupdate \
-	2>&1|cat >> $LOGFILE || error_out
-${XBPS_BIN_CMD} ${XBPS_ARGS} autoremove \
-	2>&1|cat >> $LOGFILE || error_out
 
-${XBPS_BIN_CMD} -r "$ROOTFS" list > \
-	"${OUTPUT_FILE%.iso}"-package-list.txt || error_out
+info_msg "Redirecting stdout/stderr to $LOGFILE ..."
+#
+# Install live system and specified packages.
+#
+info_msg "[1/9] Installing packages into the rootfs..."
+install_packages
 
 #
 # Prepare /etc/motd.
 #
-info_msg "[2/10] Creating /etc/motd..."
 mkdir -p "$ROOTFS"/etc
 write_etc_motd
 
 #
-# Create the initramfs with XZ compression.
+# Generate the initramfs.
 #
-info_msg "[3/10] Creating initramfs image ($COMPRESSTYPE)..."
-dracut --no-hostonly --add "dmsquash-live vmklive" --${COMPRESSTYPE} \
-	"${BOOT_DIR}/initrd.lz" ${KERNELVERSION} 2>/dev/null || error_out
+info_msg "[2/9] Generating initramfs image ($COMPRESSTYPE)..."
+generate_initramfs
 
 #
-# Copy the linux image to the target directory.
+# Copy linux kernel and modules to rootfs.
 #
-info_msg "[4/10] Copying kernel image/modules..."
-cp -f /boot/vmlinuz-${KERNELVERSION} "${BOOT_DIR}/vmlinuz" || error_out $?
-mkdir -p "$ROOTFS/lib/modules"
-cp -a /lib/modules/${KERNELVERSION} "$ROOTFS/lib/modules" || error_out $?
-
-# Generate a sane xbps.conf for the rootfs.
-rm -f $ROOTFS/etc/xbps/xbps.conf
-echo "# xbps.conf generated by void-mklive-@@MKLIVE_VERSION@@" \
-	> $ROOTFS/etc/xbps/xbps.conf
-echo "TransactionFrequencyFlush = 0" \
-	>> $ROOTFS/etc/xbps/xbps.conf
-echo "virtual-package rsyslog { targets = syslog-daemon-0 }" \
-	>> $ROOTFS/etc/xbps/xbps.conf
-echo "virtual-package dcron { targets = cron-daemon-0 }" \
-	>> $ROOTFS/etc/xbps/xbps.conf
-echo "virtual-package kmod { targets = module-init-tools-3.17 }" \
-	>> $ROOTFS/etc/xbps/xbps.conf
-_devel=$($XBPS_UHELPER_CMD -r $ROOTFS version xbps-devel)
-if [ -n "${_devel}" ]; then
-	echo "virtual-package xbps-devel { targets = xbps-9999 }" \
-		>> $ROOTFS/etc/xbps/xbps.conf
-fi
-
-# Generate a conf for local repositories.
-cat > $ROOTFS/etc/xbps/local-repos.conf <<_EOF
-repositories = {
-	# XBPS >= 0.16
-	/packages,
-}
-_EOF
-# Generate a conf for remote repositories.
-cat > $ROOTFS/etc/xbps/network-repos.conf <<_EOF
-repositories = {
-	# XBPS >= 0.16
-	http://xbps.hosting-unlimited.org/binpkgs,
-	http://xbps.goodluckwith.us/binpkgs,
-	http://xbps.nopcode.org/repos/current,
-}
-_EOF
-chmod 644 $ROOTFS/etc/xbps/*.conf || error_out $?
-
-# Create local repos for base-system and grub-x86_64-efi packages required by
-# the void-installer pkg.
-pkgs=$($XBPS_BIN_CMD -r /tmp/blah -n install base-system grub-x86_64-efi)
-set -- ${pkgs}
-while [ $# -ne 0 ]; do
-	pkgn=$1; action=$2; ver=$3; repo=$4; binpkg=$5; arch=$6
-	shift 6
-	mkdir -p $ROOTFS/packages/$arch
-	bpkg=$repo/$arch/$binpkg
-	cp -f $bpkg $ROOTFS/packages/$arch
-	ln -sfr $ROOTFS/packages/$arch/$binpkg $ROOTFS/packages/$binpkg
-done
-if [ -n "$XBPS_017" ]; then
-	$XBPS_REPO_CMD index-add $ROOTFS/packages/*.xbps 2>&1 >>$LOGFILE
-	rm -f $ROOTFS/packages/index-files.plist
-else
-	${XBPS_REPO_CMD} genindex $ROOTFS/packages 2>&1 >>$LOGFILE
-	rm -f $ROOTFS/packages/index-files.plist
-fi
+info_msg "[3/9] Copying kernel image/modules from temporary rootfs..."
+copy_kernel_and_modules
 
-# Install some required utilities from util-linux.
-_lsblk=$(which lsblk)
-install -Dm755 ${_lsblk} "$ROOTFS/usr/bin/lsblk" || error_out $?
-
-# We rely on pam now, so let's install the host login config.
-install -Dm644 /etc/pam.d/login "$ROOTFS/etc/pam.d/login" || error_out $?
 #
-# The pseudofs aren't needed anymore in target rootfs.
+# Generate the package local repository for void-installer.
 #
-umount_pseudofs
-
+if [ -z "$LOCALREPO_PKGLIST" ]; then
+	_skip="(disabled)"
+fi
+info_msg "[4/9] Generating package local repository ${_skip}..."
+if [ -n "$LOCALREPO_PKGLIST" ]; then
+	generate_local_repository
+fi
 #
-# Prepare isolinux files in the target rootfs.
+# Generate the isolinux boot.
 #
-info_msg "[5/10] Preparing isolinux support for BIOS..."
-cp -f $SYSLINUX_DATADIR/isolinux.bin "$ISOLINUX_DIR" || error_out $?
-cp -f $SYSLINUX_DATADIR/vesamenu.c32 "$ISOLINUX_DIR" || error_out $?
-cp -f $MKLIVE_DATADIR/isolinux.cfg.in \
-	"$ISOLINUX_DIR"/isolinux.cfg || error_out $?
-
-if [ -f "$SPLASH_IMAGE" ]; then
-	cp -f $SPLASH_IMAGE "$ISOLINUX_DIR" || error_out $?
-fi
-sed -i  -e "s|@@SPLASHIMAGE@@|$(basename $SPLASH_IMAGE)|" \
-	-e "s|@@KERNVER@@|${KERNELVERSION}|" \
-	-e "s|@@KEYMAP@@|${KEYMAP}|" \
-	-e "s|@@ARCH@@|$(uname -m)|" \
-	-e "s|@@LOCALE@@|${LOCALE}|" $ISOLINUX_DIR/isolinux.cfg
+info_msg "[5/9] Generating isolinux support for PC-BIOS systems..."
+generate_isolinux_boot
 
 #
-# Prepare grub files for EFI.
+# Generate the GRUB EFI boot.
 #
-info_msg "[6/10] Preparing GRUB support for EFI..."
-cp -f $MKLIVE_DATADIR/grub.cfg $GRUB_DIR || error_out $?
-cp -f $MKLIVE_DATADIR/grub_void.cfg.in $GRUB_DIR/grub_void.cfg || error_out $?
-sed -i  -e "s|@@SPLASHIMAGE@@|$(basename $SPLASH_IMAGE)|" \
-	-e "s|@@KERNVER@@|${KERNELVERSION}|" \
-	-e "s|@@KEYMAP@@|${KEYMAP}|" \
-	-e "s|@@ARCH@@|$(uname -m)|" \
-	-e "s|@@LOCALE@@|${LOCALE}|" $GRUB_DIR/grub_void.cfg
-mkdir -p $GRUB_DIR/fonts $GRUB_DIR/locale || error_out $?
-cp -f $GRUB_DATADIR/unicode.pf2 $GRUB_DIR/fonts || error_out $?
-cp -f /boot/grub/locale/* $GRUB_DIR/locale || error_out $?
-
-# Create EFI vfat image.
-dd if=/dev/zero of=$GRUB_DIR/efiboot.img bs=1024 count=4096 \
-	2>&1 | cat >>$LOGFILE || error_out $?
-mkfs.vfat -F12 -S 512 -n "grub_uefi" "$GRUB_DIR/efiboot.img" \
-	2>&1 | cat >>$LOGFILE || error_out $?
-
-GRUB_EFI_TMPDIR="$(mktemp --tmpdir=$HOME -d)"
-LOOP_DEVICE="$(losetup --show --find ${GRUB_DIR}/efiboot.img)"
-mount -o rw,flush -t vfat "${LOOP_DEVICE}" "${GRUB_EFI_TMPDIR}" \
-	2>&1 | cat >>$LOGFILE || error_out $?
-
-mkdir -p "${GRUB_EFI_TMPDIR}/EFI/boot/" || error_out $?
-cd "$BUILDDIR" || error_out $?
-grub-mkstandalone --directory="/usr/lib/grub/x86_64-efi" --format="x86_64-efi" \
-	        --compression="xz" --output="${GRUB_EFI_TMPDIR}/EFI/boot/bootx64.efi" \
-		        "boot/grub/grub.cfg" 2>&1 | cat >>$LOGFILE || error_out $?
-umount "$GRUB_EFI_TMPDIR" || error_out $?
-losetup --detach "${LOOP_DEVICE}" || error_out $?
-rm -rf $GRUB_EFI_TMPDIR || error_out $?
+info_msg "[6/9] Generating GRUB support for EFI systems..."
+generate_grub_efi_boot
 
 #
-# Prepare the squashed rootfs image.
+# Generate the squashfs image from rootfs.
 #
-info_msg "[7/10] Creating squashfs image ($COMPRESSTYPE) from rootfs..."
-# Find out required size for the rootfs and create an ext3fs image off it.
-ROOTFS_SIZE=$(du -sk "$ROOTFS"|awk '{print $1}')
-mkdir -p "$BUILDDIR/tmp/LiveOS"
-dd if=/dev/zero of="$BUILDDIR/tmp/LiveOS/ext3fs.img" \
-	bs="$((${ROOTFS_SIZE}+($ROOTFS_SIZE/6)))K" count=1 2>&1 | cat >>$LOGFILE || error_out $?
-mkdir -p "$BUILDDIR/tmp-rootfs"
-mkfs.ext3 -F -m1 "$BUILDDIR/tmp/LiveOS/ext3fs.img" 2>&1 | cat >>$LOGFILE || error_out $?
-mount -o loop "$BUILDDIR/tmp/LiveOS/ext3fs.img" "$BUILDDIR/tmp-rootfs" || error_out $?
-cd $BUILDDIR
-cp -a rootfs/* tmp-rootfs/
-umount -f "$BUILDDIR/tmp-rootfs"
-mkdir -p "$BUILDDIR/LiveOS"
-
-mksquashfs "$BUILDDIR/tmp" "$BUILDDIR/LiveOS/squashfs.img" \
-	-comp ${COMPRESSTYPE} 2>&1 | cat >> $LOGFILE || error_out
-chmod 444 "$BUILDDIR/LiveOS/squashfs.img" || error_out $?
-
-info_msg "[8/10] Removing rootfs directory..."
-rm -rf "$ROOTFS" "$BUILDDIR/tmp-rootfs" "$BUILDDIR/tmp" || error_out $?
+info_msg "[7/9] Generating squashfs image ($COMPRESSTYPE) from rootfs..."
+generate_squashfs
 
 #
-# Prepare the ISO image.
+# Generate the ISO image.
 #
-info_msg "[9/10] Building ISO image..."
-xorriso -as mkisofs \
-	-iso-level 3 -rock -joliet \
-	-max-iso9660-filenames -omit-period \
-	-omit-version-number -relaxed-filenames -allow-lowercase \
-	-volid "VOID_LIVE" \
-	-eltorito-boot boot/isolinux/isolinux.bin \
-	-eltorito-catalog boot/isolinux/boot.cat \
-	-no-emul-boot -boot-load-size 4 -boot-info-table \
-	-eltorito-alt-boot --efi-boot boot/grub/efiboot.img -no-emul-boot \
-	-isohybrid-mbr /usr/share/syslinux/isohdpfx.bin \
-	-output "$OUTPUT_FILE" "$BUILDDIR" 2>&1 | cat >>$LOGFILE || error_out $?
-
-info_msg "[10/10] Removing build directory..."
+info_msg "[8/9] Generating ISO image..."
+generate_iso_image
+
+info_msg "[9/9] Removing build directory..."
 rm -rf "$BUILDDIR" || error_out $?
 
 hsize=$(du -sh "$OUTPUT_FILE"|awk '{print $1}')