#!/bin/sh set -e usage_exit() { echo echo "usage: $0 src [--layer=tarball]... dest [dest]..." echo echo "example: copying image to devices: sde, sdf, sdg" echo "$0 lx-trainer.img /dev/sde /dev/sdf /dev/sdg" echo exit 1 } if [ `id -u` -ne 0 ]; then echo "error: sorry, this script must be run as root" exit 1 fi # minimum 2 arguments if [ $# -lt 2 ]; then echo "error: invalid arguments" usage_exit fi # gather arguments SRC="" LAYERS="" DESTS="" for arg in $@; do case $arg in --layer=*) LAYERS="$LAYERS `echo $arg | sed -e 's/^--layer=//'`" ;; --*) echo "error: unknown option: $arg" usage_exit ;; *) if [ -z "$SRC" ]; then SRC="$arg" else DESTS="$DESTS $arg" fi ;; esac done # source must be file or block device if [ ! -f "$SRC" -a ! -b "$SRC" ]; then echo "error: invalid src" usage_exit fi # destination must be block device for dest in $DESTS; do if [ ! -b $dest ]; then echo "error: invalid dest: $dest" usage_exit fi done # delete mbr's and rescan devices dd if=/dev/zero bs=1M count=10 | tee $DESTS > /dev/null partprobe $DESTS # efficiently copy source to all destinations and rescan devices cat $SRC | tee $DESTS > /dev/null partprobe $DESTS # add 2nd partition for dest in $DESTS; do /bin/echo -e "n\np\n\n\n\nw" | fdisk $dest done # rescan devices partprobe $DESTS # wait for partitions to appear for dest in $DESTS; do while [ ! -b ${dest}2 ]; do echo "waiting for ${dest}2..." sleep 1 done done # create ext4 on 2nd partition for dest in $DESTS; do mkfs.ext4 -L lxhome ${dest}2 & done wait # setup temp directory for mountpoints TMP_ROOT="/tmp/dd-multi-`date +%s`.$$" rm -rf $TMP_ROOT mkdir -p $TMP_ROOT echo "using temp directory $TMP_ROOT" for dest in $DESTS; do # create mountpoints mkdir -p ${TMP_ROOT}${dest}1 mkdir -p ${TMP_ROOT}${dest}2 # mount partitions mount ${dest}1 ${TMP_ROOT}${dest}1 mount ${dest}2 ${TMP_ROOT}${dest}2 # move home directories to 2nd partition mv ${TMP_ROOT}${dest}1/home/* ${TMP_ROOT}${dest}2/ # setup 2nd partition to be mounted as /home echo 'LABEL=lxhome /home ext4 defaults 0 0' | \ tee -a ${TMP_ROOT}${dest}1/etc/fstab # copy layer tarballs to /home for tarball in $LAYERS; do destfile="${TMP_ROOT}${dest}2/`basename $tarball`" if [ -f $destfile ]; then echo echo "WARNING: OVERWRITING $destfile" 1>&2 echo sleep 1 fi cp $tarball $destfile done # remount home to /home umount ${TMP_ROOT}${dest}2 mount ${dest}2 ${TMP_ROOT}${dest}1/home # unpack layers for tarball in $LAYERS; do destfile=`basename $tarball` chroot ${TMP_ROOT}${dest}1 tar -x -f /home/$destfile --numeric-owner -C / rm ${TMP_ROOT}${dest}1/home/$destfile done # unmount partitions umount ${TMP_ROOT}${dest}1/home umount ${TMP_ROOT}${dest}1 done # cleanup temp directory rm -rf $TMP_ROOT