HOWTO Clone Disk Images on Linux Booted from a Network
Prev |  | Next

# B. Clone script

    #!/bin/bash

    set -e

    export PATH=/sbin:/bin

    tftp_server=10.0.0.1
    nic_module=3c59x.o
    major_a=(2 3 22)
    family_a=(fd hda hdc)
    image_a=(img0001 img0002 img0003 img0004)

    operation_a=(	"Copy from network to device" \
    		"Copy from device to network" \
    		"Run fdisk")

    mount -t proc proc /proc
    insmod /lib/${nic_module}
    /sbin/dhcpcd

    while true; do \
    	[ ! -z "${image}" ] && unset image
    	echo
    	echo "Clone Menu"
    	echo
    	echo "Operation"
    	echo
    	PS3="Choose operation (1-${#operation_a[*]}): "
    	select operation in "${operation_a[@]}"; do \
    		[ -z "${operation}" ] && continue
    		echo
    		echo $REPLY - $operation
    		echo
    		break
    	done

    	echo "Device Family"
    	echo
    	PS3="Choose device family (1-${#family_a[*]}): "
    	select family in "${family_a[@]}"; do \
    		[ -z "${family}" ] && continue
    		echo
    		echo $REPLY - $family
    		echo
    		break
    	done

    	major_i=$[REPLY-1]
    	major=${major_a[$major_i]}

    	echo "Minor Number"
    	echo
    	PS3="Choose minor number (0-255): "
    	echo -n "$PS3" >&2
    	read minor
    	minor=$[minor%256]
    	echo
    	echo $minor
    	echo

    	if [ "${operation}" != "${operation_a[2]}" ]; then \
    		echo "Image"
    		echo
    		PS3="Choose image (1-${#image_a[*]}): "
    		select image in "${image_a[@]}"; do \
    			[ -z "${image}" ] && continue
    			echo
    			echo $REPLY - $image
    			echo
    			break
    		done
    		image_i=$[REPLY-1]
    		image=${image_a[${image_i}]}
    	fi

    	echo
    	echo -e "Operation:\t$operation"
    	device_name=/dev/${family_a[${major_i}]}${minor}
    	echo -e "Device:\t\t${device_name} ($major, $minor)"
    	[ ! -z "${image}" ] && echo -e "Image:\t\t${image}"
    	echo

    	echo "Confirmation"
    	echo
    	PS3="Ok/Cancel (1-2): "
    	select ok in Ok Cancel; do \
    		[ -z "${ok}" ] && continue
    		echo
    		echo $REPLY - $ok
    		echo
    		break
    	done
    	if [ "${ok}" = "Ok" ]; then \
    		if [ ! -b ${device_name} ]; then \
    			echo "Creating ${device_name}"
    			mknod ${device_name} b ${major} ${minor}
    		fi
    		if [ ! -z "${image}" ]; then \
    			if [ ! -p ${image} ]; then \
    				echo "Creating pipe"
    				mknod ${image} p
    			fi
    		fi
    		if [ "${operation}" = "${operation_a[0]}" ]; then \
    			tftp ${tftp_server} <<-EOT &
    			binary
    			get ${image}
    			EOT
    			gzip -c -d < ${image} | dd of=${device_name}
    		elif [ "${operation}" = "${operation_a[1]}" ]; then \
    			tftp ${tftp_server} <<-EOT &
    			binary
    			put ${image}
    			EOT
    			dd if=${device_name} | gzip -c > ${image}
    		elif [ "${operation}" = "${operation_a[2]}" ]; then \
    			fdisk ${device_name}
    		fi
    		echo
    	fi

    	echo "Continuation"
    	echo
    	PS3="Continue/Exit (1-2): "
    	select new in Continue Exit; do \
    		[ -z "${new}" ] && continue
    		echo
    		echo $REPLY - $new
    		echo
    		break
    	done
    	[ "${new}" = "Exit" ] && break
    done
    exit 0

Prev | Home | Next
List of files on initrd |  | References