slitaz-modular diff mkiso.sh @ rev 0

first release
author Christopher Rogers <slaxemulator@gmail.com>
date Thu Nov 25 03:30:16 2010 +0000 (2010-11-25)
parents
children 55ac28204029
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/mkiso.sh	Thu Nov 25 03:30:16 2010 +0000
     1.3 @@ -0,0 +1,355 @@
     1.4 +#!/bin/sh
     1.5 +
     1.6 +if [ -f "./tazwok.conf" ]; then
     1.7 +	. ./tazwok.conf
     1.8 +elif [ -f "/etc/tazwok.conf" ]; then
     1.9 +	. /etc/tazwok.conf
    1.10 +else
    1.11 +	echo -e "\nUnable to find tazwok configuration file : /etc/tazwok.conf"
    1.12 +	exit 1
    1.13 +fi
    1.14 +
    1.15 +QUIET="y"
    1.16 +FORCE="y"
    1.17 +export LABEL="slitaz_$(date +%Y%m)"
    1.18 +PUBLISHER="Slitaz"
    1.19 +APPLICATION="Slitaz"
    1.20 +CREATE_DEFAULT="n"
    1.21 +PROFILE="$(pwd)"
    1.22 +ver=""
    1.23 +CDNAME="slitaz"
    1.24 +RMSTUFF=n
    1.25 +MVSTUFF=n
    1.26 +UNGZIP=n
    1.27 +EXT="sqfs"
    1.28 +COMPRESSION="gzip"
    1.29 +MKOPTION="-b 256k"
    1.30 +MODULES=""
    1.31 +WORKING="$PROFILE/working"
    1.32 +INITRAMFS="$WORKING/initramfs"
    1.33 +UNION="$WORKING/union"
    1.34 +LOG="$WORKING/log"
    1.35 +ISODIR="$WORKING/iso"
    1.36 +IMGNAME="$PROFILE/$CDNAME-$(date +%F).iso"
    1.37 +IMGMD5NAME="$IMGNAME.md5"
    1.38 +LASTBR="$WORKING/empty"
    1.39 +SGNFILE="$ISODIR/$CDNAME/livecd.sgn"
    1.40 +MODULES_DIR="$WORKING/modules"
    1.41 +HG_DIR="$WORKING/hg"
    1.42 +COPY_HG="no"
    1.43 +UPDATE_HG="no"
    1.44 +BACKUP_SOURCES="no"
    1.45 +BACKUP_PACKAGES="no"
    1.46 +CLEAN_MODULES_DIR="no"
    1.47 +HG_LIST="flavors flavors-stable slitaz-base-files slitaz-boot-scripts slitaz-configs slitaz-doc slitaz-pizza slitaz-tools tank tazlito tazpkg tazusb tazwok website wok"
    1.48 +
    1.49 +error () { echo -e "\033[1;31;40m!!! \033[1;37;40m$@\033[1;0m"; }
    1.50 +warn ()  { echo -e "\033[1;33;40m*** \033[1;37;40m$@\033[1;0m"; }
    1.51 +info () { echo -e "\033[1;32;40m>>> \033[1;37;40m$@\033[1;0m"; }
    1.52 +
    1.53 +# do UID checking here so someone can at least get usage instructions
    1.54 +#if [ "$EUID" != "0" ]; then
    1.55 +#    error "error: This script must be run as root."
    1.56 +#    exit 1
    1.57 +#fi
    1.58 +
    1.59 +if [ -f ${PROFILE}/config ]; then
    1.60 +	source ${PROFILE}/config
    1.61 +fi
    1.62 +
    1.63 +_overlay()
    1.64 +{
    1.65 +	if [ -d ${MODULES_DIR}/overlay ]; then
    1.66 +		rm -rf ${MODULES_DIR}/overlay
    1.67 +		cp -rf ${PROFILE}/overlay ${MODULES_DIR}
    1.68 +	else
    1.69 +		cp -rf ${PROFILE}/overlay ${MODULES_DIR}
    1.70 +	fi
    1.71 +
    1.72 +	if [ "${QUIET}" = "y" ]; then
    1.73 +		mksquashfs "${MODULES_DIR}/overlay" "${ISODIR}/${CDNAME}/modules/zzz.overlay.${EXT}" -comp ${COMPRESSION} -noappend ${MKOPTION} >/dev/null
    1.74 +	else
    1.75 +		mksquashfs "${MODULES_DIR}/overlay" "${ISODIR}/${CDNAME}/modules/zzz.overlay.${EXT}" -comp ${COMPRESSION} -noappend ${MKOPTION}
    1.76 +	fi
    1.77 +}
    1.78 +
    1.79 +lzma_switches()
    1.80 +{
    1.81 +	echo "-d$(echo 24) -mt$(grep ^processor < /proc/cpuinfo | wc -l)"
    1.82 +}
    1.83 +
    1.84 +# Pack rootfs
    1.85 +pack_rootfs()
    1.86 +{
    1.87 +	( cd $1 ; find . -print | cpio -o -H newc ) | \
    1.88 +	if [ -x /usr/bin/lzma ]; then
    1.89 +		info "Generating lzma'ed initramfs... "
    1.90 +		lzma e -si -so $(lzma_switches $1) > $2
    1.91 +	else
    1.92 +		info "Generating gziped initramfs... "
    1.93 +		gzip -9 > $2
    1.94 +	fi
    1.95 +	echo 1 > /tmp/rootfs
    1.96 +}
    1.97 +
    1.98 +initramfs () {
    1.99 +
   1.100 +	if [ ! -e "$PROFILE/list/initramfs.list" ]; then
   1.101 +		error "error: $PROFILE/list/initramfs.list doesn't exist, aborting."
   1.102 +		exit 1
   1.103 +	fi
   1.104 +
   1.105 +	info "Making bootable image"
   1.106 +	cat "$PROFILE/list/initramfs.list" | grep -v "^#" | while read pkgname; do
   1.107 +		if [ ! -d ${INITRAMFS}/var/lib/tazpkg/installed/${pkgname} ]; then
   1.108 +			tazpkg get-install $pkgname --root=$INITRAMFS | tee -a $LOG/initramfs.log
   1.109 +			sleep 1
   1.110 +		else
   1.111 +			info "${pkgname} installed"
   1.112 +		fi
   1.113 +	done
   1.114 +
   1.115 +	if [ ! -d $ISODIR/boot ]; then
   1.116 +		mkdir -p $ISODIR/boot
   1.117 +	fi
   1.118 +
   1.119 +	if [ ! -f $ISODIR/boot/bzImage ]; then
   1.120 +		cp -f $INITRAMFS/boot/vmlinuz* $ISODIR/boot/bzImage
   1.121 +		rm -f $INITRAMFS/boot/vmlinuz*
   1.122 +	fi
   1.123 +
   1.124 +	info "Copying isolinux files..."
   1.125 +	if [ -d $INITRAMFS/boot/isolinux ]; then
   1.126 +		cp -a $INITRAMFS/boot/isolinux $ISODIR/boot
   1.127 +	fi
   1.128 +
   1.129 +	if [ -d $PROFILE/initramfs ]; then
   1.130 +		cp -af $PROFILE/initramfs/* $INITRAMFS
   1.131 +	fi
   1.132 +
   1.133 +	info "Creating rootfs.gz"
   1.134 +	pack_rootfs $INITRAMFS $ISODIR/boot/rootfs.gz
   1.135 +}
   1.136 +
   1.137 +copy_hg() {
   1.138 +	if [ ! -d ${HG_DIR}/hg-${1}/home/slitaz/hg/$1 ]; then
   1.139 +		info "Cloning $1 repo ..."
   1.140 +		hg clone http://hg.slitaz.org/$1 ${HG_DIR}/hg-${1}/home/slitaz/hg/$1
   1.141 +	elif [ -d ${HG_DIR}/hg-${1}/home/slitaz/hg/$1 -a ${UPDATE_HG} = "yes" ]; then
   1.142 +		info "Updating $1 repo ..."
   1.143 +		cd ${HG_DIR}/hg-${1}/home/slitaz/hg/$1 &&
   1.144 +		hg pull && hg update
   1.145 +		cd $PROFILE
   1.146 +	fi
   1.147 +}
   1.148 +
   1.149 +squashfs_hg() {
   1.150 +	if [ ! -d "$ISODIR/$CDNAME/modules/hg" ]; then
   1.151 +		mkdir -p "$ISODIR/$CDNAME/modules/hg"
   1.152 +	fi
   1.153 +	if [ -d ${HG_DIR}/hg-${1}/home/slitaz/hg/$1 ]; then
   1.154 +		_mksquash ${HG_DIR}/hg-${1} "$ISODIR/$CDNAME/modules/hg" /home/slitaz/hg/$1
   1.155 +	fi
   1.156 +}
   1.157 +
   1.158 +slitaz_union () {
   1.159 +
   1.160 +	if [ -d ${MODULES_DIR}/${mod}/var/lib/tazpkg/installed ]; then
   1.161 +		echo "${mod} module exist. Moving on."
   1.162 +	elif [ ! -d ${MODULES_DIR}/${mod}/var/lib/tazpkg/installed ]; then
   1.163 +		if [ -f "$PROFILE/list/${mod}.list" ]; then
   1.164 +			cat "$PROFILE/list/${mod}.list" | grep -v "^#" | while read pkgname; do
   1.165 +				if [ ! -d ${UNION}/var/lib/tazpkg/installed/${pkgname} ]; then
   1.166 +					tazpkg get-install $pkgname --root=${UNION} | tee -a ${LOG}/${mod}-current.log
   1.167 +					sleep 1
   1.168 +				else
   1.169 +					info "${pkgname} installed"
   1.170 +				fi
   1.171 +			done
   1.172 +		fi
   1.173 +
   1.174 +		if [ -f $PROFILE/list/${mod}.removelist ]; then
   1.175 +			cat "$PROFILE/list/${mod}.removelist" | grep -v "^#" | while read pkgname; do
   1.176 +				if [ -d ${UNION}/var/lib/tazpkg/installed/${pkgname} ]; then
   1.177 +					echo "y" | tazpkg remove ${pkgname} --root=${UNION} | tee -a ${LOG}/${mod}-current.log
   1.178 +					sleep 1
   1.179 +				else
   1.180 +					info "${pkgname} removed"
   1.181 +				fi
   1.182 +			done
   1.183 +		fi
   1.184 +	fi		
   1.185 +}
   1.186 +
   1.187 +union () {
   1.188 +	mkdir -p $WORKING
   1.189 +	mkdir -p $UNION
   1.190 +	mkdir -p $LOG
   1.191 +	mkdir -p $INITRAMFS
   1.192 +	mkdir -p $ISODIR/${CDNAME}/base
   1.193 +	mkdir -p $ISODIR/${CDNAME}/modules
   1.194 +	mkdir -p $ISODIR/${CDNAME}/optional
   1.195 +	mkdir -p $ISODIR/${CDNAME}/rootcopy
   1.196 +	mkdir -p $ISODIR/${CDNAME}/tmp
   1.197 +	mkdir -p $LASTBR
   1.198 +	touch $SGNFILE
   1.199 +
   1.200 +	modprobe aufs
   1.201 +	if [ $? -ne 0 ]; then
   1.202 +		error "Error loading Union filesystem module. (aufs)"
   1.203 +		exit 1
   1.204 +	fi
   1.205 +
   1.206 +	mount -t aufs -o br:${LASTBR}=rw aufs ${UNION}
   1.207 +	if [ $? -ne 0 ]; then 
   1.208 +		error "Error mounting $union."
   1.209 +		exit 1
   1.210 +	fi
   1.211 +
   1.212 +	info "====> Installing packages to '$UNION'"
   1.213 +	for mod in $MODULES; do
   1.214 +
   1.215 +		if [ "$CLEAN_MODULES_DIR" = "yes" ]; then
   1.216 +			if [ -d $MODULES_DIR/$mod ]; then
   1.217 +				rm -Rf $MODULES_DIR/$mod
   1.218 +			fi
   1.219 +		fi
   1.220 +
   1.221 +		if [ ! -d $MODULES_DIR/$mod ]; then
   1.222 +			mkdir -p $MODULES_DIR/$mod
   1.223 +		fi
   1.224 +		info "Adding $MODULES_DIR/$mod as top branch of union."
   1.225 +		mount -t aufs -o remount,add:0:${MODULES_DIR}/${mod}=rw aufs $UNION
   1.226 +		info "Adding $LASTBR as lower branch of union."
   1.227 +		mount -t aufs -o remount,mod:${LASTBR}=rr+wh aufs $UNION
   1.228 +		LASTBR="$MODULES_DIR/${mod}"
   1.229 +
   1.230 +		slitaz_union
   1.231 +	done
   1.232 +
   1.233 +	info "Unmounting union"
   1.234 +	umount -l "${UNION}"
   1.235 +
   1.236 +	info "Removing unionfs .wh. files."
   1.237 +	find ${MODULES_DIR} -type f -name ".wh.*" -exec rm {} \;
   1.238 +	find ${MODULES_DIR} -type d -name ".wh.*" -exec rm -rf {} \;
   1.239 +}
   1.240 +
   1.241 +
   1.242 +# _mksquash dirname
   1.243 +_mksquash () {
   1.244 +    if [ ! -d "$1" ]; then
   1.245 +        error "Error: '$1' is not a directory"
   1.246 +        return 1
   1.247 +    fi
   1.248 +
   1.249 +    if [ ! -d "$2" ]; then
   1.250 +        error "Error: '$2' is not a directory"
   1.251 +        return 1
   1.252 +    fi
   1.253 +
   1.254 +    if [ ! -d "${1}${3}" ]; then
   1.255 +        error "Error: '${1}${3}' is not a directory"
   1.256 +        return 1
   1.257 +    fi
   1.258 +
   1.259 +    time_dir="${3}"
   1.260 +    sqimg="${2}/$(basename ${1}).${EXT}"
   1.261 +    info "====> Generating SquashFS image for '${1}'"
   1.262 +    if [ -e "${sqimg}" ]; then
   1.263 +        dirhaschanged=$(find ${1}${time_dir} -newer ${sqimg})
   1.264 +        if [ "${dirhaschanged}" != "" ]; then
   1.265 +            info "SquashFS image '${sqimg}' is not up to date, rebuilding..."
   1.266 +            rm "${sqimg}"
   1.267 +        else
   1.268 +            info "SquashFS image '${sqimg}' is up to date, skipping."
   1.269 +            return
   1.270 +        fi
   1.271 +    fi
   1.272 +
   1.273 +    info "Creating SquashFS image. This may take some time..."
   1.274 +    start=$(date +%s)
   1.275 +    if [ "${QUIET}" = "y" ]; then
   1.276 +        mksquashfs "${1}" "${sqimg}" -noappend ${MKOPTION} -comp ${COMPRESSION} >/dev/null
   1.277 +    else
   1.278 +        mksquashfs "${1}" "${sqimg}" -noappend ${MKOPTION} -comp ${COMPRESSION}
   1.279 +    fi
   1.280 +    minutes=$(echo $start $(date +%s) | awk '{ printf "%0.2f",($2-$1)/60 }')
   1.281 +    info "Image creation done in $minutes minutes."
   1.282 +}
   1.283 +
   1.284 +imgcommon () {
   1.285 +	if [ "${MODULES}" != "" ]; then
   1.286 +		for MOD in ${MODULES}; do
   1.287 +			if [ -d "${MODULES_DIR}/${MOD}" ]; then
   1.288 +				_mksquash "${MODULES_DIR}/${MOD}" "$ISODIR/$CDNAME/base" /var/lib/tazpkg/installed
   1.289 +			fi
   1.290 +		done
   1.291 +	fi
   1.292 +
   1.293 +	if [ "$HG_LIST" != "" ]; then
   1.294 +		if [ "$COPY_HG" = "yes" ]; then
   1.295 +			for hg in $HG_LIST; do
   1.296 +				copy_hg $hg
   1.297 +				squashfs_hg $hg
   1.298 +			done
   1.299 +		fi
   1.300 +	fi
   1.301 +
   1.302 +	if [ "${HG_LIST}" != "" ]; then
   1.303 +		for hg in ${HG_LIST}; do
   1.304 +			if [ -d "${MODULES_DIR}/hg-${hg}" ]; then
   1.305 +				squashfs_hg $hg
   1.306 +			fi
   1.307 +		done
   1.308 +	fi
   1.309 +	
   1.310 +	info "====> Making bootable image"
   1.311 +
   1.312 +	# Sanity checks
   1.313 +	if [ ! -d "${ISODIR}" ]; then
   1.314 +		error "Error: '${ISODIR}' doesn't exist. What did you do?!"
   1.315 +		exit 1
   1.316 +	fi
   1.317 +
   1.318 +	if [ ! -f "${SGNFILE}" ]; then
   1.319 + 		error "Error: the ${SGNFILE} file doesn't exist. This image won't do anything"
   1.320 +		error "  Protecting you from yourself and erroring out here..."
   1.321 +		exit 1
   1.322 +	fi
   1.323 +
   1.324 +
   1.325 +	if [ -e "${IMGNAME}" ]; then
   1.326 +		if [ "${FORCE}" = "y" ]; then
   1.327 +			info "Removing existing bootable image..."
   1.328 +			rm -rf "${IMGNAME}"
   1.329 +		else
   1.330 +			error "Error: Image '${IMGNAME}' already exists, aborting."
   1.331 +			exit 1
   1.332 +		fi
   1.333 +	fi
   1.334 +   
   1.335 +}
   1.336 +
   1.337 +make_iso () {
   1.338 +	imgcommon
   1.339 +	initramfs
   1.340 +
   1.341 +	if [ -d ${PROFILE}/overlay ]; then
   1.342 +		_overlay
   1.343 +	fi
   1.344 +
   1.345 +	info "Creating ISO image..."
   1.346 +		genisoimage -R -o $IMGNAME -b boot/isolinux/isolinux.bin \
   1.347 +		-c boot/isolinux/boot.cat -no-emul-boot -boot-load-size 4 \
   1.348 +		-V "SliTaz" -input-charset iso8859-1 -boot-info-table $ISODIR
   1.349 +	if [ -x /usr/bin/isohybrid ]; then
   1.350 +		info "Creating hybrid ISO..."
   1.351 +		isohybrid "${IMGNAME}"
   1.352 +	fi
   1.353 +    md5sum "${IMGNAME}" > $IMGMD5NAME
   1.354 +}
   1.355 +
   1.356 +
   1.357 +union
   1.358 +make_iso