x86_hdimage.sh -i: crossbuild x86 release CD

. build writeisofs as a native tool too for it
        . also mkfs.mfs: make missing file in proto nonlethal
        . make setup script a little more self-sufficient
        . hdboot: use INSTALL_FILE instead of INSTALL so that the
          results get added to the METALOG

Change-Id: Id233e4c861f81046bf6c4be0510b8a3bf39ff9be
This commit is contained in:
Ben Gras 2013-11-05 15:43:44 +01:00
parent 7d6089f32d
commit 09143af258
8 changed files with 109 additions and 71 deletions

View file

@ -13,42 +13,22 @@ MYLOCALRC=/mnt/etc/rc.local
ROOTMB=64
ROOTSECTS="`expr $ROOTMB '*' 1024 '*' 2`"
BOOTXXSECTS=32
USRKBFILE=/.usrkb
if [ ! -f "$USRKBFILE" ]
then echo "Are you really running from CD?"
echo "No $USRKBFILE file."
exit 1
fi
USRKB="`cat /.usrkb`"
USRKB="`du -sxk /usr | awk '{ print $1 }'`"
TOTALMB="`expr 3 + $USRKB / 1024 + $ROOTMB`"
ROOTFILES="`cat /.rootfiles`"
USRFILES="`cat /.usrfiles`"
ROOTFILES="`find -x / | wc -l`"
USRFILES="`find -x /usr | wc -l`"
# /usr/install isn't copied onto the new system; compensate
INSTALLDIR=/usr/install
if [ -d $INSTALLDIR ]
then $USRFILES=$(($USRFILES - `find -x $INSTALLDIR | wc -l`))
$USRKB=$(($USRKB - `du -sxk $INSTALLDIR | awk '{ print $1 }'`))
fi
if [ -z "$FSTYPE" ]
then FSTYPE=mfs
fi
if [ "$TOTALMB" -lt 1 ]
then
echo "Are you really running from CD?"
echo "Something wrong with size estimate on CD."
exit 1
fi
if [ "$ROOTFILES" -lt 1 ]
then
echo "Are you really running from CD?"
echo "Something wrong with root files count on CD."
exit 1
fi
if [ "$USRFILES" -lt 1 ]
then
echo "Are you really running from CD?"
echo "Something wrong with usr files count on CD."
exit 1
fi
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
@ -729,6 +709,7 @@ cpdir -vx / /mnt | progressbar "$ROOTFILES" || exit
chmod o-w /mnt/usr
cp /mnt/etc/motd.install /mnt/etc/motd
# Fix /var/log
rm /mnt/var/log
ln -s /usr/log /mnt/var/log
@ -748,7 +729,16 @@ mount /dev/$usr /mnt/usr >/dev/null || exit
# XXX we have to use "-f" here, because installboot worries about BPB, which
# we don't have...
installboot_nbsd -f /dev/$primary /usr/mdec/bootxx_minixfs3 >/dev/null || exit
cp /mnt/etc/boot.cfg.default /mnt/boot.cfg
# give the install the boot loader
cp /usr/mdec/boot_monitor /mnt/
minixdir=/mnt/boot/minix_default
if [ ! -f $minixdir/kernel ]
then rm -rf $minixdir
cp -r /mnt/multiboot $minixdir
fi
if [ ! -e /mnt/boot/minix_latest ]
then ln -sf minix_default /mnt/boot/minix_latest
fi
chroot /mnt update_bootcfg
# Save name of CD drive

View file

@ -1,4 +1,6 @@
PROG= writeisofs
MAN=
CPPFLAGS+= -I${NETBSDSRCDIR}/include/arch/${MACHINE_ARCH}/include
.include <bsd.prog.mk>

View file

@ -11,7 +11,7 @@
#include <dirent.h>
#include <assert.h>
#include <ctype.h>
#include <machine/partition.h>
#include <partition.h>
#include <sys/stat.h>

View file

@ -93,7 +93,8 @@ do-hdboot:
n=`expr $$n + 1`; \
[ "$$n" -ge 10 ] && prefix="mod" || prefix="mod0"; \
newname="${DESTDIR}/boot/minix/.temp/$${prefix}$${n}_`basename $$i`"; \
${INSTALL} $$i $$newname; \
${INSTALL_FILE} $$i $$newname; \
echo ${INSTALL_FILE} $$i $$newname; \
done
@cp ${PROGROOT}/kernel/kernel ${DESTDIR}/boot/minix/.temp/
@if [ "${MKINSTALLBOOT:Uno}" != "no" ] ; then \
@ -103,7 +104,7 @@ do-hdboot:
${HOST_SH} ../commands/update_bootcfg/update_bootcfg.sh;\
else \
${INSTALL_DIR} ${DESTDIR}/multiboot; \
${INSTALL} ${DESTDIR}/boot/minix/.temp/* ${DESTDIR}/multiboot; \
${INSTALL_FILE} ${DESTDIR}/boot/minix/.temp/* ${DESTDIR}/multiboot; \
fi
# download and update NetBSD reference sources.

View file

@ -11,11 +11,15 @@ set -e
: ${BUILDVARS=}
: ${BUILDSH=build.sh}
# Where the kernel & boot modules will be
MODDIR=${DESTDIR}/multiboot
#
# Directory where to store temporary file system images
#
: ${IMG_DIR=${OBJ}/img}
: ${IMG=minix_x86.img}
CDFILES=${IMG_DIR}/cd
if [ ! -f ${BUILDSH} ]
then echo "Please invoke me from the root source dir, where ${BUILDSH} is."
@ -27,7 +31,19 @@ export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH
#
# Artifacts from this script are stored in the IMG_DIR
#
mkdir -p $IMG_DIR
rm -rf $IMG_DIR $IMG
mkdir -p $IMG_DIR $CDFILES
while getopts "i" c
do
case "$c" in
i) : ${IMG=minix_x86.iso}
ISOMODE=1
;;
esac
done
: ${IMG=minix_x86.img}
#
# Call build.sh using a sloppy file list so we don't need to remove the installed /etc/fstag
@ -35,16 +51,25 @@ mkdir -p $IMG_DIR
export CPPFLAGS=${FLAG}
sh ${BUILDSH} -V SLOPPY_FLIST=yes -V MKBINUTILS=yes -V MKGCCCMDS=yes -j ${JOBS} -m ${ARCH} -O ${OBJ} -D ${DESTDIR} ${BUILDVARS} -U -u distribution
#
if [ "$ISOMODE" ]
then cp ${DESTDIR}/usr/mdec/boot_monitor $CDFILES/boot
cp ${MODDIR}/* $CDFILES/
. ./releasetools/release.functions
cd_root_changes # uses $CDFILES and writes $CDFILES/boot.cfg
${CROSS_TOOLS}/nbwriteisofs -s0x0 -l MINIX -B ${DESTDIR}/usr/mdec/bootxx_cd9660 -n $CDFILES ${IMG_DIR}/iso.img
ISO_SIZE=$((`stat -c %s ${IMG_DIR}/iso.img` / 512))
else # just make an empty iso partition
ISO_SIZE=8
fi
# This script creates a bootable image and should at some point in the future
# be replaced by makefs.
#
# All sized are written in 512 byte blocks
#
# we create a disk image of about 2 gig's
# for alignement reasons, prefer sizes which are multiples of 4096 bytes
# for alignment reasons, prefer sizes which are multiples of 4096 bytes
#
: ${IMG_SIZE=$(( 2*(2**30) / 512))}
: ${ROOT_SIZE=$(( 64*(2**20) / 512))}
: ${HOME_SIZE=$(( 128*(2**20) / 512))}
: ${USR_SIZE=$((1536*(2**20) / 512))}
@ -54,8 +79,8 @@ sh ${BUILDSH} -V SLOPPY_FLIST=yes -V MKBINUTILS=yes -V MKGCCCMDS=yes -j ${JOBS}
# setup phase on x86
#
cat >${FSTAB} <<END_FSTAB
/dev/c0d0p1 /home mfs rw 0 2
/dev/c0d0p2 /usr mfs rw 0 2
/dev/c0d0p3 /home mfs rw 0 2
END_FSTAB
rm -f ${DESTDIR}/SETS.*
@ -66,38 +91,22 @@ ${CROSS_TOOLS}/nbpwd_mkdb -V 0 -p -d ${DESTDIR} ${DESTDIR}/etc/master.passwd
# Now given the sizes above use DD to create separate files representing
# the partitions we are going to use.
#
dd if=/dev/zero of=${IMG_DIR}/iso.img bs=512 count=1 seek=$(($ISO_SIZE -1)) 2>/dev/null
dd if=/dev/zero of=${IMG_DIR}/root.img bs=512 count=1 seek=$(($ROOT_SIZE -1)) 2>/dev/null
dd if=/dev/zero of=${IMG_DIR}/home.img bs=512 count=1 seek=$(($HOME_SIZE -1)) 2>/dev/null
dd if=/dev/zero of=${IMG_DIR}/usr.img bs=512 count=1 seek=$(($USR_SIZE -1)) 2>/dev/null
# Create the empty image where we later will but the partitions in
dd if=/dev/zero of=${IMG} bs=512 count=1 seek=$(($IMG_SIZE -1))
#
# Do some math to determine the start addresses of the partitions.
# Ensure the start of the partitions are always aligned, the end will
# always be as we assume the sizes are multiples of 4096 bytes, which
# is always true as soon as you have an integer multiple of 1MB.
#
ROOT_START=8
HOME_START=$(($ROOT_START + $ROOT_SIZE))
USR_START=$(($HOME_START + $HOME_SIZE))
set -x
${CROSS_TOOLS}/nbpartition -m ${IMG} ${ROOT_START} 81:${ROOT_SIZE} 81:${HOME_SIZE} 81:${USR_SIZE}
set +x
# make the different file system. this part is *also* hacky. We first convert
# the METALOG.sanitised using mtree into a input METALOG containing uids and
# gids.
# Afther that we do some magic processing to add device nodes (also missing from METALOG)
# After that we do some magic processing to add device nodes (also missing from METALOG)
# and convert the METALOG into a proto file that can be used by mkfs.mfs
#
echo "creating the file systems"
#
# read METALOG and use mtree to conver the user and group names into uid and gids
# FIX put "input somwhere clean"
# read METALOG and use mtree to convert the user and group names into uid and gids
# FIX put "input somewhere clean"
#
cat ${DESTDIR}/METALOG.sanitised | ${CROSS_TOOLS}/nbmtree -N ${DESTDIR}/etc -C > ${IMG_DIR}/input
@ -124,26 +133,58 @@ rm ${IMG_DIR}/root.in
cat ${IMG_DIR}/input | grep "^\./usr/\|^. " | sed "s,\./usr,\.,g" | ${CROSS_TOOLS}/nbtoproto -b ${DESTDIR}/usr -o ${IMG_DIR}/usr.proto
cat ${IMG_DIR}/input | grep "^\./home/\|^. " | sed "s,\./home,\.,g" | ${CROSS_TOOLS}/nbtoproto -b ${DESTDIR}/home -o ${IMG_DIR}/home.proto
# If in ISO mode, fit the FSes
if [ "$ISOMODE" ]
then ROOTSIZEARG="-x 5" # give root fs a little breathing room on the CD
else # give args with the right sizes
ROOTSIZEARG="-b $((${ROOT_SIZE} / 8))"
USRSIZEARG="-b $((${USR_SIZE} / 8))"
HOMESIZEARG="-b $((${HOME_SIZE} / 8))"
fi
#
# Generate /root, /usr and /home partition images.
#
echo "Writing Minix filesystem images"
echo " - ROOT"
${CROSS_TOOLS}/nbmkfs.mfs -b $((${ROOT_SIZE} / 8)) ${IMG_DIR}/root.img ${IMG_DIR}/root.proto
${CROSS_TOOLS}/nbmkfs.mfs $ROOTSIZEARG ${IMG_DIR}/root.img ${IMG_DIR}/root.proto
echo " - USR"
${CROSS_TOOLS}/nbmkfs.mfs -b $((${USR_SIZE} / 8)) ${IMG_DIR}/usr.img ${IMG_DIR}/usr.proto
${CROSS_TOOLS}/nbmkfs.mfs $USRSIZEARG ${IMG_DIR}/usr.img ${IMG_DIR}/usr.proto
echo " - HOME"
${CROSS_TOOLS}/nbmkfs.mfs -b $((${HOME_SIZE} / 8)) ${IMG_DIR}/home.img ${IMG_DIR}/home.proto
${CROSS_TOOLS}/nbmkfs.mfs $HOMESIZEARG ${IMG_DIR}/home.img ${IMG_DIR}/home.proto
# Set the sizes based on what was just generated - should change nothing if sizes
# were specified
echo "$ROOT_SIZE $USR_SIZE $HOME_SIZE"
ROOT_SIZE=$((`stat -c %s ${IMG_DIR}/root.img` / 512))
USR_SIZE=$((`stat -c %s ${IMG_DIR}/usr.img` / 512))
HOME_SIZE=$((`stat -c %s ${IMG_DIR}/home.img` / 512))
echo "$ROOT_SIZE $USR_SIZE $HOME_SIZE"
# Do some math to determine the start addresses of the partitions.
# Ensure the start of the partitions are always aligned, the end will
# always be as we assume the sizes are multiples of 4096 bytes, which
# is always true as soon as you have an integer multiple of 1MB.
#
ISO_START=0
ROOT_START=$(($ISO_START + $ISO_SIZE))
USR_START=$(($ROOT_START + $ROOT_SIZE))
HOME_START=$(($USR_START + $USR_SIZE))
#
# Merge the partitions into a single image.
#
echo "Merging file systems"
dd if=${IMG_DIR}/iso.img of=${IMG} seek=$ISO_START conv=notrunc
dd if=${IMG_DIR}/root.img of=${IMG} seek=$ROOT_START conv=notrunc
dd if=${IMG_DIR}/home.img of=${IMG} seek=$HOME_START conv=notrunc
dd if=${IMG_DIR}/usr.img of=${IMG} seek=$USR_START conv=notrunc
dd if=${IMG_DIR}/home.img of=${IMG} seek=$HOME_START conv=notrunc
moddir=${DESTDIR}/boot/minix/.temp/
mods="`( cd $moddir; echo mod* | tr ' ' ',' )`"
echo "To boot this image on kvm:"
echo "cd $moddir && kvm -serial stdio -kernel kernel -append \"console=tty00 rootdevname=c0d0p0\" -initrd \"$mods\" -hda `pwd`/$IMG"
${CROSS_TOOLS}/nbpartition -m ${IMG} ${ISO_START} 81:${ISO_SIZE} 81:${ROOT_SIZE} 81:${USR_SIZE} 81:${HOME_SIZE}
mods="`( cd $MODDIR; echo mod* | tr ' ' ',' )`"
if [ "$ISOMODE" ]
then echo "CD image at `pwd`/$IMG"
else echo "To boot this image on kvm:"
echo "cd $MODDIR && kvm -serial stdio -kernel kernel -append \"console=tty00 rootdevname=c0d0p1\" -initrd \"$mods\" -hda `pwd`/$IMG"
fi

View file

@ -77,7 +77,8 @@ SUBDIR= host-mkdep .WAIT compat .WAIT \
file \
.WAIT \
pwd_mkdb stat zic \
partition
partition \
writeisofs
.if ${MKLLVM} != "no"
# .WAIT between llvm-tblgen and llvm-clang-tblgen ensures install

View file

@ -0,0 +1,4 @@
HOSTPROGNAME= ${_TOOL_PREFIX}writeisofs
HOST_SRCDIR= commands/writeisofs
.include "${.CURDIR}/../Makefile.host"

View file

@ -494,8 +494,7 @@ sizeup_dir(struct fs_size * fssize)
fssize->zonecount++; /* Symlink contents is always stored a block */
} else {
if ((f = fopen(token[4], "rb")) == NULL) {
pexit("dynamic size detection failed: can't open %s",
token[4]);
warn("dynamic sizing: can't open %s", token[4]);
} else if (fseek(f, 0, SEEK_END) < 0) {
pexit("dynamic size detection failed: seek to end of %s",
token[4]);