All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jonathan Liu <net147@gmail.com>
To: openembedded-core@lists.openembedded.org
Subject: [PATCH v3] boot-directdisk: mount root by MBR disk signature for Linux 3.8+
Date: Wed, 10 Jul 2013 00:12:41 +1000	[thread overview]
Message-ID: <1373379161-25047-1-git-send-email-net147@gmail.com> (raw)

The root device is currently set as /dev/hda2. However, this is
only correct if it's the first IDE drive. If booting off the first SATA
drive instead, it would be /dev/sda2. It's not the first drive, neither
/dev/hda2 or /dev/sda2 would be correct.

The solution to this has typically been to use the filesystem UUID to
specify the root device but this requires extra support in the initrd.
Linux 3.8 introduces the ability to specify the root device using the
MBR disk signature and the partition number which is much simpler to
use and avoids the extra overhead of an initrd.

This change uses the MBR disk signature to specify the root device when
using Linux 3.8+ and CONFIG_BLOCK (required for root=PARTUUID=)
is enabled in the kernel.

This has been tested with QEMU x86 and Intel Desktop Board D2500HN using
an image recipe inheriting boot-directdisk and core-image.

Signed-off-by: Jonathan Liu <net147@gmail.com>
---
 meta/classes/boot-directdisk.bbclass | 30 +++++++++++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)

diff --git a/meta/classes/boot-directdisk.bbclass b/meta/classes/boot-directdisk.bbclass
index efeadab..f97060f 100644
--- a/meta/classes/boot-directdisk.bbclass
+++ b/meta/classes/boot-directdisk.bbclass
@@ -35,7 +35,9 @@ BOOTDD_EXTRA_SPACE ?= "16384"
 # Get the build_syslinux_cfg() function from the syslinux class
 
 AUTO_SYSLINUXCFG = "1"
-SYSLINUX_ROOT ?= "root=/dev/sda2"
+SYSLINUX_FIXED_ROOT = "root=/dev/sda2"
+SYSLINUX_UUID_ROOT = "root=PARTUUID=${DISK_SIGNATURE}-02"
+SYSLINUX_ROOT ?= "${@'${SYSLINUX_UUID_ROOT}' if has_kernel_mbr_partuuid_support(d) else '${SYSLINUX_FIXED_ROOT}'}"
 SYSLINUX_TIMEOUT ?= "10"
 
 inherit syslinux
@@ -98,6 +100,10 @@ build_boot_dd() {
 	parted $IMAGE set 1 boot on 
 	parted $IMAGE print
 
+	# Disk signature generated by parted isn't really random, so use our own generated signature
+	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
@@ -113,4 +119,26 @@ python do_bootdirectdisk() {
     bb.build.exec_func('build_boot_dd', d)
 }
 
+def generate_disk_signature():
+    import uuid
+    return str(uuid.uuid4())[:8]
+
+def get_kernel_version(d):
+    import subprocess
+    version_cmd = r"grep '^VERSION\s*=' '%s/Makefile' | grep -o '[0-9]*$'" % (d.getVar("STAGING_KERNEL_DIR", True))
+    version = int(subprocess.Popen(version_cmd, shell=True, stdout=subprocess.PIPE).communicate()[0])
+    patchlevel_cmd = r"grep '^PATCHLEVEL\s*=' '%s/Makefile' | grep -o '[0-9]*$'" % (d.getVar("STAGING_KERNEL_DIR", True))
+    patchlevel = int(subprocess.Popen(patchlevel_cmd, shell=True, stdout=subprocess.PIPE).communicate()[0])
+    return (version, patchlevel)
+
+def has_kernel_config_option(option, d):
+    import subprocess
+    grep_cmd = r"grep '^CONFIG_%s=y$' '%s/.config'" % (option, d.getVar("STAGING_KERNEL_DIR", True))
+    return subprocess.call(grep_cmd, shell=True, stdout=subprocess.PIPE) == 0
+
+def has_kernel_mbr_partuuid_support(d):
+    return get_kernel_version(d) >= (3, 8) and has_kernel_config_option("BLOCK", d)
+
+DISK_SIGNATURE := "${@generate_disk_signature()}"
+
 addtask bootdirectdisk before do_build
-- 
1.8.3.2



             reply	other threads:[~2013-07-09 13:57 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-09 14:12 Jonathan Liu [this message]
2013-07-09 21:48 ` [PATCH v3] boot-directdisk: mount root by MBR disk signature for Linux 3.8+ Darren Hart
2013-07-09 23:22   ` Jonathan Liu
2013-07-10  3:08   ` Jonathan Liu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1373379161-25047-1-git-send-email-net147@gmail.com \
    --to=net147@gmail.com \
    --cc=openembedded-core@lists.openembedded.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.