| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 | 
							- RAMFS_COPY_BIN='grub-bios-setup'
 
- platform_check_image() {
 
- 	local diskdev partdev diff
 
- 	[ "$#" -gt 1 ] && return 1
 
- 	case "$(get_magic_word "$1")" in
 
- 		eb48|eb63) ;;
 
- 		*)
 
- 			echo "Invalid image type"
 
- 			return 1
 
- 		;;
 
- 	esac
 
- 	export_bootdevice && export_partdevice diskdev 0 || {
 
- 		echo "Unable to determine upgrade device"
 
- 		return 1
 
- 	}
 
- 	get_partitions "/dev/$diskdev" bootdisk
 
- 	#extract the boot sector from the image
 
- 	get_image "$@" | dd of=/tmp/image.bs count=63 bs=512b 2>/dev/null
 
- 	get_partitions /tmp/image.bs image
 
- 	#compare tables
 
- 	diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
 
- 	rm -f /tmp/image.bs /tmp/partmap.bootdisk /tmp/partmap.image
 
- 	if [ -n "$diff" ]; then
 
- 		echo "Partition layout has changed. Full image will be written."
 
- 		ask_bool 0 "Abort" && exit 1
 
- 		return 0
 
- 	fi
 
- }
 
- platform_copy_config() {
 
- 	local partdev parttype=ext4
 
- 	if export_partdevice partdev 1; then
 
- 		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 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,${parttable}1" \
 
- 			"/dev/$diskdev" \
 
- 		&& touch /tmp/boot/grub/upgraded
 
- 		umount /tmp/boot
 
- 	fi
 
- }
 
- platform_do_upgrade() {
 
- 	local diskdev partdev diff
 
- 	export_bootdevice && export_partdevice diskdev 0 || {
 
- 		echo "Unable to determine upgrade device"
 
- 		return 1
 
- 	}
 
- 	sync
 
- 	if [ "$UPGRADE_OPT_SAVE_PARTITIONS" = "1" ]; then
 
- 		get_partitions "/dev/$diskdev" bootdisk
 
- 		#extract the boot sector from the image
 
- 		get_image "$@" | dd of=/tmp/image.bs count=63 bs=512b >/dev/null
 
- 		get_partitions /tmp/image.bs image
 
- 		#compare tables
 
- 		diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
 
- 	else
 
- 		diff=1
 
- 	fi
 
- 	if [ -n "$diff" ]; then
 
- 		get_image "$@" | dd of="/dev/$diskdev" bs=4096 conv=fsync
 
- 		# Separate removal and addtion is necessary; otherwise, partition 1
 
- 		# will be missing if it overlaps with the old partition 2
 
- 		partx -d - "/dev/$diskdev"
 
- 		partx -a - "/dev/$diskdev"
 
- 		return 0
 
- 	fi
 
- 	#iterate over each partition from the image and write it to the boot disk
 
- 	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
 
- 		else
 
- 			echo "Unable to find partition $part device, skipped."
 
- 		fi
 
- 	done < /tmp/partmap.image
 
- 	#copy partition uuid
 
- 	echo "Writing new UUID to /dev/$diskdev..."
 
- 	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
 
- }
 
 
  |