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
This commit is contained in:
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)"
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
mount -t ext4 -o rw,noatime "${rootfsdev%[0-9]}1" /mnt if platform_export_bootpart; then
mv -f /mnt/sysupgrade.tgz / mount -t ext4 -o rw,noatime "$BOOTPART" /mnt
umount /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

View file

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