#! /bin/sh # # $Id: mkliveimage.sh,v 1.22 2012/05/19 07:46:47 tsutsui Exp tsutsui $ # # Copyright (c) 2009, 2010, 2011 Izumi Tsutsui. 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. REVISION=20120519 HOSTNAME=teokure TIMEZONE=Japan #TESTIMAGE=yes usage() { echo "usage: $0 " echo "supported imagetypes: " \ "usb (for USB memory), emu (for emulators)" echo "supported machine: amd64, i386" exit 1 } if [ $# != 2 ]; then usage fi if [ "$1" != "usb" -a "$1" != "emu" ]; then usage fi IMAGE_TYPE=$1 MACHINE=$2 # # target dependent info # if [ "${MACHINE}" = "amd64" ]; then MACHINE_ARCH=x86_64 MACHINE_GNU_PLATFORM=x86_64--netbsd # for fdisk(8) TARGET_ENDIAN=le KERN_SET=kern-GENERIC EXTRA_SETS= # nothing USE_MBR=yes if [ ${IMAGE_TYPE}x = "emux" ]; then BOOTDISK=wd0 # for ATA disk OMIT_SWAPIMG=no # include swap partition in output image #RTC_LOCALTIME=no # assume emulators return UTC else BOOTDISK=sd0 # for USB disk #OMIT_SWAPIMG=yes # no swap partition in output image OMIT_SWAPIMG=no # XXX to use emulators to install packages RTC_LOCALTIME=yes # use rtclocaltime=YES in rc.d(8) fi PRIMARY_BOOT=bootxx_ffsv1 SECONDARY_BOOT=boot SECONDARY_BOOT_ARG= # nothing fi if [ "${MACHINE}" = "i386" ]; then MACHINE_ARCH=i386 MACHINE_GNU_PLATFORM=i486--netbsdelf # for fdisk(8) TARGET_ENDIAN=le KERN_SET=kern-GENERIC EXTRA_SETS= # nothing USE_MBR=yes if [ ${IMAGE_TYPE}x = "emux" ]; then BOOTDISK=wd0 # for ATA disk OMIT_SWAPIMG=no # include swap partition in output image #RTC_LOCALTIME=no # assume emulators return UTC else BOOTDISK=sd0 # for USB disk #OMIT_SWAPIMG=yes # no swap partition in output image OMIT_SWAPIMG=no # XXX to use emulators to install packages RTC_LOCALTIME=yes # use rtclocaltime=YES in rc.d(8) fi PRIMARY_BOOT=bootxx_ffsv1 SECONDARY_BOOT=boot SECONDARY_BOOT_ARG= # nothing fi if [ -z ${MACHINE_ARCH} ]; then echo "Unsupported MACHINE (${MACHINE})" exit 1 fi # # tooldir settings # #NETBSDSRCDIR=/usr/src #TOOLDIR=/usr/tools/${MACHINE_ARCH} if [ -z ${NETBSDSRCDIR} ]; then NETBSDSRCDIR=/usr/src fi if [ -z ${TOOLDIR} ]; then _HOST_OSNAME=`uname -s` _HOST_OSREL=`uname -r` _HOST_ARCH=`uname -p 2> /dev/null || uname -m` TOOLDIRNAME=tooldir.${_HOST_OSNAME}-${_HOST_OSREL}-${_HOST_ARCH} TOOLDIR=${NETBSDSRCDIR}/obj.${MACHINE}/${TOOLDIRNAME} if [ ! -d ${TOOLDIR} ]; then TOOLDIR=${NETBSDSRCDIR}/${TOOLDIRNAME} fi fi if [ ! -d ${TOOLDIR} ]; then echo 'set TOOLDIR first'; exit 1 fi if [ ! -x ${TOOLDIR}/bin/nbdisklabel-${MACHINE} ]; then echo 'build tools in ${TOOLDIR} first'; exit 1 fi # # info about ftp to get binary sets # #FTPHOST=ftp.NetBSD.org #FTPHOST=ftp.jp.NetBSD.org FTPHOST=ftp7.jp.NetBSD.org #FTPHOST=nyftp.NetBSD.org RELEASE=5.1.2 RELEASEDIR=pub/NetBSD/NetBSD-${RELEASE} #RELEASEDIR=pub/NetBSD-daily/HEAD/201002020000Z #RELEASEDIR=pub/NetBSD-daily/netbsd-5/201108310020Z # # misc build settings # # tools binaries DISKLABEL=${TOOLDIR}/bin/nbdisklabel-${MACHINE} FDISK=${TOOLDIR}/bin/${MACHINE_GNU_PLATFORM}-fdisk SED=${TOOLDIR}/bin/nbsed SUNLABEL=${TOOLDIR}/bin/nbsunlabel # host binaries CAT=cat CP=cp DD=dd FTP=ftp #FTP=lukemftp FTP_OPTIONS=-V MKDIR=mkdir RM=rm SH=sh TAR=tar # working directories TARGETROOTDIR=targetroot.${MACHINE}.${IMAGE_TYPE} DOWNLOADDIR=download.${MACHINE} WORKDIR=work.${MACHINE}.${IMAGE_TYPE} IMAGE=${WORKDIR}/liveimage-${MACHINE}-${IMAGE_TYPE}-${REVISION}.img # # target image size settings # IMAGEMB=3820 # for "4GB" USB memory (there is 3824MB one) SWAPMB=512 # 512MB IMAGESECTORS=`expr ${IMAGEMB} \* 1024 \* 1024 / 512` SWAPSECTORS=`expr ${SWAPMB} \* 1024 \* 1024 / 512` LABELSECTORS=0 if [ "${USE_MBR}" = "yes" ]; then # LABELSECTORS=63 # historical # LABELSECTORS=32 # aligned LABELSECTORS=2048 # align 1MiB for modern flash fi BSDPARTSECTORS=`expr ${IMAGESECTORS} - ${LABELSECTORS}` FSSECTORS=`expr ${IMAGESECTORS} - ${SWAPSECTORS} - ${LABELSECTORS}` FSOFFSET=${LABELSECTORS} SWAPOFFSET=`expr ${LABELSECTORS} + ${FSSECTORS}` FSSIZE=`expr ${FSSECTORS} \* 512` HEADS=64 SECTORS=32 CYLINDERS=`expr ${IMAGESECTORS} / \( ${HEADS} \* ${SECTORS} \)` FSCYLINDERS=`expr ${FSSECTORS} / \( ${HEADS} \* ${SECTORS} \)` SWAPCYLINDERS=`expr ${SWAPSECTORS} / \( ${HEADS} \* ${SECTORS} \)` # fdisk(8) parameters MBRSECTORS=63 MBRHEADS=255 MBRCYLINDERS=`expr ${IMAGESECTORS} / \( ${MBRHEADS} \* ${MBRSECTORS} \)` MBRNETBSD=169 # makefs(8) parameters BLOCKSIZE=16384 FRAGSIZE=2048 DENSITY=8192 echo creating ${IMAGE_TYPE} image for ${MACHINE}... # # get binary sets # URL_SETS=ftp://${FTPHOST}/${RELEASEDIR}/${MACHINE}/binary/sets SETS="${KERN_SET} base etc comp games man misc tests text xbase xcomp xetc xfont xserver ${EXTRA_SETS}" #SETS="${KERN_SET} base etc comp ${EXTRA_SETS}" ${MKDIR} -p ${DOWNLOADDIR} for set in ${SETS}; do if [ ! -f ${DOWNLOADDIR}/${set}.tgz ]; then echo Fetching ${set}.tgz... ${FTP} ${FTP_OPTIONS} \ -o ${DOWNLOADDIR}/${set}.tgz ${URL_SETS}/${set}.tgz fi done # # create targetroot # echo Removing ${TARGETROOTDIR}... ${RM} -rf ${TARGETROOTDIR} ${MKDIR} -p ${TARGETROOTDIR} for set in ${SETS}; do echo Extracting ${set}... ${TAR} -C ${TARGETROOTDIR} -zxf ${DOWNLOADDIR}/${set}.tgz done # XXX /var/spool/ftp/hidden is unreadable chmod u+r ${TARGETROOTDIR}/var/spool/ftp/hidden # copy secondary boot for bootstrap # XXX probabry more machine dependent if [ ! -z ${SECONDARY_BOOT} ]; then echo Copying secondary boot... ${CP} ${TARGETROOTDIR}/usr/mdec/${SECONDARY_BOOT} ${TARGETROOTDIR} fi # # create target fs # echo Removing ${WORKDIR}... ${RM} -rf ${WORKDIR} ${MKDIR} -p ${WORKDIR} echo Preparing /etc/fstab... ${CAT} > ${WORKDIR}/fstab < ${WORKDIR}/rc.conf if [ ${RTC_LOCALTIME}x = "yesx" ]; then echo rtclocaltime=YES >> ${WORKDIR}/rc.conf else echo #rtclocaltime=YES >> ${WORKDIR}/rc.conf fi echo hostname=${HOSTNAME} >> ${WORKDIR}/rc.conf echo dhcpcd=YES >> ${WORKDIR}/rc.conf ${CP} ${WORKDIR}/rc.conf ${TARGETROOTDIR}/etc echo Setting localtime... ln -sf /usr/share/zoneinfo/${TIMEZONE} ${TARGETROOTDIR}/etc/localtime echo Preparing spec file for makefs... ${CAT} ${TARGETROOTDIR}/etc/mtree/* | \ ${SED} -e 's/ size=[0-9]*//' > ${WORKDIR}/spec ${SH} ${TARGETROOTDIR}/dev/MAKEDEV -s all | \ ${SED} -e '/^\. type=dir/d' -e 's,^\.,./dev,' >> ${WORKDIR}/spec # spec for optional files/dirs ${CAT} >> ${WORKDIR}/spec < ${IMAGE} if [ "${OMIT_SWAPIMG}x" != "yesx" ]; then ${CAT} ${WORKDIR}/swap >> ${IMAGE} fi else echo Copying target disk image... ${CP} ${WORKDIR}/rootfs ${IMAGE} if [ "${OMIT_SWAPIMG}x" != "yesx" ]; then ${CAT} ${WORKDIR}/swap >> ${IMAGE} fi fi if [ ! -z ${USE_SUNLABEL} ]; then echo Creating sun disklabel... printf 'V ncyl %d\nV nhead %d\nV nsect %d\na %d %d/0/0\nb %d %d/0/0\nW\n' \ ${CYLINDERS} ${HEADS} ${SECTORS} \ ${FSOFFSET} ${FSCYLINDERS} ${FSCYLINDERS} ${SWAPCYLINDERS} | \ ${SUNLABEL} -nq ${IMAGE} fi echo Creating disklabel... ${CAT} > ${WORKDIR}/labelproto <