#!/bin/sh # $NetBSD: mkimage,v 1.40 2013/06/16 13:47:42 jakllsch Exp $ # # Copyright (c) 2013 The NetBSD Foundation, Inc. # All rights reserved. # # This code is derived from software contributed to The NetBSD Foundation # by Christos Zoulas. # # 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. # 3. Neither the name of The NetBSD Foundation nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS # ``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 FOUNDATION OR CONTRIBUTORS # 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. # set -e DIR="$(cd "$(dirname "$0")" && pwd)" PROG="$(basename "$0")" DISKLABEL=${TOOL_DISKLABEL:-disklabel} FDISK=${TOOL_FDISK:-fdisk} GZIP=${TOOL_GZIP:-gzip} MAKEFS=${TOOL_MAKEFS:-makefs} MTREE=${TOOL_MTREE:-mtree} src="/usr/src" release="/usr/obj/evbarm/release" sets="base comp etc games man misc modules text" xsets="xbase xcomp xetc xfont xserver" minfree="10%" bar="===" tmp="$(mktemp -d "/tmp/$PROG.XXXXXX")" mnt="${tmp}/mnt" mkdir -p "${mnt}/etc" "${mnt}/dev" "${mnt}/boot" trap "cleanup" 0 1 2 3 15 cleanup() { case "$tmp" in /tmp/$PROG.*) rm -fr "$tmp";; esac } getsize() { set -- $(ls -l $1) echo $5 } usage() { cat << EOF 1>&2 Usage: $PROG -h [-bmx] [-K ] [-S ] [-D ] [-c ] [-s ] [] -b Boot only, no sets loaded -d Add the debug sets -m Mimimize disk writes for sd cards -x Load the x sets too, not just the base ones EOF exit 1 } # First pass for options to get the host and src directories OPTS="K:D:S:bc:dh:ms:x" while getopts "$OPTS" f do case $f in h) h="$OPTARG";; S) src="$OPTARG";; *) ;; esac done if [ -z "$h" ] then usage fi if [ ! -f "${DIR}/conf/${h}.conf" ] then echo $PROG: ${DIR}/conf/${h}.conf is not present 1>&2 exit 1 fi . "${DIR}/conf/${h}.conf" selected_sets="$sets" dsets=false xsets=false minwrites=false OPTIND=1 while getopts "$OPTS" f do case $f in D) release="$OPTARG";; K) kernel="$OPTARG";; S) ;; b) bootonly="true";; d) dsets=true selected_sets="$selected_sets debug" if $xsets; then selected_sets="$selected_sets xdebug" fi ;; c) custom="$OPTARG";; h) ;; m) minwrites=true;; s) size="$OPTARG";; x) xsets=true selected_sets="$selected_sets $xsets" if $dsets; then selected_sets="$selected_sets xdebug" fi ;; *) usage;; esac done shift $(( $OPTIND - 1 )) if [ -n "$1" ]; then # take the next argument as being the image name image="$1" shift fi case "$image" in *.gz) compress=true; image="${image%.gz}";; *) compress=false;; esac if [ -z "$bootonly" ]; then echo ${bar} configuring sets ${bar} (echo '/set type=dir uname=root gname=wheel mode=0755' for i in $selected_sets; do s="${release}/etc/mtree/set.$i" if [ -f "$s" ]; then cat "$s" fi done) > "$tmp/selected_sets" fi make_fstab customize populate if [ -z "$bootonly" ]; then (cd ${mnt}; ${MTREE} -N ${release}/etc -c -k all | ${MTREE} -N ${release}/etc -C -k all) >> "$tmp/selected_sets" fi if [ -n ${msdosid} ]; then echo ${bar} Populating msdos filesystem ${bar} ${MAKEFS} -N ${release}/etc -t msdos \ -O $((${init} / 2))m -s $((${boot} / 2 + ${init} / 2))m ${image} ${mnt}/boot fi if [ -z "$bootonly" ]; then echo ${bar} Populating ffs filesystem ${bar} ${MAKEFS} -N ${release}/etc -t ffs -rx \ -O $(((${init} + ${boot} + ${swap}) / 2))m \ -o d=4096 \ -b $((${extra}))m \ -F "$tmp/selected_sets" ${image} "${release}" "${mnt}" fi if [ "${size}" = 0 ]; then size="$(getsize "${image}")" fi newsize=$((${size} / 2 / 1024)) echo ${bar} Adding label ${bar} make_label > ${tmp}/label ${DISKLABEL} -R -F ${image} ${tmp}/label if [ -n ${msdosid} ]; then echo ${bar} Running fdisk ${bar} initsecs=$((${init} * 1024)) bootsecs=$((${boot} * 1024)) ${FDISK} -f -u -0 -s ${msdosid}/${initsecs}/${bootsecs} -F ${image} fi if $compress; then echo ${bar} Compressing image ${bar} rm -f "${image}.gz" ${GZIP} -9 ${image} image="${image}.gz" fi echo ${bar} Image is ${image} ${bar}