generic-poky/scripts/contrib/ddimage
Darren Hart 19c6c2e191 ddimage: Support Mac OS
Update the ddimage script to allow it to work on Mac OS too. The biggest
difference is sysfs vs diskutil and in the syntax of the stat command
between Mac OS and Linux, unfortunately. Workarounds using ls, cut, and
columns got really fragile really quickly. Relying on stat and switching
on uname seemed the more robust solution.

(From OE-Core rev: 8962fe11a0697348affb8a1ab95abca4995470a6)

Signed-off-by: Darren Hart <dvhart@linux.intel.com>
Cc: Koen Kooi <koen@dominion.thruhere.net>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2014-05-28 08:19:30 +01:00

105 lines
2.1 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..."
dd if="$IMAGE" of="$DEVICE" bs="$BLOCKSIZE"
sync