x86: use PARTUUID instead explicitly specifying the device by default
authorJo-Philipp Wich <jow@openwrt.org>
Tue, 24 Mar 2015 10:08:12 +0000 (10:08 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Tue, 24 Mar 2015 10:08:12 +0000 (10:08 +0000)
This changes the x86 image generation to match x86_64, using the PARTUUID for
the rootfs instead of explicitly configuring the device.

It unbreaks KVM with VirtIO, which uses /dev/vda2 instead of /dev/sda2.

Tested in QEMU/KVM with VirtIO, VirtualBox and VMware.

Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
SVN-Revision: 44966

config/Config-images.in
target/linux/x86/base-files/lib/preinit/79_move_config
target/linux/x86/base-files/lib/upgrade/platform.sh
target/linux/x86/image/Makefile
target/linux/x86/image/gen_image_generic.sh

index 5c2e79e41e4f8940c83b1ceec211fe2c32ed1f40..a420c39a90af7577a3a85521be69229527319c45 100644 (file)
@@ -267,8 +267,6 @@ menu "Target Images"
        config TARGET_ROOTFS_PARTNAME
                string "Root partition on target device"
                depends on OLPC_BOOTSCRIPT_IMAGES || GRUB_IMAGES
        config TARGET_ROOTFS_PARTNAME
                string "Root partition on target device"
                depends on OLPC_BOOTSCRIPT_IMAGES || GRUB_IMAGES
-               default "/dev/xvda2" if TARGET_x86_xen_domu
-               default "/dev/sda2" if TARGET_x86 && ! TARGET_x86_xen_domu
                help
                  Override the root partition on the final device. If left empty,
                  it will be mounted by PARTUUID which makes the kernel find the
                help
                  Override the root partition on the final device. If left empty,
                  it will be mounted by PARTUUID which makes the kernel find the
index 0bffbab994befdd9ec7b81f24b9a2cdf2e6ec1b3..1d4873d78b480cb3f11e04e6246559417b431a8a 100644 (file)
@@ -1,21 +1,14 @@
 #!/bin/sh
 #!/bin/sh
-# Copyright (C) 2012 OpenWrt.org
+# Copyright (C) 2012-2015 OpenWrt.org
 
 move_config() {
 
 move_config() {
-       local rootfsdev
-       local rootfstype
-       
-       rootfstype="$(awk 'BEGIN { RS=" "; FS="="; } ($1 == "rootfstype") { print $2 }' < /proc/cmdline)"
-       case "$rootfstype" in
-               squashfs|jffs2)
-                       rootfsdev="$(awk 'BEGIN { RS=" "; FS="="; } ($1 == "block2mtd.block2mtd") { print substr($2,1,index($2, ",")-1) }' < /proc/cmdline)";;
-               ext4)
-                       rootfsdev="$(awk 'BEGIN { RS=" "; FS="="; } ($1 == "root") { print $2 }' < /proc/cmdline)";;
-       esac
+       . /lib/upgrade/platform.sh
 
 
-       mount -t ext4 -o rw,noatime "${rootfsdev%[0-9]}1" /mnt
-       mv -f /mnt/sysupgrade.tgz /
-       umount /mnt
+       if platform_export_bootpart; then
+               mount -t ext4 -o rw,noatime "$BOOTPART" /mnt
+               mv -f /mnt/sysupgrade.tgz /
+               umount /mnt
+       fi
 }
 
 boot_hook_add preinit_mount_root move_config
 }
 
 boot_hook_add preinit_mount_root move_config
index a2dd20a8810902661f54623fb6a55d7b4e6e07ff..73ab5ef0794c942495d18865fa2c2498b84e63e6 100644 (file)
@@ -1,16 +1,38 @@
-x86_get_rootfs() {
-       local rootfsdev
-       local rootfstype
-       
-       rootfstype="$(awk 'BEGIN { RS=" "; FS="="; } ($1 == "rootfstype") { print $2 }' < /proc/cmdline)"
-       case "$rootfstype" in
-               squashfs|jffs2)
-                       rootfsdev="$(awk 'BEGIN { RS=" "; FS="="; } ($1 == "block2mtd.block2mtd") { print substr($2,1,index($2, ",")-1) }' < /proc/cmdline)";;
-               ext4)
-                       rootfsdev="$(awk 'BEGIN { RS=" "; FS="="; } ($1 == "root") { print $2 }' < /proc/cmdline)";;
-       esac
-               
-       echo "$rootfstype:$rootfsdev"
+platform_export_bootpart() {
+       local cmdline uuid disk
+
+       if read cmdline < /proc/cmdline; then
+               case "$cmdline" in
+                       *block2mtd=*)
+                               disk="${cmdline##*block2mtd=}"
+                               disk="${disk%%,*}"
+                       ;;
+                       *root=*)
+                               disk="${cmdline##*root=}"
+                               disk="${disk%% *}"
+                       ;;
+               esac
+
+               case "$disk" in
+                       PARTUUID=[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]-02)
+                               uuid="${disk#PARTUUID=}"
+                               uuid="${uuid%-02}"
+                               for disk in /dev/[hsv]d[a-z]; do
+                                       set -- $(dd if=$disk bs=1 skip=440 count=4 2>/dev/null | hexdump -v -e '4/1 "%02x "')
+                                       if [ "$4$3$2$1" = "$uuid" ]; then
+                                               export BOOTPART="${disk}1"
+                                               return 0
+                                       fi
+                               done
+                       ;;
+                       /dev/*)
+                               export BOOTPART="${disk%[0-9]}1"
+                               return 0
+                       ;;
+               esac
+       fi
+
+       return 1
 }
 
 platform_check_image() {
 }
 
 platform_check_image() {
@@ -26,19 +48,19 @@ platform_check_image() {
 }
 
 platform_copy_config() {
 }
 
 platform_copy_config() {
-       local rootfs="$(x86_get_rootfs)"
-       local rootfsdev="${rootfs##*:}"
-       
-       mount -t ext4 -o rw,noatime "${rootfsdev%[0-9]}1" /mnt
-       cp -af "$CONF_TAR" /mnt/
-       umount /mnt
+       if [ -b "$BOOTPART" ]; then
+               mount -t ext4 -o rw,noatime "$BOOTPART" /mnt
+               cp -af "$CONF_TAR" /mnt/
+               umount /mnt
+       fi
 }
 
 platform_do_upgrade() {
 }
 
 platform_do_upgrade() {
-       local rootfs="$(x86_get_rootfs)"
-       local rootfsdev="${rootfs##*:}"
+       platform_export_bootpart
 
 
-       sync
-       [ -b ${rootfsdev%[0-9]} ] && get_image "$@" | dd of=${rootfsdev%[0-9]} bs=4096 conv=fsync
-       sleep 1
+       if [ -b "${BOOTPART%[0-9]}" ]; then
+               sync
+               get_image "$@" | dd of="${BOOTPART%[0-9]}" bs=4096 conv=fsync
+               sleep 1
+       fi
 }
 }
index 9e40803aa72685682a91130807707c5528aa8ef0..85460206c03326373a3598c5c1aab69f24c5875a 100644 (file)
@@ -40,7 +40,9 @@ ifneq ($(GRUB_TERMINALS),)
   GRUB_TERMINAL_CONFIG := terminal_input $(GRUB_TERMINALS); terminal_output $(GRUB_TERMINALS)
 endif
 
   GRUB_TERMINAL_CONFIG := terminal_input $(GRUB_TERMINALS); terminal_output $(GRUB_TERMINALS)
 endif
 
+SIGNATURE:=$(shell dd if=/dev/urandom bs=4 count=1 2>/dev/null | hexdump -v -e '"%08x"')
 ROOTPART:=$(call qstrip,$(CONFIG_TARGET_ROOTFS_PARTNAME))
 ROOTPART:=$(call qstrip,$(CONFIG_TARGET_ROOTFS_PARTNAME))
+ROOTPART:=$(if $(ROOTPART),$(ROOTPART),PARTUUID=$(SIGNATURE)-02)
 
 GRUB_TIMEOUT:=$(call qstrip,$(CONFIG_GRUB_TIMEOUT))
 
 
 GRUB_TIMEOUT:=$(call qstrip,$(CONFIG_GRUB_TIMEOUT))
 
@@ -82,7 +84,7 @@ ifneq ($(CONFIG_GRUB_IMAGES),)
                -e 's#@CMDLINE@#$(strip $(call Image/cmdline/$(1)) $(BOOTOPTS) $(GRUB_CONSOLE_CMDLINE))#g' \
                -e 's#@TIMEOUT@#$(GRUB_TIMEOUT)#g' \
                ./grub.cfg > $(KDIR)/root.grub/boot/grub/grub.cfg
                -e 's#@CMDLINE@#$(strip $(call Image/cmdline/$(1)) $(BOOTOPTS) $(GRUB_CONSOLE_CMDLINE))#g' \
                -e 's#@TIMEOUT@#$(GRUB_TIMEOUT)#g' \
                ./grub.cfg > $(KDIR)/root.grub/boot/grub/grub.cfg
-       PADDING="$(CONFIG_TARGET_IMAGES_PAD)" PATH="$(TARGET_PATH)" ./gen_image_generic.sh \
+       PADDING="$(CONFIG_TARGET_IMAGES_PAD)" SIGNATURE="$(SIGNATURE)" PATH="$(TARGET_PATH)" ./gen_image_generic.sh \
                $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img \
                $(CONFIG_TARGET_KERNEL_PARTSIZE) $(KDIR)/root.grub \
                $(CONFIG_TARGET_ROOTFS_PARTSIZE) $(KDIR)/root.$(1) \
                $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img \
                $(CONFIG_TARGET_KERNEL_PARTSIZE) $(KDIR)/root.grub \
                $(CONFIG_TARGET_ROOTFS_PARTSIZE) $(KDIR)/root.$(1) \
index 9d11efbb05ed209d946bdcfdaa009e6777b53c5b..3fb31f6e40c7ef2a9859a2a779527bf5e33037d9 100755 (executable)
@@ -20,7 +20,7 @@ sect=63
 cyl=$(( ($KERNELSIZE + $ROOTFSSIZE) * 1024 * 1024 / ($head * $sect * 512)))
 
 # create partition table
 cyl=$(( ($KERNELSIZE + $ROOTFSSIZE) * 1024 * 1024 / ($head * $sect * 512)))
 
 # create partition table
-set `ptgen -o "$OUTPUT" -h $head -s $sect -p ${KERNELSIZE}m -p ${ROOTFSSIZE}m ${ALIGN:+-l $ALIGN}`
+set `ptgen -o "$OUTPUT" -h $head -s $sect -p ${KERNELSIZE}m -p ${ROOTFSSIZE}m ${ALIGN:+-l $ALIGN} ${SIGNATURE:+-S 0x$SIGNATURE}`
 
 KERNELOFFSET="$(($1 / 512))"
 KERNELSIZE="$(($2 / 512))"
 
 KERNELOFFSET="$(($1 / 512))"
 KERNELSIZE="$(($2 / 512))"