From f23d55be2bd378f82d53f1cc6eba9c0b07c17c32 Mon Sep 17 00:00:00 2001 From: Juan RP Date: Tue, 12 Jun 2012 16:27:17 +0200 Subject: Initial import of void-mklive 0.9.5 (from srcpkgs/vmklive). --- mklive.sh.in | 475 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 475 insertions(+) create mode 100644 mklive.sh.in (limited to 'mklive.sh.in') 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 -- cgit 1.4.1