#!/bin/sh # # Public Domain, 2009-2011 - Juan RP # 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 if [ "$1" -ne 0 ]; then echo "ERROR: stage mentioned above returned $1!" fi info_msg "Cleaning up $BUILDDIR..." rm -rf "$BUILDDIR" exit 1 } write_etc_motd() { cat >> "$ROOTFS/etc/motd" <<_EOF ############################################################################### Autogenerated by vmklive @@MKLIVE_VERSION@@. ------------------------------------------------------------------------------- Welcome to the Void GNU/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. ############################################################################### _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 /casper/vmlinuz INITRD /casper/initrd.lz APPEND boot=casper vga=current keymap=${KEYMAP:-us} locale=${LOCALE:-en_US.UTF-8} ro LABEL linuxtoram MENU LABEL Boot Void GNU/Linux ${kver} (RAM) ($(uname -m)) KERNEL /casper/vmlinuz INITRD /casper/initrd.lz APPEND boot=casper vga=current toram keymap=${KEYMAP:-us} locale=${LOCALE:-en_US.UTF-8} ro LABEL c MENU LABEL Boot first HD found by the BIOS LOCALBOOT 0x80 _EOF } usage() { cat <<_EOF Usage: $(basename $0) [options] Options: -c comptype Compression type for the squashfs image. -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. -h Shows this message. _EOF exit 1 } # # main() # while getopts "c:o:r:s:v:h" opt; do case $opt in c) export SQUASHFS_COMPRESSION="$OPTARG";; o) export OUTPUT_FILE="$OPTARG";; r) export ROOTDIR="$OPTARG";; s) export SPLASH_IMAGE="$OPTARG";; v) export ISO_VOLUME="$OPTARG";; h) usage;; esac done shift $(($OPTIND - 1)) if [ "$(id -u)" -ne 0 ]; then echo "ERROR: EPERM... got root?" exit 1 fi CONFIG_DIR="$HOME/.mklive" CONFIG_FILE="$CONFIG_DIR/default.conf" if [ -z "$OUTPUT_FILE" ]; then OUTPUT_FILE="$HOME/void-live-$(uname -m)-$(date +%Y%m%d).iso" fi if [ -z "$ISO_VOLUME" ]; then ISO_VOLUME="Void GNU/Linux Live $(uname -m)" fi # # The following vars can be overwritten by the config file. # SYSLINUX_DATADIR="/usr/share/syslinux" SPLASH_IMAGEDIR="/usr/share/void-artwork" SPLASH_IMAGE="$SPLASH_IMAGEDIR/splash.png" XBPS_REPO_CMD="xbps-repo" XBPS_BIN_CMD="xbps-bin" XBPS_UHELPER_CMD="xbps-uhelper" if [ ! -r $CONFIG_FILE ]; then echo "Cannot find $CONFIG_FILE! exiting..." error_out fi . $CONFIG_FILE if [ -z "$PACKAGE_LIST" ]; then PACKAGE_LIST="xbps-casper base-system" else PACKAGE_LIST="xbps-casper base-system $PACKAGE_LIST" fi BUILDDIR=$(mktemp --tmpdir="$(pwd)" -d) || exit 1 BUILDDIR=$(readlink -f $BUILDDIR) ROOTFS="$BUILDDIR/casper/rootfs" ISOLINUX_DIR="$BUILDDIR/isolinux" ISOLINUX_CFG="$ISOLINUX_DIR/isolinux.cfg" if [ ! -f $SYSLINUX_DATADIR/isolinux.bin ]; then echo "Missing required isolinux files in $SYSLINUX_DATADIR!" error_out fi # # Mount pseudofs in the target rootfs. # mount_pseudofs mkdir -p "$ROOTFS/tmp" if [ -z "$ROOTDIR" ]; then ${XBPS_REPO_CMD} -r "$ROOTFS" sync || error_out $? ${XBPS_BIN_CMD} -r "$ROOTFS" -c $(pwd)/repocache-$(uname -m) \ -y install ${PACKAGE_LIST} || error_out $? ${XBPS_BIN_CMD} -r "$ROOTFS" -c $(pwd)/repocache-$(uname -m) \ -y autoupdate || error_out $? ${XBPS_BIN_CMD} -r "$ROOTFS" -yp autoremove || error_out $? ${XBPS_BIN_CMD} -r "$ROOTFS" -yvp purge all || error_out $? fi ${XBPS_BIN_CMD} -r "$ROOTFS" list > \ "${OUTPUT_FILE%.iso}"-package-list.txt || error_out $? # # Prepare /etc/motd. # info_msg "Creating /etc/motd..." write_etc_motd # # We must know the installed kernel package version. # kver=$(${XBPS_UHELPER_CMD} -r "$ROOTFS" version kernel) if [ -z "$kver" ]; then echo "Missing 'kernel' package in repository pool!" error_out fi # # Rebuild the initramfs image with LZMA compression. # info_msg "Copying initramfs image..." INITRD_IMAGE=$(echo $ROOTFS/boot/initrd.img-*) cp -f "$INITRD_IMAGE" "$BUILDDIR/casper/initrd.lz" || error_out $? mkdir -p "$ROOTFS"/cow # # Copy the linux image to the target directory. # info_msg "Copying kernel image..." KERNEL_IMG=$(echo $ROOTFS/boot/vmlinuz-*) cp -f "$KERNEL_IMG" "$BUILDDIR/casper/vmlinuz" || error_out $? # # Remove stuff that uses a lot of space. # info_msg "Cleaning up rootfs..." rm -f "$ROOTFS"/boot/initrd* rm -f "$ROOTFS"/boot/vmlinuz* # # The pseudofs aren't needed anymore in target rootfs. # umount_pseudofs # # Copy required isolinux files in the target rootfs. # mkdir -p "$ISOLINUX_DIR" cp -f $SYSLINUX_DATADIR/isolinux.bin "$ISOLINUX_DIR" cp -f $SYSLINUX_DATADIR/vesamenu.c32 "$ISOLINUX_DIR" write_default_isolinux_conf ${kver} if [ -f "$SPLASH_IMAGE" ]; then cp -f $SPLASH_IMAGE "$ISOLINUX_DIR" fi # # Prepare the squashed rootfs image. # info_msg "Building squashed root filesystem..." mksquashfs "$ROOTFS" "$BUILDDIR/casper/filesystem.squashfs" \ -root-becomes / -comp ${SQUASHFS_COMPRESSION:-gzip} && \ chmod 444 "$BUILDDIR/casper/filesystem.squashfs" || error_out $? if [ -n "$ROOTDIR" ]; then umount_pseudofs yes else info_msg "Removing rootfs directory..." rm -rf "$ROOTFS" || error_out $? fi # # Prepare the ISO image. # info_msg "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" || error_out $? info_msg "Removing build directory..." rm -rf "$BUILDDIR" || error_out $? info_msg "Created $(readlink -f $OUTPUT_FILE) successfully." exit 0