x86: use PARTUUID instead explicitly specifying the device by default

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
owl
Jo-Philipp Wich 2015-03-24 10:08:12 +00:00
parent 5d9eeab64a
commit 02e2548b84
5 changed files with 57 additions and 42 deletions

View File

@ -267,8 +267,6 @@ menu "Target Images"
config TARGET_ROOTFS_PARTNAME config TARGET_ROOTFS_PARTNAME
string "Root partition on target device" string "Root partition on target device"
depends on OLPC_BOOTSCRIPT_IMAGES || GRUB_IMAGES 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 help
Override the root partition on the final device. If left empty, Override the root partition on the final device. If left empty,
it will be mounted by PARTUUID which makes the kernel find the it will be mounted by PARTUUID which makes the kernel find the

View 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 . /lib/upgrade/platform.sh
local rootfstype
rootfstype="$(awk 'BEGIN { RS=" "; FS="="; } ($1 == "rootfstype") { print $2 }' < /proc/cmdline)" if platform_export_bootpart; then
case "$rootfstype" in mount -t ext4 -o rw,noatime "$BOOTPART" /mnt
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
mount -t ext4 -o rw,noatime "${rootfsdev%[0-9]}1" /mnt
mv -f /mnt/sysupgrade.tgz / mv -f /mnt/sysupgrade.tgz /
umount /mnt umount /mnt
fi
} }
boot_hook_add preinit_mount_root move_config boot_hook_add preinit_mount_root move_config

View File

@ -1,16 +1,38 @@
x86_get_rootfs() { platform_export_bootpart() {
local rootfsdev local cmdline uuid disk
local rootfstype
rootfstype="$(awk 'BEGIN { RS=" "; FS="="; } ($1 == "rootfstype") { print $2 }' < /proc/cmdline)" if read cmdline < /proc/cmdline; then
case "$rootfstype" in case "$cmdline" in
squashfs|jffs2) *block2mtd=*)
rootfsdev="$(awk 'BEGIN { RS=" "; FS="="; } ($1 == "block2mtd.block2mtd") { print substr($2,1,index($2, ",")-1) }' < /proc/cmdline)";; disk="${cmdline##*block2mtd=}"
ext4) disk="${disk%%,*}"
rootfsdev="$(awk 'BEGIN { RS=" "; FS="="; } ($1 == "root") { print $2 }' < /proc/cmdline)";; ;;
*root=*)
disk="${cmdline##*root=}"
disk="${disk%% *}"
;;
esac esac
echo "$rootfstype:$rootfsdev" 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)" if [ -b "$BOOTPART" ]; then
local rootfsdev="${rootfs##*:}" mount -t ext4 -o rw,noatime "$BOOTPART" /mnt
mount -t ext4 -o rw,noatime "${rootfsdev%[0-9]}1" /mnt
cp -af "$CONF_TAR" /mnt/ cp -af "$CONF_TAR" /mnt/
umount /mnt umount /mnt
fi
} }
platform_do_upgrade() { platform_do_upgrade() {
local rootfs="$(x86_get_rootfs)" platform_export_bootpart
local rootfsdev="${rootfs##*:}"
if [ -b "${BOOTPART%[0-9]}" ]; then
sync sync
[ -b ${rootfsdev%[0-9]} ] && get_image "$@" | dd of=${rootfsdev%[0-9]} bs=4096 conv=fsync get_image "$@" | dd of="${BOOTPART%[0-9]}" bs=4096 conv=fsync
sleep 1 sleep 1
fi
} }

View File

@ -40,7 +40,9 @@ ifneq ($(GRUB_TERMINALS),)
GRUB_TERMINAL_CONFIG := terminal_input $(GRUB_TERMINALS); terminal_output $(GRUB_TERMINALS) GRUB_TERMINAL_CONFIG := terminal_input $(GRUB_TERMINALS); terminal_output $(GRUB_TERMINALS)
endif 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#@CMDLINE@#$(strip $(call Image/cmdline/$(1)) $(BOOTOPTS) $(GRUB_CONSOLE_CMDLINE))#g' \
-e 's#@TIMEOUT@#$(GRUB_TIMEOUT)#g' \ -e 's#@TIMEOUT@#$(GRUB_TIMEOUT)#g' \
./grub.cfg > $(KDIR)/root.grub/boot/grub/grub.cfg ./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 \ $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img \
$(CONFIG_TARGET_KERNEL_PARTSIZE) $(KDIR)/root.grub \ $(CONFIG_TARGET_KERNEL_PARTSIZE) $(KDIR)/root.grub \
$(CONFIG_TARGET_ROOTFS_PARTSIZE) $(KDIR)/root.$(1) \ $(CONFIG_TARGET_ROOTFS_PARTSIZE) $(KDIR)/root.$(1) \

View File

@ -20,7 +20,7 @@ sect=63
cyl=$(( ($KERNELSIZE + $ROOTFSSIZE) * 1024 * 1024 / ($head * $sect * 512))) cyl=$(( ($KERNELSIZE + $ROOTFSSIZE) * 1024 * 1024 / ($head * $sect * 512)))
# create partition table # 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))" KERNELOFFSET="$(($1 / 512))"
KERNELSIZE="$(($2 / 512))" KERNELSIZE="$(($2 / 512))"