Newer
Older
casp / NetBSD8 / root / clone_me.sh
@HIROSE Yuuji HIROSE Yuuji on 17 Sep 2019 6 KB Required files located
#!/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