#!/bin/sh # # This script should be located in $rootfs/root # disk="${1:-sd1}" case $disk in sd*) defaultboot=${disk%%[0-9]*}0 ;; # heuristics of determining bootdisk wd*) defaultboot=$disk ;; *) defaultboot=wd0 ;; esac bootdisk=${BOOTDISK:-$defaultboot} MNTROOT=${MNTROOT:-/.mnt/$disk} WAIT=${WAIT:-5} [ "$YES" ] && WAIT=0 ofs=63 ofs=2048 id=169 dosid=11 v=${V:+v} z=${Z:-512} # DOS partition size in MB Apart=${A:-1024} # root partition size in MB dossz=`expr $z \* 1024 \* 2` mydir=`dirname $0` rootfs=`cd $mydir/..; pwd -P` fstab=$rootfs/etc/fstab rootinfstab=`awk '$2 == "/"{print $1}' $fstab | sed 's,/dev/,,'` diskinfstab=${rootinfstab%a} # is maybe sd0 SITE_LOCAL_DIR=../SITE_LOCAL # Relative to rootfs aboutamount=9g ##echo $dossz mkdir_ifnot() { [ -d "$1" ] || mkdir "$1" } mntsetup() { if [ ! -d $MNTROOT ]; then mkdir -p $MNTROOT CLEAN="rmdir $MNTROOT" fi } sysfinal() { echo -n "Unmounting new-root fs..." umount $MNTROOT echo done eval "$CLEAN" } sysconfig() { mntsetup trap sysfinal INT QUIT HUP mount /dev/${disk}a $MNTROOT if [ ! -d $MNTROOT/etc -o ! -s $MNTROOT/etc/fstab ]; then echo "Initial installation not finished...abort" 1>&2 exit 1 fi if [ x"$HOSTNAME" != x"" ]; then echo "$HOSTNAME" > $MNTROOT/etc/myname fi if [ x"$NEWUSER" != x"" ]; then cp=`echo -n hogehoge|pwhash -b 4` gc=${GECOS:-"Default user"} rcfile="etc/rc.d/firstsetup" setup="$setup"" userdel -r $NEWUSER >/dev/null 2>&1 useradd -m -s /bin/zsh -b /usr/home -G operator -G wheel -c '$gc' -p '$cp' $NEWUSER echo '$NEWUSER ALL = ALL(ALL)' >> /etc/sudoers chmod og-r /etc/sudoers " fi if [ x"$GATEWAY" != x"" ]; then echo "$GATEWAY" > $MNTROOT/etc/mygate fi if [ x"$DNS" != x"" ]; then for ns in $DNS; do case $ns in *.*.*.*) echo "nameserver $ns" esac done > $MNTROOT/etc/resolv.conf fi if [ x"$IFCONFIG" != x"" ]; then echo "$IFCONFIG" > $MNTROOT/etc/ifconfig.IF setup="$setup"" for IF in \`ifconfig -lb\`; do ifconfig \$IF | grep -iq 'media: ethernet.*(.*)' && break IF='' done if [ x\"\$IF\" != x\"\" ]; then ln -s ifconfig.IF /etc/ifconfig.\$IF /etc/rc.d/network start fi " fi if [ x"$setup" != x"" ]; then cat>$MNTROOT/root/firstsetup<<EOF # PROVIDE: firstsetup # REQUIRE: mountall name="firstsetup" start_cmd="firstsetup_start" stop_cmd=":" firstsetup_start() { $setup rm -f /$rcfile } run_rc_command "\$1" EOF ln -s ../../root/firstsetup $MNTROOT/$rcfile fi sysfinal exit $? } if [ "$SYSCONFIG" ]; then sysconfig # and exit() fi if [ "$UPDATE" ]; then NOFDISK=1 NODISKLABEL=1 NONEWFS=1 fi if disklabel /dev/$disk >/dev/null 2>&1; then if [ ! "$FDISK" -a ! "$YES" ]; then echo -n "NetBSD partition already exists. Proceed?: " read ans case "$ans" in [Yy]*) ;; *) echo Abort.; exit 1 ;; esac fi fi if [ ! "$NOFDISK" ]; then eval `fdisk -S /dev/$disk 2>/dev/null` nbofs=`expr $dossz + $ofs` nbsz=`expr $BDLSIZE - $nbofs` sopt1="-s $dosid/$ofs/$dossz/Zdrive" sopt2="-s $id/$nbofs/$nbsz/NetBSD" echo $sopt1 $sopt2 echo fdisk -a0iuf $sopt /dev/$disk [ "$z" -gt 0 ] && fdisk -i0uf $sopt1 /dev/$disk >/dev/null 2>&1 fdisk -u2f -s 0/0/0 /dev/$disk >/dev/null 2>&1 fdisk -u3f -s 0/0/0 /dev/$disk >/dev/null 2>&1 fdisk -a1uf $sopt2 /dev/$disk >/dev/null 2>&1 fi if [ ! "$NODISKLABEL" ]; then echo -n Creating disklabel... Epart=`expr $nbsz - ${Apart} \* 1024 \* 2` [ "$z" -gt 0 ] && useM=yes disklabel -iI /dev/$disk >/dev/null 2>&1 <<_EOF_ a 4.2BSD $nbofs ${Apart}m e 4.2BSD a ${Epart} f unused 0 0 ${useM:+"m MSDOS $ofs $dossz"} W y Q _EOF_ #disklabel -r $disk echo done fi if [ ! "$NONEWFS" ]; then echo -n Formatting partitions... newfs -O2 -b 32768 -f 4k /dev/r${disk}a ## newfs -b 65536 /dev/r${disk}e ## newfs -i 1024 /dev/r${disk}e #newfs -O2 /dev/r${disk}e newfs -O2 -b 32k -f 4k /dev/r${disk}e [ "$z" -gt 0 ] && newfs_msdos -L Zdrive /dev/r${disk}m echo done $skip fi installboot -v -o timeout=3 /dev/r${disk}a /usr/mdec/bootxx_ffsv2 cat $fstab | sed -e "s,/dev/${diskinfstab},/dev/${bootdisk}," disklabel /dev/$disk | sed '1,/^$/d' while true; do printf "\rStarting copy in %s seconds...Type C-c to break." $WAIT [ $WAIT -eq 0 ] && break WAIT=$((WAIT - 1)) sleep 1 done printf "\nCopying tree...\n" final () { echo -n "Unmounting disks(takes a while)..." umount $MNTROOT/usr [ "$z" -gt 0 ] && umount $MNTROOT/Windows umount $MNTROOT echo done eval $CLEAN } cd $mydir cd .. mntsetup # mkdir $MNTROOT trap final INT QUIT HUP mount -o log,noatime /dev/${disk}a $MNTROOT mkdir_ifnot $MNTROOT/usr mount -o log,noatime /dev/${disk}e $MNTROOT/usr mkdir_ifnot $MNTROOT/usr/opt if [ "$z" -gt 0 ]; then mkdir_ifnot $MNTROOT/Windows chmod 777 $MNTROOT/Windows mount -t msdos -o -l /dev/${disk}m $MNTROOT/Windows fi ln -s usr/opt $MNTROOT [ -d ./rootfs ] && cd rootfs if [ -f $MNTROOT/etc/fstab ]; then echo "Seems to have cloned files. Using rsync..." rsync -a${V}H --delete . $MNTROOT/ echo "...rsync done." else touch /var/run/dev.db [ `stat -f %d .` != `stat -f %d usr` ] && usr=usr [ `stat -f %d .` != "`stat -f %d Windows`" ] && win=Windows tar lcf - . $usr $win|progress -l $aboutamount tar ${V}xpfC - $MNTROOT fi # Site-local configurations [ -d $SITE_LOCAL_DIR ] || SITE="" # Reset $SITE if not exist SLTOP=`(cd $SITE_LOCAL_DIR && pwd -P)`/FILE_SYSTEM/ if [ "$SITE" -a -d $SLTOP/$SITE ]; then # We use rsync instead of UNION fs because union-fs is empty-dir spreader. echo Copying site-dependent files... rsync -a${V}H $SLTOP/$SITE/. $MNTROOT fi ACCFILE=$SITE_LOCAL_DIR/ACC/$SITE/master.passwd GRPFILE=$SITE_LOCAL_DIR/ACC/$SITE/group # Add additional accounts if [ -n "$SITE" -a -f $ACCFILE ]; then # No need to confirm duplication, because SRCROOT/master.passwd is # always copied to $MNTROOT/etc echo "Creating site-local accounts to target password database." cat $ACCFILE >> $MNTROOT/etc/master.passwd if ! pwd_mkdb -d $MNTROOT $MNTROOT/etc/master.passwd 2>/dev/null ; then # If failed, copy back to standard one. cp etc/master.passwd $MNTROOT/etc \ && pwd_mkdb -d $MNTROOT $MNTROOT/etc/master.passwd fi [ -f $GRPFILE ] && cat $GRPFILE >> $MNTROOT/etc/group fi # Rewriting fstab to boot from wd0 or so. cat $fstab | sed -e "s,/dev/${diskinfstab},/dev/${bootdisk}," > $MNTROOT/etc/fstab # Allow shutdown to any user chmod o+x $MNTROOT/sbin/shutdown ls -lF $MNTROOT/sbin/shutdown final