aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/x86/base-files/lib
diff options
context:
space:
mode:
author李国 <uxgood.org@gmail.com>2020-03-26 14:05:33 +0800
committerPetr Štetiar <ynezz@true.cz>2020-03-31 16:20:47 +0200
commita6b7c3e672764858fd294998406ae791f5964b4a (patch)
tree9174e7c3b9338a87b700cbd6e266f975361de1fb /target/linux/x86/base-files/lib
parentd9228514ccecfb9d1500e3a82470f66f2ea41a39 (diff)
downloadupstream-a6b7c3e672764858fd294998406ae791f5964b4a.tar.gz
upstream-a6b7c3e672764858fd294998406ae791f5964b4a.tar.bz2
upstream-a6b7c3e672764858fd294998406ae791f5964b4a.zip
x86: generate EFI platform bootable images
Add EFI platform bootable images for x86 platforms. These images can also boot from legacy BIOS platform. EFI System Partition need to be fat12/fat16/fat32 (not need to load filesystem drivers), so the first partition of EFI images are not ext4 filesystem any more. GPT partition table has an alternate partition table, we did not generate it. This may cause problems when use these images as qemu disk (kernel can not find rootfs), we pad enough sectors will be ok. Signed-off-by: 李国 <uxgood.org@gmail.com> [part_magic_* refactoring, removed genisoimage checks] Signed-off-by: Petr Štetiar <ynezz@true.cz>
Diffstat (limited to 'target/linux/x86/base-files/lib')
-rw-r--r--target/linux/x86/base-files/lib/preinit/79_move_config5
-rw-r--r--target/linux/x86/base-files/lib/preinit/81_upgrade_bootloader1
-rw-r--r--target/linux/x86/base-files/lib/upgrade/platform.sh27
3 files changed, 24 insertions, 9 deletions
diff --git a/target/linux/x86/base-files/lib/preinit/79_move_config b/target/linux/x86/base-files/lib/preinit/79_move_config
index 702da9e873..338398c947 100644
--- a/target/linux/x86/base-files/lib/preinit/79_move_config
+++ b/target/linux/x86/base-files/lib/preinit/79_move_config
@@ -2,13 +2,14 @@
# Copyright (C) 2012-2015 OpenWrt.org
move_config() {
- local partdev
+ local partdev parttype=ext4
. /lib/upgrade/common.sh
if export_bootdevice && export_partdevice partdev 1; then
mkdir -p /boot
- mount -t ext4 -o rw,noatime "/dev/$partdev" /boot
+ part_magic_fat "/dev/$partdev" && parttype=vfat
+ mount -t $parttype -o rw,noatime "/dev/$partdev" /boot
if [ -f "/boot/$BACKUP_FILE" ]; then
mv -f "/boot/$BACKUP_FILE" /
fi
diff --git a/target/linux/x86/base-files/lib/preinit/81_upgrade_bootloader b/target/linux/x86/base-files/lib/preinit/81_upgrade_bootloader
index 3a4e756b1e..1379c9b2cb 100644
--- a/target/linux/x86/base-files/lib/preinit/81_upgrade_bootloader
+++ b/target/linux/x86/base-files/lib/preinit/81_upgrade_bootloader
@@ -6,6 +6,7 @@ upgrade_bootloader() {
. /lib/upgrade/common.sh
if [ ! -f /boot/grub/upgraded ] && export_bootdevice && export_partdevice diskdev 0; then
+ part_magic_efi "/dev/$diskdev" && return 0
echo "(hd0) /dev/$diskdev" > /tmp/device.map
/usr/sbin/grub-bios-setup \
-m "/tmp/device.map" \
diff --git a/target/linux/x86/base-files/lib/upgrade/platform.sh b/target/linux/x86/base-files/lib/upgrade/platform.sh
index 53c751861c..ee88dfb082 100644
--- a/target/linux/x86/base-files/lib/upgrade/platform.sh
+++ b/target/linux/x86/base-files/lib/upgrade/platform.sh
@@ -20,7 +20,7 @@ platform_check_image() {
get_partitions "/dev/$diskdev" bootdisk
#extract the boot sector from the image
- get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b 2>/dev/null
+ get_image "$@" | dd of=/tmp/image.bs count=63 bs=512b 2>/dev/null
get_partitions /tmp/image.bs image
@@ -37,29 +37,31 @@ platform_check_image() {
}
platform_copy_config() {
- local partdev
+ local partdev parttype=ext4
if export_partdevice partdev 1; then
- mount -t ext4 -o rw,noatime "/dev/$partdev" /mnt
+ part_magic_fat "/dev/$partdev" && parttype=vfat
+ mount -t $parttype -o rw,noatime "/dev/$partdev" /mnt
cp -af "$UPGRADE_BACKUP" "/mnt/$BACKUP_FILE"
umount /mnt
fi
}
platform_do_bootloader_upgrade() {
- local bootpart
+ local bootpart parttable=msdos
local diskdev="$1"
if export_partdevice bootpart 1; then
mkdir -p /tmp/boot
mount -o rw,noatime "/dev/$bootpart" /tmp/boot
echo "(hd0) /dev/$diskdev" > /tmp/device.map
+ part_magic_efi "/dev/$diskdev" && parttable=gpt
echo "Upgrading bootloader on /dev/$diskdev..."
grub-bios-setup \
-m "/tmp/device.map" \
-d "/tmp/boot/boot/grub" \
- -r "hd0,msdos1" \
+ -r "hd0,${parttable}1" \
"/dev/$diskdev" \
&& touch /boot/grub/upgraded
@@ -81,7 +83,7 @@ platform_do_upgrade() {
get_partitions "/dev/$diskdev" bootdisk
#extract the boot sector from the image
- get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b
+ get_image "$@" | dd of=/tmp/image.bs count=63 bs=512b >/dev/null
get_partitions /tmp/image.bs image
@@ -106,7 +108,7 @@ platform_do_upgrade() {
while read part start size; do
if export_partdevice partdev $part; then
echo "Writing image to /dev/$partdev..."
- get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M skip="$start" count="$size" conv=fsync
+ get_image "$@" | dd of="/dev/$partdev" ibs=512 obs=1M skip="$start" count="$size" conv=fsync
else
echo "Unable to find partition $part device, skipped."
fi
@@ -117,4 +119,15 @@ platform_do_upgrade() {
get_image "$@" | dd of="/dev/$diskdev" bs=1 skip=440 count=4 seek=440 conv=fsync
platform_do_bootloader_upgrade "$diskdev"
+ local parttype=ext4
+ part_magic_efi "/dev/$diskdev" || return 0
+
+ if export_partdevice partdev 1; then
+ part_magic_fat "/dev/$partdev" && parttype=vfat
+ mount -t $parttype -o rw,noatime "/dev/$partdev" /mnt
+ set -- $(dd if="/dev/$diskdev" bs=1 skip=1168 count=16 2>/dev/null | hexdump -v -e '8/1 "%02x "" "2/1 "%02x""-"6/1 "%02x"')
+ sed -i "s/\(PARTUUID=\)[a-f0-9-]\+/\1$4$3$2$1-$6$5-$8$7-$9/ig" /mnt/boot/grub/grub.cfg
+ umount /mnt
+ fi
+
}