#! /bin/sh # # Copyright (c) 2009, 2010 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. VERSION=20101113a #MACHINE=amd64 MACHINE=i386 if [ -z ${MACHINE} ]; then if [ \( -z "$1" \) -o \( ! -z "$2" \) ]; then echo "usage: $0 MACHINE" echo "supported MACHINE:" \ "amd64, i386" exit 1 fi MACHINE=$1 fi # # 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 BOOTDISK=wd0 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 # BOOTDISK=wd0 # for ATA disk BOOTDISK=sd0 # for USB disk 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 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 RELEASEDIR=pub/NetBSD/NetBSD-${RELEASE} #RELEASEDIR=pub/NetBSD-daily/HEAD/201011130000Z # # misc build settings # CAT=cat CKSUM=cksum CP=cp DD=dd DISKLABEL=${TOOLDIR}/bin/nbdisklabel-${MACHINE} FDISK=${TOOLDIR}/bin/${MACHINE_GNU_PLATFORM}-fdisk FTP=ftp #FTP=lukemftp FTP_OPTIONS=-V GZIP=gzip MKDIR=mkdir MV=mv RM=rm SH=sh SED=sed TAR=tar TOUCH=touch TARGETROOTDIR=targetroot.${MACHINE} DOWNLOADDIR=download.${MACHINE} WORKDIR=work.${MACHINE} NFSROOT=nfsroot WORKDIR_DC=${WORKDIR}/${NFSROOT} IMAGE=${WORKDIR}/${MACHINE}.img DOWNLOADDIR_DC=download.dreamcast # # target image size settings # #IMAGEMB=3840 # for "4GB" USB memory IMAGEMB=1880 # for "2GB" USB memory #IMAGEMB=512 # 512MB #SWAPMB=256 # 256MB SWAPMB=128 # 128MB #SWAPMB=64 # 64MB 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? 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} \)` MBRCYLINDERS=`expr ${IMAGESECTORS} / 255 / 63` # # get binary sets # URL_SETS=ftp://${FTPHOST}/${RELEASEDIR}/${MACHINE}/binary/sets SETS="${KERN_SET} base etc ${EXTRA_SETS}" URL_SETS_DC=ftp://${FTPHOST}/${RELEASEDIR}/dreamcast/binary/sets SETS_DC="kern-GENERIC base etc comp games man misc tests text xbase xcomp xetc xfont xserver" ${MKDIR} -p ${DOWNLOADDIR} for set in ${SETS}; do if [ ! -f ${DOWNLOADDIR}/${set}.tgz ]; then echo Fetching server ${set}.tgz... ${FTP} ${FTP_OPTIONS} \ -o ${DOWNLOADDIR}/${set}.tgz ${URL_SETS}/${set}.tgz fi done ${MKDIR} -p ${DOWNLOADDIR_DC} for set in ${SETS_DC}; do if [ ! -f ${DOWNLOADDIR_DC}/${set}.tgz ]; then echo Fetching dreamcast ${set}.tgz... ${FTP} ${FTP_OPTIONS} \ -o ${DOWNLOADDIR_DC}/${set}.tgz ${URL_SETS_DC}/${set}.tgz fi done # XXX patched xinit(1) if [ ! -f ${DOWNLOADDIR_DC}/xinit.tgz ]; then echo Fetching patched xinit\(1\) binary... ${FTP} ${FTP_OPTIONS} \ -o ${DOWNLOADDIR_DC}/xinit.tgz \ ftp://${FTPHOST}/pub/NetBSD/arch/dreamcast/xinit/xinit.tgz fi # # create targetroot # echo Removing ${TARGETROOTDIR}... ${RM} -rf ${TARGETROOTDIR} ${MKDIR} -p ${TARGETROOTDIR} for set in ${SETS}; do echo Extracting host ${set}... ${TAR} -C ${TARGETROOTDIR} -zxf ${DOWNLOADDIR}/${set}.tgz done # XXX /var/spool/ftp/hidden is unreadable chmod u+r ${TARGETROOTDIR}/var/spool/ftp/hidden ${MKDIR} -p ${TARGETROOTDIR}/${NFSROOT} for set in ${SETS_DC}; do echo Extracting dreamcast ${set}... ${TAR} -C ${TARGETROOTDIR}/${NFSROOT} -zxf ${DOWNLOADDIR_DC}/${set}.tgz done # XXX /var/spool/ftp/hidden is unreadable chmod u+r ${TARGETROOTDIR}/${NFSROOT}/var/spool/ftp/hidden # XXX patched xinit(1) echo Extracting patched xinit... ${TAR} -C ${TARGETROOTDIR}/${NFSROOT} -zxf ${DOWNLOADDIR_DC}/xinit.tgz # # create target fs # # 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 echo Removing ${WORKDIR}... ${RM} -rf ${WORKDIR} ${MKDIR} -p ${WORKDIR} ${MKDIR} -p ${WORKDIR}/${NFSROOT} echo Preparing /etc/fstab... ${CAT} > ${WORKDIR}/fstab < ${WORKDIR}/${NFSROOT}/fstab < ${WORKDIR}/rc.conf ${CAT} >> ${WORKDIR}/rc.conf < \ ${WORKDIR}/${NFSROOT}/rc.conf ${CAT} >> ${WORKDIR}/${NFSROOT}/rc.conf < ${WORKDIR}/boot.cfg < ${WORKDIR}/dhcpd.conf < ${WORKDIR}/exports < ${WORKDIR}/netconfig <> ${WORKDIR}/hosts < ${WORKDIR}/resolv.conf < ${WORKDIR}/spec.${MACHINE} for set in ${SETS}; do if [ -f ${TARGETROOTDIR}/etc/mtree/set.${set} ]; then ${CAT} ${TARGETROOTDIR}/etc/mtree/set.${set} | \ ${SED} -e 's/ size=[0-9]*//' >> ${WORKDIR}/spec.${MACHINE} fi done ${SH} ${TARGETROOTDIR}/dev/MAKEDEV -s all | \ ${SED} -e '/^\. type=dir/d' -e 's,^\.,./dev,' \ >> ${WORKDIR}/spec.${MACHINE} # DCserv optional files ${CAT} >> ${WORKDIR}/spec.${MACHINE} < ${WORKDIR}/spec.dreamcast for set in ${SETS_DC}; do if [ -f ${TARGETROOTDIR}/${NFSROOT}/etc/mtree/set.${set} ]; then ${CAT} ${TARGETROOTDIR}/${NFSROOT}/etc/mtree/set.${set} | \ ${SED} -e 's,^\./,./nfsroot/,' \ -e 's/ size=[0-9]*//' >> ${WORKDIR}/spec.dreamcast fi done ${SH} ${TARGETROOTDIR}/${NFSROOT}/dev/MAKEDEV -s all | \ ${SED} -e '/^\. type=dir/d' -e 's,^\.,./dev,' -e 's,^\./,./nfsroot/,' \ >> ${WORKDIR}/spec.dreamcast # DCserv optional files ${CAT} >> ${WORKDIR}/spec.dreamcast < ${WORKDIR}/spec echo Creating rootfs... ${TOOLDIR}/bin/nbmakefs -M ${FSSIZE} -B ${TARGET_ENDIAN} \ -F ${WORKDIR}/spec -N ${TARGETROOTDIR}/etc \ -o bsize=16384,fsize=2048,density=8192 \ ${WORKDIR}/rootfs ${TARGETROOTDIR} if [ ! -f ${WORKDIR}/rootfs ]; then echo Failed to create rootfs. Aborted. exit 1 fi echo Installing bootstrap... ${TOOLDIR}/bin/nbinstallboot -v -m ${MACHINE} ${WORKDIR}/rootfs \ ${TARGETROOTDIR}/usr/mdec/${PRIMARY_BOOT} ${SECONDARY_BOOT_ARG} echo Creating swap fs ${DD} if=/dev/zero of=${WORKDIR}/swap count=${SWAPSECTORS} echo Copying target disk image... if [ ${LABELSECTORS} != 0 ]; then ${DD} if=/dev/zero of=${WORKDIR}/mbrsectors count=${LABELSECTORS} ${CAT} ${WORKDIR}/mbrsectors ${WORKDIR}/rootfs ${WORKDIR}/swap \ > ${IMAGE} else ${CAT} ${WORKDIR}/rootfs ${WORKDIR}/swap > ${IMAGE} fi if [ ${LABELSECTORS} != 0 ]; then echo creating MBR labels... ${FDISK} -f -u \ -b ${MBRCYLINDERS}/255/63 \ -0 -a -s 169/${FSOFFSET}/${FSSECTORS} \ -i -c ${TARGETROOTDIR}/usr/mdec/mbr \ -F ${IMAGE} fi echo Creating disklabel... ${CAT} > ${WORKDIR}/labelproto < ${WORKDIR}/dcserv-${VERSION}.img.gz.tmp ${MV} ${WORKDIR}/dcserv-${VERSION}.img.gz.tmp ${WORKDIR}/dcserv-${VERSION}.img.gz (cd ${WORKDIR} ; ${CKSUM} -a sha512 dcserv-${VERSION}.img.gz > SHA512 ) (cd ${WORKDIR} ; ${CKSUM} -a md5 dcserv-${VERSION}.img.gz > MD5) echo Creating dcserv-${VERSION} image complete. if [ "${TESTIMAGE}" != "yes" ]; then exit; fi # # for test on emulators... # if [ "${MACHINE}" = "amd64" -a -x /usr/pkg/bin/qemu-system-x86_64 ]; then qemu-system-x86_64 -hda ${IMAGE} -boot c fi if [ "${MACHINE}" = "i386" -a -x /usr/pkg/bin/qemu ]; then qemu -hda ${IMAGE} -boot c fi