about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Makefile20
-rw-r--r--README25
-rw-r--r--dracut/dracut-module.sh16
-rw-r--r--dracut/dracut-vmklive-adduser.sh50
-rw-r--r--mklive.sh.in475
5 files changed, 586 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..4c93606
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,20 @@
+VERSION = 0.9.5
+SBINDIR ?= /usr/sbin
+DRACUTMODDIR ?= /usr/lib/dracut/modules.d/01vmklive
+
+all:
+	sed -e "s|@@MKLIVE_VERSION@@|${VERSION}|g" mklive.sh.in > mklive.sh
+
+install: all
+	install -d $(DESTDIR)$(SBINDIR)
+	install -m755 mklive.sh $(DESTDIR)$(SBINDIR)/void-mklive
+	install -d $(DESTDIR)$(DRACUTMODDIR)
+	install -m755 dracut/dracut-module.sh \
+		$(DESTDIR)$(DRACUTMODDIR)/module-setup.sh
+	install -m755 dracut/dracut-vmklive-adduser.sh \
+		$(DESTDIR)$(DRACUTMODDIR)/vmklive-adduser.sh
+
+clean:
+	-rm -f mklive.sh
+
+.PHONY: all clean install
diff --git a/README b/README
new file mode 100644
index 0000000..1e43928
--- /dev/null
+++ b/README
@@ -0,0 +1,25 @@
+void-mklive - The Void Linux live image maker
+
+This is a simple shell script to build a live image for the
+Void linux distribution. The images contain the void-installer package
+to be able to install Void linux to storage disks.
+
+Usage: vmklive [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.
+ -o outfile		Output file name for the ISO image.
+ -r rootdir		Rootfs directory.
+ -s splash		Splash image file for isolinux.
+ -v volname		ISO Volume name.
+
+NOTE: If -k not specified it will use $(uname -r) by default.
+NOTE: the first time it is executed a configuration file will be created at ~/mklive.conf.
+NOTE: It's assumed that void-mklive is run in a Void Linux system.
+
+Take a look at the configuration file (~/mklive.conf) to tweak some
+default parameters in the generated image.
+
+	-- Juan RP <xtraeme@gmail.com>
diff --git a/dracut/dracut-module.sh b/dracut/dracut-module.sh
new file mode 100644
index 0000000..34d5120
--- /dev/null
+++ b/dracut/dracut-module.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+check() {
+    return 255
+}
+
+depends() {
+    echo dmsquash-live
+}
+
+install() {
+    inst chmod
+    inst_hook pre-pivot 01 "$moddir/vmklive-adduser.sh"
+}
diff --git a/dracut/dracut-vmklive-adduser.sh b/dracut/dracut-vmklive-adduser.sh
new file mode 100644
index 0000000..9f95c65
--- /dev/null
+++ b/dracut/dracut-vmklive-adduser.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+USERNAME=$(getarg live.user)
+[ -z "$USERNAME" ] && USERNAME=anon
+
+# Create /etc/default/live.conf to store USER.
+echo "USERNAME=$USERNAME" >> ${NEWROOT}/etc/default/live.conf
+chmod 644 ${NEWROOT}/etc/default/live.conf
+
+# Create new user and remove password. We'll use autologin by default.
+chroot ${NEWROOT} useradd -c $USERNAME -m $USERNAME -G audio,video,wheel -s /bin/sh
+chroot ${NEWROOT} passwd -d $USERNAME 2>&1 >/dev/null
+
+# Enable sudo permission by default.
+if [ -f ${NEWROOT}/etc/sudoers ]; then
+	echo "${USERNAME}  ALL=(ALL) NOPASSWD: ALL" >> ${NEWROOT}/etc/sudoers
+fi
+
+# Enable autologin for getty(1).
+if [ -f ${NEWROOT}/lib/systemd/system/getty@.service ]; then
+        rm -f "${NEWROOT}/etc/systemd/system/getty.target.wants/getty@tty1.service"
+	sed -e "s|/sbin/agetty|/sbin/live-getty|g" \
+                "${NEWROOT}/lib/systemd/system/getty@.service" > \
+                "${NEWROOT}/etc/systemd/system/getty.target.wants/getty@tty1.service"
+fi
+
+# Create /sbin/live-getty.
+cat > ${NEWROOT}/sbin/live-getty <<_EOF
+#!/bin/sh
+
+if [ -x /sbin/agetty ]; then
+	_getty=/sbin/agetty
+elif [ -x /sbin/getty ]; then
+	_getty=/sbin/getty
+fi
+
+exec \${_getty} -n -l /sbin/live-autologin \$*
+_EOF
+chmod 755 ${NEWROOT}/sbin/live-getty
+
+# Create /sbin/live-autologin.
+cat > ${NEWROOT}/sbin/live-autologin <<_EOF
+#!/bin/sh
+
+. /etc/default/live.conf
+exec /bin/login -f \$USERNAME
+_EOF
+chmod 755 ${NEWROOT}/sbin/live-autologin
diff --git a/mklive.sh.in b/mklive.sh.in
new file mode 100644
index 0000000..5221040
--- /dev/null
+++ b/mklive.sh.in
@@ -0,0 +1,475 @@
+#!/bin/sh
+#-
+# Copyright (c) 2009-2012 Juan Romero Pardines.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (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
+
+	if [ -n "$ROOTDIR" ]; then
+		mount --bind "$ROOTDIR" "$ROOTFS" || error_out $?
+	fi
+
+	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
+}
+
+umount_pseudofs() {
+	local fs
+
+	for fs in sys proc dev; do
+		umount -f "$ROOTFS/$fs" >/dev/null 2>&1
+	done
+	if [ -n "$1" -a -n "$ROOTDIR" ]; then
+		umount -f "$ROOTFS" >/dev/null 2>&1
+	fi
+}
+
+error_out() {
+	umount_pseudofs
+
+	info_msg "There was an error! cleaning up $BUILDDIR, exiting..."
+
+	[ -d "$BUILDDIR" ] && rm -rf "$BUILDDIR"
+	[ -f "$LOGFILE" ] && rm -f "$LOGFILE"
+
+	exit 1
+}
+
+write_etc_motd() {
+	cat >> "$ROOTFS/etc/motd" <<_EOF
+###############################################################################
+  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:
+
+	http://code.google.com/p/xbps/
+
+for more information and/or documentation about using the X Binary
+Package System. If you think it is useful, please make a donation
+to improve further development from the above URL, thanks.
+
+To start the installation please type:
+
+	$ sudo void-installer
+
+and follow the on-screen instructions. Thanks for trying Void Linux.
+
+###############################################################################
+_EOF
+}
+
+write_default_isolinux_conf() {
+	local kver="$1"
+
+	if [ -r "$SPLASH_IMAGE" ]; then
+		BACKGROUND="MENU BACKGROUND $(basename $SPLASH_IMAGE)"
+	fi
+
+	cat >> "$ISOLINUX_CFG" << _EOF
+UI vesamenu.c32
+PROMPT 0
+TIMEOUT 100
+ONTIMEOUT linux
+
+MENU TABMSG Press ENTER to boot or TAB to edit a menu entry
+MENU AUTOBOOT BIOS default device boot in # second{,s}...
+$BACKGROUND
+MENU WIDTH 78
+MENU MARGIN 1
+MENU ROWS 4
+MENU VSHIFT 2
+MENU TIMEOUTROW 8
+MENU TABMSGROW 2
+MENU CMDLINEROW 11
+MENU HELPMSGROW 16
+MENU HELPMSGENDROW 29
+
+MENU COLOR title        * #FF5255FF *
+MENU COLOR border       * #00000000 #00000000 none
+MENU COLOR sel          * #ffffffff #FF5255FF *
+
+LABEL linux
+MENU LABEL Boot Void GNU/Linux ${kver} ($(uname -m))
+KERNEL vmlinuz
+APPEND initrd=initrd.lz root=live:CDLABEL=VoidLinux-live-$(uname -m)-${kver} \
+ rootfstype=auto ro liveimg rd.luks=0 rd.md=0 rd.dm=0 \
+ vconsole.keymap=${KEYMAP} vconsole.unicode=1 locale.LANG=${LOCALE}
+LABEL c
+MENU LABEL Boot first HD found by BIOS
+LOCALBOOT 0x80
+_EOF
+}
+
+write_conf_file() {
+	cat > "$1" <<_EOF
+# *-*- sh -*-*
+# 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"
+
+# Syslinux splash image.
+SPLASH_IMAGE=/usr/share/void-artwork/splash.png
+
+# Default keymap to use.
+KEYMAP=us
+
+# Default locale to use.
+LOCALE=en_US
+
+# Path to XBPS utilities.
+#XBPS_BIN_CMD=xbps-bin
+#XBPS_REPO_CMD=xbps-repo
+#XBPS_UHELPER_CMD=xbps-uhelper
+
+# XBPS cache directory to install packages from.
+#REPOSITORY_CACHE=/blah/foo
+
+_EOF
+	chmod 644 "$1"
+}
+
+usage()
+{
+	cat <<_EOF
+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.
+ -o outfile		Output file name for the ISO image.
+ -r rootdir		Rootfs directory.
+ -s splash		Splash image file for isolinux.
+ -v volname		ISO Volume name.
+_EOF
+	exit 1
+}
+
+#
+# main()
+#
+while getopts "C:c:k:o:r:s:v:h" opt; do
+	case $opt in
+	C) CONFIG_FILE="$OPTARG";;
+	c) COMPRESSTYPE="$OPTARG";;
+	k) KERNELVERSION="$OPTARG";;
+	o) OUTPUT_FILE="$OPTARG";;
+	r) ROOTDIR="$OPTARG";;
+	s) SPLASH_IMAGE="$OPTARG";;
+	v) ISO_VOLUME="$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 "$ISO_VOLUME" ]; then
+	ISO_VOLUME="VoidLinux-live-$(uname -m)-${KERNELVERSION}"
+fi
+if [ -z "$SYSLINUX_DATADIR" ]; then
+	SYSLINUX_DATADIR=/usr/share/syslinux
+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
+fi
+if [ -z "$XBPS_BIN_CMD" ]; then
+	XBPS_BIN_CMD=xbps-bin
+fi
+if [ -z "$XBPS_UHELPER_CMD" ]; then
+	XBPS_UHELPER_CMD=xbps-uhelper
+fi
+if [ -z "$COMPRESSTYPE" ]; then
+	COMPRESSTYPE=xz
+fi
+
+# Create or read configuration file.
+if [ ! -r $CONFIG_FILE ]; then
+	info_msg "Creating config file at $CONFIG_FILE."
+	write_conf_file $CONFIG_FILE
+fi
+
+. $CONFIG_FILE
+
+if [ -z "$PACKAGE_LIST" ]; then
+	PACKAGE_LIST="base-system-live"
+else
+	PACKAGE_LIST="$PACKAGE_LIST"
+fi
+if [ ! -f $SYSLINUX_DATADIR/isolinux.bin ]; then
+	echo "Missing required isolinux files in $SYSLINUX_DATADIR, exiting..."
+	exit 1
+fi
+
+# Check for root permissions.
+if [ "$(id -u)" -ne 0 ]; then
+	echo "Must be run as root, exiting..."
+	exit 1
+fi
+
+BUILDDIR=$(mktemp --tmpdir=$HOME -d) || exit 1
+BUILDDIR=$(readlink -f $BUILDDIR)
+ROOTFS="$BUILDDIR/rootfs"
+ISOLINUX_DIR="$BUILDDIR/isolinux"
+ISOLINUX_CFG="$ISOLINUX_DIR/isolinux.cfg"
+
+#
+# Check there are repos registered before anything.
+#
+${XBPS_REPO_CMD} list >/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"
+mkdir -p "$ISOLINUX_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}')
+case $XBPS_VERSION in
+	# XBPS >= 0.16
+	[0-9].[1-9][6-9]*) XBPS_016=1;;
+esac
+
+info_msg "Redirecting stdout/stderr to $LOGFILE..."
+info_msg "[1/9] Installing packages into the rootfs..."
+for f in ${PACKAGE_LIST}; do
+	info_msg "  $f"
+done
+if [ -z "$ROOTDIR" ]; then
+	# 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
+	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
+fi
+
+${XBPS_BIN_CMD} -r "$ROOTFS" list > \
+	"${OUTPUT_FILE%.iso}"-package-list.txt || error_out
+
+#
+# Prepare /etc/motd.
+#
+info_msg "[2/9] Creating /etc/motd..."
+mkdir -p "$ROOTFS"/etc
+write_etc_motd
+
+#
+# Create the initramfs with XZ compression.
+#
+info_msg "[3/9] Creating initramfs image ($COMPRESSTYPE)..."
+dracut --no-hostonly --add "dmsquash-live vmklive" --${COMPRESSTYPE} \
+	"${ISOLINUX_DIR}/initrd.lz" ${KERNELVERSION} 2>/dev/null || error_out
+
+#
+# Copy the linux image to the target directory.
+#
+info_msg "[4/9] Copying kernel image/modules..."
+cp -f /boot/vmlinuz-${KERNELVERSION} "${ISOLINUX_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 vmklive-0.8.5" \
+	> $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,
+	# XBPS < 0.16
+	/packages/noarch,
+	/packages/i686,
+	/packages/x86_64
+}
+_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,
+	# XBPS < 0.16
+	http://xbps.goodluckwith.us/binpkgs/i686,
+	http://xbps.goodluckwith.us/binpkgs/noarch,
+	http://xbps.goodluckwith.us/binpkgs/nonfree/i686,
+	http://xbps.nopcode.org/repos/current/x86_64,
+	http://xbps.nopcode.org/repos/current/noarch,
+	http://xbps.nopcode.org/repos/current/nonfree/x86_64
+}
+_EOF
+chmod 644 $ROOTFS/etc/xbps/*.conf || error_out $?
+
+# Create local repos for base-system and grub packages required by
+# the void-installer pkg.
+pkgs=$($XBPS_BIN_CMD -r /tmp/blah -n install base-system grub)
+set -- ${pkgs}
+while [ $# -ne 0 ]; do
+	pkgn=$1; action=$2; ver=$3; repo=$4; binpkg=$5; arch=$6
+	if [ -z "$XBPS_016" ]; then
+		arch=$(basename $repo)
+		shift 5
+	else
+		shift 6
+	fi
+	mkdir -p $ROOTFS/packages/$arch
+	bpkg=$repo/$arch/$binpkg
+	cp -f $bpkg $ROOTFS/packages/$arch
+done
+if [ -n "$XBPS_016" ]; then
+	$XBPS_REPO_CMD genindex $ROOTFS/packages 2>&1 >>$LOGFILE
+	rm -f $ROOTFS/packages/index-files.plist
+else
+	for f in $ROOTFS_REPODIR/*; do
+		${XBPS_REPO_CMD} genindex $f 2>&1 >>$LOGFILE
+		rm -f $f/rindex-files.plist
+	done
+fi
+
+# install lsblk and blkid from util-linux. to avoid installing
+# the whole package.
+_lsblk=$(which lsblk)
+_blkid=$(which blkid)
+install -Dm755 ${_lsblk} "$ROOTFS/usr/bin/lsblk" || error_out $?
+install -Dm755 ${_blkid} "$ROOTFS/sbin/blkid" || error_out $?
+
+#
+# The pseudofs aren't needed anymore in target rootfs.
+#
+umount_pseudofs
+
+#
+# Copy required isolinux files in the target rootfs.
+#
+info_msg "[5/9] Copying isolinux files..."
+cp -f $SYSLINUX_DATADIR/isolinux.bin "$ISOLINUX_DIR"
+cp -f $SYSLINUX_DATADIR/vesamenu.c32 "$ISOLINUX_DIR"
+write_default_isolinux_conf ${KERNELVERSION}
+if [ -f "$SPLASH_IMAGE" ]; then
+	cp -f $SPLASH_IMAGE "$ISOLINUX_DIR"
+fi
+
+#
+# Prepare the squashed rootfs image.
+#
+info_msg "[6/9] 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 "[7/9] Removing rootfs directory..."
+rm -rf "$ROOTFS" "$BUILDDIR/tmp-rootfs" "$BUILDDIR/tmp" || error_out $?
+
+#
+# Prepare the ISO image.
+#
+info_msg "[8/9] Building ISO image..."
+mkisofs -J -r -V "$ISO_VOLUME" -b isolinux/isolinux.bin \
+	-c isolinux/boot.cat -no-emul-boot \
+	-boot-load-size 4 -boot-info-table \
+	-o "$OUTPUT_FILE" "$BUILDDIR" 2>&1 | cat >>$LOGFILE || error_out $?
+
+info_msg "[9/9] Removing build directory..."
+rm -rf "$BUILDDIR" || error_out $?
+
+hsize=$(du -sh "$OUTPUT_FILE"|awk '{print $1}')
+info_msg "Created $(readlink -f $OUTPUT_FILE) ($hsize) successfully."
+
+exit 0