Skip to contentSkip to conversation

boot-directdisk: allow specifying custom MBR disk signature

PATCH In review Jonathan Liu 2 participants 2 messages Jul 10, 2013

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 boot-directdisk: allow specifying custom MBR disk signature

This introduces a DISK_SIGNATURE variable that allows controlling the 32-bit MBR disk signature. By default it is set to an automatically generated disk signature but it may by overridden in the image recipe by setting DISK_SIGNATURE to a 8 digit hex string.

This DISK_SIGNATURE variable can also be used in the image recipe to specify the root by UUID using:
SYSLINUX_ROOT = "root=PARTUUID=${DISK_SIGNATURE}-02"

Specifying the root by UUID allows the kernel to locate the root filesystem even if the device name changes (e.g. /dev/hda2, /dev/hdb2 or /dev/sdb2 instead of /dev/sda2) due to differences in hardware configuration.

---
 meta/classes/boot-directdisk.bbclass | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)
meta/classes/boot-directdisk.bbclass +20 -0
index 3169043..182957b 100644
@@ -34,6 +34,7 @@ BOOTDD_EXTRA_SPACE ?= "16384"
 # Get the build_syslinux_cfg() function from the syslinux class
 
 AUTO_SYSLINUXCFG = "1"
+DISK_SIGNATURE ?= "${DISK_SIGNATURE_GENERATED}"
 SYSLINUX_ROOT ?= "root=/dev/sda2"
 SYSLINUX_TIMEOUT ?= "10"
 
@@ -80,6 +81,9 @@ build_boot_dd() {
 	parted $IMAGE set 1 boot on 
 	parted $IMAGE print
 
+	echo -ne "$(echo ${DISK_SIGNATURE} | fold -w 2 | tac | paste -sd '' | sed 's/\(..\)/\\x&/g')" | \
+		dd of=$IMAGE bs=1 seek=440 conv=notrunc
+
 	OFFSET=`expr $END2 / 512`
 	dd if=${STAGING_DATADIR}/syslinux/mbr.bin of=$IMAGE conv=notrunc
 	dd if=$HDDIMG of=$IMAGE conv=notrunc seek=1 bs=512
@@ -91,8 +95,24 @@ build_boot_dd() {
 } 
 
 python do_bootdirectdisk() {
+    validate_disk_signature(d)
     bb.build.exec_func('build_syslinux_cfg', d)
     bb.build.exec_func('build_boot_dd', d)
 }
 
+def generate_disk_signature():
+    import uuid
+
+    return str(uuid.uuid4())[:8]
+
+def validate_disk_signature(d):
+    import re
+
+    disk_signature = d.getVar("DISK_SIGNATURE", True)
+
+    if not re.match(r'^[0-9a-fA-F]{8}$', disk_signature):
+        bb.fatal("DISK_SIGNATURE '%s' must be an 8 digit hex string" % disk_signature)
+
+DISK_SIGNATURE_GENERATED := "${@generate_disk_signature()}"
+
 addtask bootdirectdisk before do_build
Signature · 1 line
1.8.3.2
Acked-by on v1 1/1
#1 lore raw

On Wed, 2013-07-10 at 13:19 +1000, Jonathan Liu wrote:

Thanks for your patience with this Jonathan.

Quoted 8 lines

This introduces a DISK_SIGNATURE variable that allows controlling the 32-bit MBR disk signature. By default it is set to an automatically generated disk signature but it may by overridden in the image recipe by setting DISK_SIGNATURE to a 8 digit hex string.

This DISK_SIGNATURE variable can also be used in the image recipe to specify the root by UUID using:
SYSLINUX_ROOT = "root=PARTUUID=${DISK_SIGNATURE}-02"

This DISK_SIGNATURE variable needs to be documented, Scott R on Cc for that.

Quoted 7 lines

Specifying the root by UUID allows the kernel to locate the root filesystem even if the device name changes (e.g. /dev/hda2, /dev/hdb2 or /dev/sdb2 instead of /dev/sda2) due to differences in hardware configuration.

In the future, please Cc the people you are collaborating with and use a tool like git send-email to automatically parse that and Cc them on the patch submission. You can also use the create-pull-request and send-pull-request scripts which automate this process (these should probably be updated to allow for just sending the email without a pull repo though):

Cc Darren Hart <[email protected]>

Then they will respond with their review:

Quoted 51 lines
---
 meta/classes/boot-directdisk.bbclass | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)
meta/classes/boot-directdisk.bbclass +20 -0
index 3169043..182957b 100644
@@ -34,6 +34,7 @@ BOOTDD_EXTRA_SPACE ?= "16384"
 # Get the build_syslinux_cfg() function from the syslinux class
 
 AUTO_SYSLINUXCFG = "1"
+DISK_SIGNATURE ?= "${DISK_SIGNATURE_GENERATED}"
 SYSLINUX_ROOT ?= "root=/dev/sda2"
 SYSLINUX_TIMEOUT ?= "10"
 
@@ -80,6 +81,9 @@ build_boot_dd() {
 	parted $IMAGE set 1 boot on 
 	parted $IMAGE print
 
+	echo -ne "$(echo ${DISK_SIGNATURE} | fold -w 2 | tac | paste -sd '' | sed 's/\(..\)/\\x&/g')" | \
+		dd of=$IMAGE bs=1 seek=440 conv=notrunc
+
 	OFFSET=`expr $END2 / 512`
 	dd if=${STAGING_DATADIR}/syslinux/mbr.bin of=$IMAGE conv=notrunc
 	dd if=$HDDIMG of=$IMAGE conv=notrunc seek=1 bs=512
@@ -91,8 +95,24 @@ build_boot_dd() {
 } 
 
 python do_bootdirectdisk() {
+    validate_disk_signature(d)
     bb.build.exec_func('build_syslinux_cfg', d)
     bb.build.exec_func('build_boot_dd', d)
 }
 
+def generate_disk_signature():
+    import uuid
+
+    return str(uuid.uuid4())[:8]
+
+def validate_disk_signature(d):
+    import re
+
+    disk_signature = d.getVar("DISK_SIGNATURE", True)
+
+    if not re.match(r'^[0-9a-fA-F]{8}$', disk_signature):
+        bb.fatal("DISK_SIGNATURE '%s' must be an 8 digit hex string" % disk_signature)
+
+DISK_SIGNATURE_GENERATED := "${@generate_disk_signature()}"
+
 addtask bootdirectdisk before do_build
Signature · 3 lines
Darren Hart
Intel Open Source Technology Center
Yocto Project - Technical Lead - Linux Kernel