mkimage revision 1.32
11.31Sjmcneill#!/bin/sh 21.32Sjmcneill# $NetBSD: mkimage,v 1.32 2013/02/10 21:51:05 jmcneill Exp $ 31.13Schristos# 41.17Schristos# Copyright (c) 2013 The NetBSD Foundation, Inc. 51.1Sagc# All rights reserved. 61.1Sagc# 71.17Schristos# This code is derived from software contributed to The NetBSD Foundation 81.17Schristos# by Christos Zoulas. 91.17Schristos# 101.1Sagc# Redistribution and use in source and binary forms, with or without 111.1Sagc# modification, are permitted provided that the following conditions 121.1Sagc# are met: 131.1Sagc# 1. Redistributions of source code must retain the above copyright 141.1Sagc# notice, this list of conditions and the following disclaimer. 151.1Sagc# 2. Redistributions in binary form must reproduce the above copyright 161.1Sagc# notice, this list of conditions and the following disclaimer in the 171.1Sagc# documentation and/or other materials provided with the distribution. 181.17Schristos# 3. Neither the name of The NetBSD Foundation nor the names of its 191.17Schristos# contributors may be used to endorse or promote products derived 201.17Schristos# from this software without specific prior written permission. 211.17Schristos# 221.17Schristos# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 231.17Schristos# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 241.17Schristos# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 251.17Schristos# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 261.17Schristos# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 271.17Schristos# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 281.17Schristos# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 291.17Schristos# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 301.17Schristos# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 311.17Schristos# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 321.17Schristos# POSSIBILITY OF SUCH DAMAGE. 331.1Sagc# 341.1Sagc 351.17SchristosDIR="$(cd "$(dirname "$0")" && pwd)" 361.17SchristosPROG="$(basename "$0")" 371.17Schristos 381.21SchristosDISKLABEL=${TOOL_DISKLABEL:-disklabel} 391.24SchristosFDISK=${TOOL_FDISK:-fdisk} 401.21SchristosMAKEFS=${TOOL_MAKEFS:-makefs} 411.25SjmcneillMTREE=${TOOL_MTREE:-mtree} 421.21Schristos 431.17Schristossrc="/usr/src" 441.17Schristosrelease="/usr/obj/evbarm/release" 451.17Schristossets="base comp etc games man misc modules text" 461.17Schristosxsets="xbase xcomp xetc xfont xserver" 471.17Schristosminfree="10%" 481.17Schristosbar="===" 491.17Schristos 501.17Schristostmp="$(mktemp -d "/tmp/$PROG.XXXXXX")" 511.17Schristosmnt="${tmp}/mnt" 521.17Schristosmkdir -p "${mnt}/etc" "${mnt}/dev" "${mnt}/boot" 531.23Schristos 541.17Schristostrap "cleanup" 0 1 2 3 15 551.17Schristos 561.17Schristoscleanup() { 571.17Schristos case "$tmp" in 581.17Schristos /tmp/$PROG.*) rm -fr "$tmp";; 591.17Schristos esac 601.17Schristos} 611.1Sagc 621.17Schristosgetsize() { 631.17Schristos set -- $(ls -l $1) 641.17Schristos echo $5 651.1Sagc} 661.1Sagc 671.12Schristosusage() { 681.12Schristos cat << EOF 1>&2 691.20SjmcneillUsage: $PROG -h <host-arch> [-K <kerneldir>] [-S <srcdir>] [-D <destdir>] [-c <custom-files-dir>] [-s <Mb size>] [<image>] 701.12SchristosEOF 711.13Schristos exit 1 721.12Schristos} 731.12Schristos 741.32Sjmcneill# First pass for options to get the host and src directories 751.18SchristosOPTS="K:D:S:c:h:s:x" 761.4Schristoswhile getopts "$OPTS" f 771.4Schristosdo 781.4Schristos case $f in 791.4Schristos h) h="$OPTARG";; 801.32Sjmcneill S) src="$OPTARG";; 811.4Schristos *) ;; 821.4Schristos esac 831.4Schristosdone 841.4Schristos 851.4Schristosif [ -z "$h" ] 861.4Schristosthen 871.4Schristos usage 881.4Schristosfi 891.4Schristos 901.5Schristosif [ ! -f "${DIR}/conf/${h}.conf" ] 911.4Schristosthen 921.5Schristos echo $PROG: ${DIR}/conf/${h}.conf is not present 1>&2 931.4Schristos exit 1 941.4Schristosfi 951.4Schristos 961.5Schristos. "${DIR}/conf/${h}.conf" 971.4Schristos 981.17Schristosselected_sets="$sets" 991.17Schristos 1001.4SchristosOPTIND=1 1011.4Schristoswhile getopts "$OPTS" f 1021.4Schristosdo 1031.4Schristos case $f in 1041.18Schristos D) release="$OPTARG";; 1051.18Schristos K) kernel="$OPTARG";; 1061.32Sjmcneill S) ;; 1071.4Schristos c) custom="$OPTARG";; 1081.4Schristos h) ;; 1091.4Schristos s) size="$OPTARG";; 1101.17Schristos x) selected_sets="$sets $xsets";; 1111.6Schristos *) usage;; 1121.1Sagc esac 1131.1Sagcdone 1141.1Sagc 1151.20Sjmcneillshift $(( $OPTIND - 1 )) 1161.4Schristosif [ -n "$1" ]; then 1171.1Sagc # take the next argument as being the image name 1181.1Sagc image="$1" 1191.1Sagc shift 1201.1Sagcfi 1211.1Sagc 1221.22Schristoscase "$image" in 1231.22Schristos*.gz) compress=true; image="${image%.gz}";; 1241.22Schristos*) compress=false;; 1251.22Schristosesac 1261.22Schristos 1271.17Schristosecho ${bar} configuring sets ${bar} 1281.17Schristos(echo '/set type=dir uname=root gname=wheel mode=0755' 1291.17Schristosfor i in $selected_sets; do 1301.17Schristos s="${release}/etc/mtree/set.$i" 1311.17Schristos [ -f "$s" ] && cat "$s" 1321.17Schristosdone) > "$tmp/selected_sets" 1331.1Sagc 1341.4Schristosmake_fstab 1351.17Schristoscustomize 1361.17Schristospopulate 1371.1Sagc 1381.26Schristos(cd ${mnt}; ${MTREE} -N ${release}/etc -c -k all | 1391.26Schristos ${MTREE} -N ${release}/etc -C -k all) >> "$tmp/selected_sets" 1401.17Schristosif [ -n ${msdosid} ]; then 1411.17Schristos echo ${bar} Populating msdos filesystem ${bar} 1421.27Schristos ${MAKEFS} -N ${release}/etc -t msdos \ 1431.27Schristos -O $((${init} / 2))m -s $((${boot} / 2))m ${image} ${mnt}/boot 1441.1Sagcfi 1451.1Sagc 1461.17Schristosecho ${bar} Populating ffs filesystem ${bar} 1471.27Schristos${MAKEFS} -N ${release}/etc -t ffs -rx \ 1481.27Schristos -O $(((${init} + ${boot} + ${swap}) / 2))m \ 1491.17Schristos -F "$tmp/selected_sets" ${image} "${release}" "${mnt}" 1501.1Sagc 1511.23Schristosif [ "${size}" = 0 ]; then 1521.23Schristos size="$(getsize "${image}")" 1531.17Schristosfi 1541.23Schristosnewsize=$((${size} / 2 / 1024)) 1551.1Sagc 1561.17Schristosecho ${bar} Adding label ${bar} 1571.17Schristosmake_label > ${tmp}/label 1581.21Schristos${DISKLABEL} -R -F ${image} ${tmp}/label 1591.17Schristosif [ -n ${msdosid} ]; then 1601.17Schristos echo ${bar} Running fdisk ${bar} 1611.30Sjmcneill initsecs=$((${init} * 1024)) 1621.30Sjmcneill bootsecs=$((${boot} * 1024)) 1631.30Sjmcneill ${FDISK} -f -u -0 -s ${msdosid}/${initsecs}/${bootsecs} -F ${image} 1641.2Sagcfi 1651.22Schristos 1661.22Schristosif $compress; then 1671.22Schristos echo ${bar} Compressing image ${bar} 1681.23Schristos rm -f "${image}.gz" 1691.22Schristos gzip -9 ${image} 1701.22Schristos image="${image}.gz" 1711.22Schristosfi 1721.22Schristos 1731.17Schristosecho ${bar} Image is ${image} ${bar} 174