109 lines
2.2 KiB
Bash
Executable File
109 lines
2.2 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# Default to avoiding the first two disks on typical Linux and Mac OS installs
|
|
# Better safe than sorry :-)
|
|
BLACKLIST_DEVICES="/dev/sda /dev/sdb /dev/disk1 /dev/disk2"
|
|
|
|
# 1MB blocksize
|
|
BLOCKSIZE=1048576
|
|
|
|
usage() {
|
|
echo "Usage: $(basename $0) IMAGE DEVICE"
|
|
}
|
|
|
|
image_details() {
|
|
IMG=$1
|
|
echo "Image details"
|
|
echo "============="
|
|
echo " image: $(basename $IMG)"
|
|
# stat format is different on Mac OS and Linux
|
|
if [ "$(uname)" = "Darwin" ]; then
|
|
echo " size: $(stat -L -f '%z bytes' $IMG)"
|
|
echo " modified: $(stat -L -f '%Sm' $IMG)"
|
|
else
|
|
echo " size: $(stat -L -c '%s bytes' $IMG)"
|
|
echo " modified: $(stat -L -c '%y' $IMG)"
|
|
fi
|
|
echo " type: $(file -L -b $IMG)"
|
|
echo ""
|
|
}
|
|
|
|
device_details() {
|
|
DEV=$1
|
|
BLOCK_SIZE=512
|
|
|
|
echo "Device details"
|
|
echo "=============="
|
|
|
|
# Collect disk info using diskutil on Mac OS
|
|
if [ "$(uname)" = "Darwin" ]; then
|
|
diskutil info $DEVICE | egrep "(Device Node|Media Name|Total Size)"
|
|
return
|
|
fi
|
|
|
|
# Default / Linux information collection
|
|
echo " device: $DEVICE"
|
|
if [ -f "/sys/class/block/$DEV/device/vendor" ]; then
|
|
echo " vendor: $(cat /sys/class/block/$DEV/device/vendor)"
|
|
else
|
|
echo " vendor: UNKOWN"
|
|
fi
|
|
if [ -f "/sys/class/block/$DEV/device/model" ]; then
|
|
echo " model: $(cat /sys/class/block/$DEV/device/model)"
|
|
else
|
|
echo " model: UNKNOWN"
|
|
fi
|
|
if [ -f "/sys/class/block/$DEV/size" ]; then
|
|
echo " size: $(($(cat /sys/class/block/$DEV/size) * $BLOCK_SIZE)) bytes"
|
|
else
|
|
echo " size: UNKNOWN"
|
|
fi
|
|
echo ""
|
|
}
|
|
|
|
if [ $# -ne 2 ]; then
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
IMAGE=$1
|
|
DEVICE=$2
|
|
|
|
if [ ! -e "$IMAGE" ]; then
|
|
echo "ERROR: Image $IMAGE does not exist"
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
|
|
for i in ${BLACKLIST_DEVICES}; do
|
|
if [ "$i" = "$DEVICE" ]; then
|
|
echo "ERROR: Device $DEVICE is blacklisted"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
if [ ! -w "$DEVICE" ]; then
|
|
echo "ERROR: Device $DEVICE does not exist or is not writable"
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
image_details $IMAGE
|
|
device_details $(basename $DEVICE)
|
|
|
|
printf "Write $IMAGE to $DEVICE [y/N]? "
|
|
read RESPONSE
|
|
if [ "$RESPONSE" != "y" ]; then
|
|
echo "Write aborted"
|
|
exit 0
|
|
fi
|
|
|
|
echo "Writing image..."
|
|
if which pv >/dev/null 2>&1; then
|
|
pv "$IMAGE" | dd of="$DEVICE" bs="$BLOCKSIZE"
|
|
else
|
|
dd if="$IMAGE" of="$DEVICE" bs="$BLOCKSIZE"
|
|
fi
|
|
sync
|