diff options
author | julian <julian@FreeBSD.org> | 1996-05-21 01:12:48 +0000 |
---|---|---|
committer | julian <julian@FreeBSD.org> | 1996-05-21 01:12:48 +0000 |
commit | 57f684b7bcf43e96e30345e8dd8437b9722daa89 (patch) | |
tree | 4e0299859bca8dbeb00101cbcd071e48e508f44f /release/floppies/doFS.sh | |
parent | daaf2e922f028b52c7654d7ffacd86a5f39dd69f (diff) | |
download | FreeBSD-src-57f684b7bcf43e96e30345e8dd8437b9722daa89.zip FreeBSD-src-57f684b7bcf43e96e30345e8dd8437b9722daa89.tar.gz |
stand alone (kinda) floppy generation..
you still need tohave done a make world and have made 'sysinstall'
this should not interfere with existing code as it's standalone.
write_mfs_in_kernel.c is duplicated alsewhere.. one will go ..
Diffstat (limited to 'release/floppies/doFS.sh')
-rw-r--r-- | release/floppies/doFS.sh | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/release/floppies/doFS.sh b/release/floppies/doFS.sh new file mode 100644 index 0000000..1693226 --- /dev/null +++ b/release/floppies/doFS.sh @@ -0,0 +1,120 @@ +: +#set -ex + +VNDEVICE=vn0 +export BLOCKSIZE=512 + +LABELDIR=$1 ; shift +MNT=$1 ; shift +FSSIZE=$1 ; shift +FSPROTO=$1 ; shift +FSINODE=$1 ; shift +FSLABEL=$1 ; shift +OLDFSSIZE=${FSSIZE} +OLDFSINODE=${FSINODE} + +deadlock=40 + +while true +do + rm -f fs-image + + if [ ! -b /dev/${VNDEVICE} -o ! -c /dev/r${VNDEVICE} ] ; then + ( cd /dev && sh MAKEDEV ${VNDEVICE} ) + fi + + umount /dev/${VNDEVICE} 2>/dev/null || true + + umount ${MNT} 2>/dev/null || true + + vnconfig -u /dev/r${VNDEVICE} 2>/dev/null || true + + dd of=fs-image if=/dev/zero count=${FSSIZE} bs=1k 2>/dev/null + # this suppresses the `invalid primary partition table: no magic' + awk 'BEGIN {printf "%c%c", 85, 170}' |\ + dd of=fs-image obs=1 seek=510 conv=notrunc 2>/dev/null + + vnconfig -s labels -c /dev/r${VNDEVICE} fs-image + + sed '/^minimum:/,$d' /etc/disktab > /etc/disktab.tmp + cat /etc/disktab.tmp > /etc/disktab + rm -f /etc/disktab.tmp + ( + a=`expr ${FSSIZE} \* 2` + echo + echo "minimum:ty=mfs:se#512:nt#1:rm#300:\\" + echo " :ns#$a:nc#1:\\" + echo " :pa#$a:oa#0:ba#4096:fa#512:\\" + echo " :pc#$a:oc#0:bc#4096:fc#512:" + echo + ) >> /etc/disktab + + disklabel -w -r -B \ + -b ${LABELDIR}/boot1 \ + -s ${LABELDIR}/boot2 \ + /dev/r${VNDEVICE} minimum + + newfs -u 0 -t 0 -i ${FSINODE} -m 0 -T minimum /dev/r${VNDEVICE}a + + mount /dev/${VNDEVICE}a ${MNT} + + if ( set -e && cd ${FSPROTO} && find . -print | cpio -dump ${MNT} ) + then + ; + else + echo " $FSINODE and $FSSIZE failed, reverting.." + FSSIZE=`expr ${FSSIZE} + 10` + #FSSIZE=${OLDFSSIZE} + FSINODE=${FSINODE} + continue + fi + + set `df -i /mnt | tail -1` +#/dev/vn0a 937 932 5 99% 342 328 51% /mnt + + umount ${MNT} + + fsck -p /dev/r${VNDEVICE}a < /dev/null + + vnconfig -u /dev/r${VNDEVICE} 2>/dev/null || true + + if [ $FSLABEL != "minimum" ] ; then + echo ${FSSIZE} > fs-image.size + break + fi + + OLDFSSIZE=${FSSIZE} + OLDFSINODE=${FSINODE} + echo ">>> Filesystem is ${FSSIZE} K, $4 left" + echo ">>> ${FSINODE} bytes/inode, $7 left" + echo ">>> `expr ${FSSIZE} \* 1024 / ${FSINODE}`" + if [ $4 -gt 128 ] ; then + echo "Reducing size" + FSSIZE=`expr ${FSSIZE} - $4 / 2` + continue + fi + if [ $7 -gt 128 ] ; then + echo "Increasing bytes per inode" + FSINODE=`expr ${FSINODE} + 8192` + continue + fi + if [ $4 -gt 32 ] ; then + echo "Reducing size" + FSSIZE=`expr ${FSSIZE} - 4` + FSINODE=`expr ${FSINODE} - 1024` + continue + fi + if [ $7 -gt 64 ] ; then + echo "Increasing bytes per inode" + FSINODE=`expr ${FSINODE} + 8192` + continue + fi + if [ $deadlock -eq 0 ] ; then + echo "Avoiding deadlock, giving up" + echo ${FSSIZE} > fs-image.size + break + fi + deadlock=`expr $deadlock - 1` + echo ${FSSIZE} > fs-image.size + break; +done |