Skip to contentSkip to conversation

ddimage: Add script for writing images to boot media

PATCH In review Darren Hart 2 participants 6 messages Mar 13, 2012 – Mar 22, 2012

lore
Share & tools
lore
#0 lore raw

cover ddimage: Add script for writing images to boot media

The following changes since commit 19d4e0c98046d434a02653864215c4fcffabc919:

linux-yocto/meta-yocto: v3.2.9, v3.0.23 + fixes and updates (2012-03-13 16:53:47 +0000)

are available in the git repository at:
git://git.pokylinux.org/poky-contrib dvhart/bug1806
http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=dvhart/bug1806

Darren Hart (1):
ddimage: Add script for writing images to boot media

 scripts/contrib/ddimage |   87 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 87 insertions(+), 0 deletions(-)
 create mode 100755 scripts/contrib/ddimage
Signature · 1 line
1.7.6.5
#1 lore raw

PATCH 1/1 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

CC Dexuan Cui <[email protected]>
CC Joshua Lock <[email protected]>
CC Kishore K Bodke <[email protected]>
---
 scripts/contrib/ddimage |   87 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 87 insertions(+), 0 deletions(-)
 create mode 100755 scripts/contrib/ddimage
scripts/contrib/ddimage new file +87 -0
new file mode 100755
index 0000000..2cba9b2
@@ -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
Signature · 1 line
1.7.6.5
#2 lore raw

Any objections to this going in?

Quoted 140 lines · Darren Hart

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

CC Dexuan Cui <[email protected]>
CC Joshua Lock <[email protected]>
CC Kishore K Bodke <[email protected]>
---
 scripts/contrib/ddimage |   87 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 87 insertions(+), 0 deletions(-)
 create mode 100755 scripts/contrib/ddimage
scripts/contrib/ddimage new file +87 -0
new file mode 100755
index 0000000..2cba9b2
@@ -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
Signature · 3 lines
Darren Hart
Intel Open Source Technology Center
Yocto Project - Linux Kernel
#3 lore raw
Quoted 1 line · On Wednesday 21 March 2012 16:06:14 Darren Hart wrote:

Any objections to this going in?

No objections, looks like a really useful tool; a couple of suggestions though (sorry for not looking at it earlier):

* Is it worth checking if the target device is mounted and erroring out if so?
* Not sure but it may be worth waiting a few seconds after the sync before exiting; I've seen some hardware that returns control to userspace before the hardware has actually finished writing.

Cheers,
Paul

Signature · 2 lines
Paul Eggleton
Intel Open Source Technology Centre
#4 lore raw
Quoted 7 lines · Paul Eggleton
Quoted 1 line · On Wednesday 21 March 2012 16:06:14 Darren Hart wrote:

Any objections to this going in?

No objections, looks like a really useful tool; a couple of suggestions though (sorry for not looking at it earlier):

* Is it worth checking if the target device is mounted and erroring out if so?

That's a good suggestion. Alright with you if that is a follow-on patch?

Quoted 3 lines

* Not sure but it may be worth waiting a few seconds after the sync before exiting; I've seen some hardware that returns control to userspace before the hardware has actually finished writing.

That may be, but anything we assume will be wrong for some hardware. The sticks I have flash an LED for a few seconds afterwards, indicating writing.

Signature · 3 lines
Darren Hart
Intel Open Source Technology Center
Yocto Project - Linux Kernel
#5 lore raw
Quoted 10 lines · On Thursday 22 March 2012 08:56:08 Darren Hart wrote:
Quoted 8 lines · Paul Eggleton
Quoted 1 line · On Wednesday 21 March 2012 16:06:14 Darren Hart wrote:

Any objections to this going in?

No objections, looks like a really useful tool; a couple of suggestions though (sorry for not looking at it earlier):

* Is it worth checking if the target device is mounted and erroring out if so?

That's a good suggestion. Alright with you if that is a follow-on patch?

Sure, sounds fine to me.

Quoted 6 lines
Quoted 3 lines

* Not sure but it may be worth waiting a few seconds after the sync before exiting; I've seen some hardware that returns control to userspace before the hardware has actually finished writing.

That may be, but anything we assume will be wrong for some hardware. The sticks I have flash an LED for a few seconds afterwards, indicating writing.

Many do, yes. I guess it was just a simple idea to avoid potential issues particularly for those that don't have an LED.

Cheers,
Paul

Signature · 2 lines
Paul Eggleton
Intel Open Source Technology Centre