ddimage: Add script for writing images to boot media

Fixes [YOCTO #1806]

Standard practice is to use the Linux "dd" command to write images to boot
media. This can be error prone and the results of sloppy usage can be
disastrous. Locating the device you want to use is a clumsy process, especially
on a headless build system.

The ddimage script does the following:

o Check the image and device exist
o Check the device is writable
o Compare the device to a blacklist and abort if it's listed
  Blacklist defaults to "/dev/sda"
o Display useful identifying information about the image and device
o Prompt the user before commencing the write

The output looks something like this:

$ sudo ~/bin/ddimage tmp/deploy/images/core-image-sato-fri2-noemgd.hddimg /dev/sdk
Image details
=============
    image: `tmp/deploy/images/core-image-sato-fri2-noemgd.hddimg' -> `core-image-sato-fri2-noemgd-20111202214038.hddimg'
     size: 318568448 bytes
 modified: 2011-12-02 13:45:05.298897861 -0800
     type: x86 boot sector, code offset 0x58, OEM-ID "SYSLINUX", sectors/cluster 16, root entries 512, Media descriptor 0xf8, sectors/FAT 152, heads 64, hidden sectors 32, sectors 622204 (volumes > 32 MB) , serial number 0x4ed946e0, label: "boot       ", FAT (16 bit)

Device details
==============
  device: /dev/sdk
  vendor: Kingston
   model: DT 101 G2

Write tmp/deploy/images/core-image-sato-fri2-noemgd.hddimg to /dev/sdk [y/N]? y
Writing image...
303+1 records in
303+1 records out
318568448 bytes (319 MB) copied, 53.6766 s, 5.9 MB/s

(From OE-Core rev: 87e581bb7da9f1530d190cd023fcf892c8b858f5)

Signed-off-by: Darren Hart <dvhart@linux.intel.com>
CC: Dexuan Cui <dexuan.cui@intel.com>
CC: Joshua Lock <josh@linux.intel.com>
CC: Kishore K Bodke <kishore.k.bodke@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Darren Hart 2012-03-13 12:02:51 -07:00 committed by Richard Purdie
parent 77106395e1
commit af193ae15a
1 changed files with 87 additions and 0 deletions

87
scripts/contrib/ddimage Executable file
View File

@ -0,0 +1,87 @@
#!/bin/sh
#BLACKLIST_DEVICES="/dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde"
BLACKLIST_DEVICES="/dev/sda"
# 1MB blocksize
BLOCKSIZE=1048576
function usage() {
echo "Usage: $(basename $0) IMAGE DEVICE"
}
function image_details() {
IMG=$1
echo "Image details"
echo "============="
echo " image: $(stat --printf '%N\n' $IMG)"
echo " size: $(stat -L --printf '%s bytes\n' $IMG)"
echo " modified: $(stat -L --printf '%y\n' $IMG)"
echo " type: $(file -L -b $IMG)"
echo ""
}
function device_details() {
DEV=$1
BLOCK_SIZE=512
echo "Device details"
echo "=============="
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
if [ "${BLACKLIST_DEVICES/${DEVICE}/ERROR}" != "$BLACKLIST_DEVICES" ]; then
echo "ERROR: Device $DEVICE is blacklisted"
exit 1
fi
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)
echo -n "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