Am 13.12.2008 um Sa, 13. 12 2008, 19:51 schrieb Hubert Feyrer:
Like this? (though I'm not a sh(1) expert)Woah, that looks pretty good - thanks a lot! (I'll need a bit more time to play with it, but reading through it made a few things clear.
OK, with some fiddling and changing, I've adjusted the script to give me a bootable disk image for my shark. It should also still work on i386, but I cannot test this (qemu doesn't build on netbsd-5, and I didn't get Parallels to accept the disk as image). The script's appended below, it's based heavily on your script.
Things I've learned by the script, and also by using hexdump(1) on various disk images and disk labels:
* a MS-DOS MBR is 512 bytes (boring)* a BSD disklabel is some 300-400 bytes, apparently not really fixed in size. the interesting part: if you create a BSD disk label on a image, the first 512 bytes
are left alone. good to put an MBR in!* when you have a FFS file system image (e.g. created with mkfile), the actual file system data only starts at byte 8192 - that's plenty of space to put a BSD disk label in there. Oh, and a
MBR, too, if needed! :-)So in effect, at least for the shark, you can start your root (wd0a) partition on sector 0, as the file system's structure will still allow a BSD disk label to be present there. The MBR is not needed on a shark - just make sure the /netbsd is in a.out format. (XXX this should be moved into customize-shark.sh in the script below).
- Hubert
#! /bin/sh
#
# Create bootable NetBSD/${MACHINE} disk image
#
# Usage: sh mkdisk-arm.sh shark
# sh mkdisk-arm.sh i386
#
if [ "$1" = "" ]; then
# Try to guess from $0:
#
m=`expr "$0" : ".*-\(.*\).sh"`
if [ "$m" != "" ]; then
MACHINE=$m
else
MACHINE=i386 # default
fi
else
MACHINE=${1}
fi
BASE=/usr/cvs/src-5/obj.${MACHINE}
TOOLDIR=${BASE}/tooldir
DESTDIR=${BASE}/destdir
# Remote build:
#FTPHOST=ftp.NetBSD.org
#RELEASEDIR=pub/NetBSD/NetBSD-4.0.1
#DLDIR=./dl
#
# Local build:
DLDIR=${BASE}/releasedir/${MACHINE}/binary/sets
# Partition sizes, in MB
IMAGEMB=1024
SWAPMB=128
# Start sector of the root file system:
LABELSECTORS_shark=0 # shark
LABELSECTORS_i386=63 # historical (i386)
eval "LABELSECTORS=\${LABELSECTORS_${MACHINE}}"
########################################################################
###
# No changes from here!
# Working directory where everything is built - can be nuked safely
obj=./obj.${MACHINE}
# Script with local customization commands,
# can assume unpacked file system in .
customize=customize-${MACHINE}.sh
# Partition sizes, in sectors
IMAGESECTORS=`expr ${IMAGEMB} \* 1024 \* 1024 / 512`
SWAPSECTORS=`expr ${SWAPMB} \* 1024 \* 1024 / 512`
#
BSDPARTSECTORS=`expr ${IMAGESECTORS} - ${LABELSECTORS}`
FSSECTORS=`expr ${IMAGESECTORS} - ${SWAPSECTORS} - ${LABELSECTORS}`
FSOFFSET=${LABELSECTORS}
SWAPOFFSET=`expr ${LABELSECTORS} + ${FSSECTORS}`
FSMINSIZE=`expr ${FSSECTORS} \* 512`
echo Creating a bootable NetBSD/${MACHINE} disk image in ${MACHINE}.img:
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
if [ "${LABELSECTORS}" = "" ]; then
echo 'set LABELSECTORS first'; exit 1
fi
echo Verifying downloads ...
for f in kern-GENERIC.tgz base.tgz etc.tgz
do
if [ ! -f ${DLDIR}/${f} ]
then
mkdir -p ${DLDIR}
ftp -o ${DLDIR}/${f} ftp://${FTPHOST}/${RELEASEDIR}/${MACHINE}/
binary/sets/${f}
fi
done
echo Extracting into targetroot ...
if [ ! -d $obj/targetroot ]
then
mkdir -p $obj/targetroot
# XXX ${MACHINE} specific
tar -C $obj/targetroot -zxf ${DLDIR}/kern-GENERIC.tgz
tar -C $obj/targetroot -zxf ${DLDIR}/base.tgz
tar -C $obj/targetroot -zxf ${DLDIR}/etc.tgz
# XXX ${MACHINE} == shark specific
# XXX should be moved to customize-shark.sh (== $customize)
if [ -f $obj/targetroot/netbsd.aout ]; then
rm $obj/targetroot/netbsd
ln $obj/targetroot/netbsd.aout targetroot/netbsd
fi
if [ -f $obj/targetroot/usr/mdec/boot ]
then
cp $obj/targetroot/usr/mdec/boot $obj/targetroot
fi
# XXX /var/spool/ftp/hidden is unreadable
chmod u+r $obj/targetroot/var/spool/ftp/hidden
fi
echo Preparing mtree files ...
cat $obj/targetroot/etc/mtree/* > $obj/spec
sh $obj/targetroot/dev/MAKEDEV -s all | \
sed -e '/^\. type=dir/d' -e 's,^\.,./dev,' >> $obj/spec
echo -n Customizing via $customize ...
if [ -f $customize ]
then
echo ""
cat $customize \
| ( cd $obj/targetroot ; sh 2>&1 ) \
| sed 's,^,> ,'
echo Customizing done.
else
echo " not present (that's fine!)"
fi
echo Creating root file system in target.fs ...
${TOOLDIR}/bin/nbmakefs \
-N ${DESTDIR}/etc \
-M ${FSMINSIZE} \
-F $obj/spec \
$obj/target.fs $obj/targetroot
echo -n Preparing disk label
cat > $obj/label <<EOF
type: ESDI
disk: image
label:
flags:
bytes/sector: 512
sectors/track: 32
tracks/cylinder: 64
sectors/cylinder: 2048
cylinders: 1024
total sectors: ${IMAGESECTORS}
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0 # microseconds
track-to-track seek: 0 # microseconds
drivedata: 0
8 partitions:
# size offset fstype [fsize bsize cpg/sgs]
a: ${FSSECTORS} ${FSOFFSET} 4.2BSD 1024 8192 16
b: ${SWAPSECTORS} ${SWAPOFFSET} swap
c: ${BSDPARTSECTORS} ${FSOFFSET} unused 0 0
d: ${IMAGESECTORS} 0 unused 0 0
EOF
if [ ${LABELSECTORS} -gt 0 ]
then
# Create extra label
#
# XXX for i386, it may be good to add a MBR as the first 512 bytes
# of the disk label (take from usr/mdec/mbr) - HF
#
echo " (in extra file, label.fs) ..."
dd if=/dev/zero of=$obj/label.fs count=${LABELSECTORS}
${TOOLDIR}/bin/nbdisklabel-${MACHINE} -R -F $obj/label.fs $obj/label
cat $obj/label.fs $obj/target.fs > ${MACHINE}.img
else
# Put label in front of file system
echo " (adding at front of target.fs) ..."
${TOOLDIR}/bin/nbdisklabel-${MACHINE} -R -F $obj/target.fs $obj/label
mv $obj/target.fs ${MACHINE}.img
fi
# XXX ${MACHINE} == i386 specific
if [ -f $obj/targetroot/usr/mdec/bootxx_ffsv1 ]
then
echo Installing boot block ...
${TOOLDIR}/bin/nbinstallboot -vm ${MACHINE} ${MACHINE}.img \
$obj/targetroot/usr/mdec/bootxx_ffsv1
fi
echo Cleaning up ...
#rm -rf $obj
echo Done:
ls -la ${MACHINE}.img
#echo Testing ...
#
# NetBSD:
# qemu -hda ${MACHINE}.img -boot c
#
# Mac OS X:
# dd bs=10m if=shark.img of=/dev/rdisk4
Attachment:
PGP.sig
Description: Signierter Teil der Nachricht