171887Sphk#!/bin/sh
271887Sphk#
371887Sphk# $FreeBSD$
471887Sphk#
575328Sobrien
6110208Sphkset -ex
713352Sphk
813534Sjoergexport BLOCKSIZE=512
913352Sphk
10113899SruDISKLABEL=$1; shift
11112453SruMACHINE=${1:+"-m $1"}; shift
1242300SjkhFSIMG=$1; shift
1313352SphkRD=$1 ; shift
1413352SphkMNT=$1 ; shift
1513352SphkFSSIZE=$1 ; shift
1613352SphkFSPROTO=$1 ; shift
1713352SphkFSINODE=$1 ; shift
1813352SphkFSLABEL=$1 ; shift
1913352Sphk
20106391Smarcel#
21118667Sru# If we've been told to, compute the required file system size
22118667Sru# and average inode size automatically.
23118667Sru#
24118667Sruif [ ${FSSIZE} -eq 0 -a ${FSLABEL} = "auto" ]; then
25118667Sru	roundup() echo $((($1+$2-1)-($1+$2-1)%$2))
26118667Sru	nf=$(find ${FSPROTO} |wc -l)
27118667Sru	sk=$(du -sk ${FSPROTO} |cut -f1)
28118667Sru	FSINODE=$(roundup $(($sk*1024/$nf)) ${FSINODE})
29118667Sru	FSSIZE=$(roundup $(($sk*12/10)) 1024)
30118667Srufi
31118667Sru
3286390Snyandofs_vn () {
33125168Sru	if [ "x$VNDEVICE" = "x" ] ; then
34125168Sru		VNDEVICE=vn0
35125168Sru	fi
36125168Sru	u=`expr $VNDEVICE : 'vn\([0-9]*\)' || true`
37125168Sru	VNDEVICE=vnn$u
3886390Snyan
39125168Sru	rm -f /dev/*vnn*
40125168Sru	mknod /dev/rvnn${u} c 43 `expr 65538 + $u '*' 8`
41125168Sru	mknod /dev/rvnn${u}c c 43 `expr 2 + $u '*' 8`
42125168Sru	mknod /dev/vnn${u} b 15 `expr 65538 + $u '*' 8`
43125168Sru	mknod /dev/vnn${u}c b 15 `expr 2 + $u '*' 8`
4486390Snyan
4586390Snyan	umount /dev/${VNDEVICE} 2>/dev/null || true
4686390Snyan	umount ${MNT} 2>/dev/null || true
4786390Snyan	vnconfig -u /dev/r${VNDEVICE} 2>/dev/null || true
4886390Snyan
4986390Snyan	vnconfig -s labels -c /dev/r${VNDEVICE} ${FSIMG}
50112864Sru
51113510Sru	trap "umount ${MNT}; vnconfig -u /dev/r${VNDEVICE}; rm -f /dev/*vnn*" EXIT
52112864Sru
53112453Sru	disklabel -w ${BOOT} ${VNDEVICE} ${FSLABEL}
54115069Sru	newfs -i ${FSINODE} -o space -m 0 /dev/r${VNDEVICE}c
5586390Snyan
5686390Snyan	mount /dev/${VNDEVICE}c ${MNT}
5786390Snyan}
5886390Snyan
5986390Snyandofs_md () {
6071887Sphk	if [ "x${MDDEVICE}" != "x" ] ; then
6171887Sphk		umount /dev/${MDDEVICE} 2>/dev/null || true
6271887Sphk		umount ${MNT} 2>/dev/null || true
6371887Sphk		mdconfig -d -u ${MDDEVICE} 2>/dev/null || true
6471887Sphk	fi
6513352Sphk
6671887Sphk	MDDEVICE=`mdconfig -a -t vnode -f ${FSIMG}`
6771887Sphk	if [ ! -c /dev/${MDDEVICE} ] ; then
68110208Sphk		echo "No /dev/$MDDEVICE" 1>&2
69110208Sphk		exit 1
7071887Sphk	fi
71112864Sru
72112864Sru	trap "umount ${MNT}; mdconfig -d -u ${MDDEVICE}" EXIT
73112864Sru
74133951Sgrehan	if [ "x${DISKLABEL}" != "x" ] ; then
75133951Sgrehan		${DISKLABEL} ${MACHINE} -w ${BOOT} ${MDDEVICE} ${FSLABEL}
76133951Sgrehan	fi
77188606Snyan	newfs -O1 -b 4096 -f 512 -i ${FSINODE} -o space -m 0 /dev/${MDDEVICE}
78188606Snyan	mount /dev/${MDDEVICE} ${MNT}
79125168Sru}
8013352Sphk
81125168Srurm -f ${FSIMG}
82125168Srudd of=${FSIMG} if=/dev/zero count=${FSSIZE} bs=1k 2>/dev/null
8313352Sphk
84120226Sru#
85120226Sru# We don't have any bootblocks on ia64. Note that -B implies -r,
86120226Sru# so we have to specifically specify -r when we don't have -B.
87120226Sru# bsdlabel fails otherwise.
88120226Sru#
8986390Snyancase `uname -r` in
90125168Sru4.*)
91120226Sru	if [ -f "${RD}/trees/base/boot/boot1" ]; then
92120226Sru		BOOT="-B -b ${RD}/trees/base/boot/boot1"
93120226Sru		if [ -f "${RD}/trees/base/boot/boot2" ]; then
94120226Sru			BOOT="${BOOT} -s ${RD}/trees/base/boot/boot2"
95120226Sru		fi
96120226Sru	else
97120226Sru		BOOT="-r"
98120226Sru	fi
9986448Snyan	dofs_vn
10086390Snyan	;;
10186390Snyan*)
102120226Sru	if [ -f "${RD}/trees/base/boot/boot" ]; then
103120226Sru		BOOT="-B -b ${RD}/trees/base/boot/boot"
104120226Sru	else
105120226Sru		BOOT="-r"
106120226Sru	fi
10786448Snyan	dofs_md
10886390Snyan	;;
10986390Snyanesac
110125168Sru
111125168Sruif [ -d ${FSPROTO} ]; then
112125168Sru	(set -e && cd ${FSPROTO} && find . -print | cpio -dump ${MNT})
113125168Sruelse
114125168Sru	cp -p ${FSPROTO} ${MNT}
115125168Srufi
116125168Sru
117125168Srudf -ki ${MNT}
118125168Sru
119125168Sruset `df -ki ${MNT} | tail -1`
120125168Sru
121125168Sruecho "*** File system is ${FSSIZE} K, $4 left"
122125168Sruecho "***     ${FSINODE} bytes/inode, $7 left"
123