[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1041168: Installation of GRUB failed



On 15/07/2023 at 21:17, Christof B. wrote:
Am 15.07.23 um 21:07 schrieb Pascal Hambourg:
If you are willing to test, I can provide patched files which replace the original ones in a running d-i.

Yes, I am willing to test this. If it can be patched by replacing some files at runtime (and not compiling some binaries or images), please provide me the files with a hint at where (path) and when (at which step of the installation process) to put them into place.

Replacing /lib/partman/init.d/50efi with either attached 50efi.1 or 50efi.2 as 50efi should fix the issue in guided partitioning with encrypted LVM.

  cp <source path>/50efi.1 /lib/partman/init.d/50efi
or
  cp <source path>/50efi.2 /lib/partman/init.d/50efi

Fixing the issue in guided partitioning with unencrypted LVM also requires replacing /bin/autopartition-lvm with the attached autopartition-lvm.

  cp <source path>/autopartition-lvm /bin/autopartition-lvm

The files can be replaced after "Load installer components" and before "Partition disks".
#!/bin/sh

# This script sets method "efi" for all fat16/fat32 partitions that
# have the bootable flag set.

ARCH="$(archdetect)"

# Prod the kernel to load EFI stuff and mount the efivarfs fs if
# needed
modprobe efivarfs >/dev/null 2>&1 || true
mount -t efivarfs none /sys/firmware/efi/efivars 2>&1 || true

in_efi_mode() {
    [ -d /sys/firmware/efi ]
}

if in_efi_mode; then
	> /var/lib/partman/efi
else
	case $ARCH in
	    i386/mac|amd64/mac)
		# Intel Macs have an EFI partition, regardless of
		# whether we're currently booted using BIOS
		# compatibility or not (if we are, we won't be able to
		# talk to EFI directly).
		> /var/lib/partman/efi
		;;
	    *)
		rm -f /var/lib/partman/efi
		exit 0
		;;
	esac
fi

. /lib/partman/lib/base.sh

gpt_efi_type=c12a7328-f81f-11d2-ba4b-00a0c93ec93b
gpt_bios_boot_type=21686148-6449-6e6f-744e-656564454649
msdos_efi_type=0xef

NUM_ESP=0
NUM_NOT_ESP=0

for dev in /var/lib/partman/devices/*; do
	[ -d "$dev" ] || continue
	cd $dev

	open_dialog GET_LABEL_TYPE
	read_line label_type
	close_dialog

	if [ "$label_type" = msdos ]; then
		DISK_BIOS_BOOT=yes
	else
		DISK_BIOS_BOOT=no
	fi

	NON_EFI_THIS_DISK=0
	partitions=
	open_dialog PARTITIONS
	while { read_line num id size type fs path name; [ "$id" ]; }; do
		# Build a list of partitions that:
		# 1. Will *not* be bios-bootable (e.g. ESP)
		# 2. Might be bios-bootable (~anything that's not
		#    "free space"
		if [ "$fs" = fat16 ]; then
			partitions="$partitions $id"
		elif [ "$fs" = fat32 ] && echo "$name" |
                     grep -i "^EFI System Partition" >/dev/null; then
			partitions="$partitions $id"
		elif [ "$label_type" = msdos ] && \
		     [ "$(blkid -o value -s PART_ENTRY_TYPE -p "$path" 2>/dev/null)" = "$msdos_efi_type" ]; then
			partitions="$partitions $id"
		elif [ "$label_type" = gpt ] && \
		     [ "$(blkid -o value -s PART_ENTRY_TYPE -p "$path" 2>/dev/null)" = "$gpt_efi_type" ]; then
			partitions="$partitions $id"
		elif [ "$label_type" = gpt ] && \
		     [ "$(blkid -o value -s PART_ENTRY_TYPE -p "$path" 2>/dev/null)" = "$gpt_bios_boot_type" ]; then
			# We have a GPT disk with a "BIOS BOOT"
			# partition included, so this disk might be
			# set up for BIOS boot.
			DISK_BIOS_BOOT=yes
			log "Disk $dev contains a BIOS boot partition"
			partitions="$partitions $id"
		else
			if [ "$fs" != "free" ]; then
				log "Partition $path might be bios-bootable, checking further"
				partitions="$partitions $id"
			fi
		fi
	done
	close_dialog

	# Now look for more details on each of those partitions
	for id in $partitions; do
		efi=no

		open_dialog GET_FLAGS $id
		# cannot break here until we've hit close_dialog below
		while { read_line flag; [ "$flag" ]; }; do
			log "$dev $id has $flag flag"
			if [ "$flag" = boot ] && [ "$label_type" = gpt ]; then
				efi=yes
			elif [ "$flag" = esp ]; then
				efi=yes
			fi
		done
		close_dialog

		if [ "$efi" = yes ]; then
			# An ESP is clearly not for BIOS use!
			log "$dev $id is an ESP"
			# set method only once, see #1034208
			if [ ! -f /var/lib/partman/uefi_check_done ]; then
				mkdir -p $id
				echo efi >$id/method
			fi
			NUM_ESP=$(($NUM_ESP + 1))
		else
			# BIOS may well work with anything else
			# remaining
			log "$dev $id is possibly bootable"
			NON_EFI_THIS_DISK=$(($NON_EFI_THIS_DISK + 1))
		fi
	done

	if [ "$DISK_BIOS_BOOT" = "yes" ]; then
		log "Disk $dev is BIOS-bootable"
		log "Disk $dev has $NON_EFI_THIS_DISK non-ESP partition(s)"
		if [ $NON_EFI_THIS_DISK -gt 0 ]; then
			NUM_NOT_ESP=$(($NUM_NOT_ESP + 1))
		fi
	fi

done

log "Found $NUM_ESP ESP(s), $NUM_NOT_ESP BIOS-bootable disk(s) total"

if [ -f /var/lib/partman/uefi_check_done ]; then
	log "Found flag file /var/lib/partman/uefi_check_done, not checking further"
else
	if in_efi_mode && [ $NUM_ESP = 0 ] && [ $NUM_NOT_ESP -gt 0 ]; then
		case $ARCH in
			i386/*|amd64/*)
				db_input critical partman-efi/non_efi_system || true
				db_go || exit 1
				db_fset partman-efi/non_efi_system seen true
				db_get partman-efi/non_efi_system
				if [ "$RET" = false ]; then
					log "User chose to ignore UEFI"
					touch /var/lib/partman/ignore_uefi
				else
					log "User chose to continue in UEFI mode"
				fi
				;;
		esac
	fi
	# We've got this far at least once without triggering the
	# check. Flag that so that any further changes we make in this
	# d-i session can't trigger a false-positive here.
	touch /var/lib/partman/uefi_check_done
	log "UEFI check done, wrote flag file /var/lib/partman/uefi_check_done"
fi
#!/bin/sh

# This script sets method "efi" for all fat16/fat32 partitions that
# have the bootable flag set.

ARCH="$(archdetect)"

# Prod the kernel to load EFI stuff and mount the efivarfs fs if
# needed
modprobe efivarfs >/dev/null 2>&1 || true
mount -t efivarfs none /sys/firmware/efi/efivars 2>&1 || true

in_efi_mode() {
    [ -d /sys/firmware/efi ]
}

if in_efi_mode; then
	> /var/lib/partman/efi
else
	case $ARCH in
	    i386/mac|amd64/mac)
		# Intel Macs have an EFI partition, regardless of
		# whether we're currently booted using BIOS
		# compatibility or not (if we are, we won't be able to
		# talk to EFI directly).
		> /var/lib/partman/efi
		;;
	    *)
		rm -f /var/lib/partman/efi
		exit 0
		;;
	esac
fi

. /lib/partman/lib/base.sh

if [ -f /var/lib/partman/uefi_check_done ]; then
	log "Found flag file /var/lib/partman/uefi_check_done, not checking further"
	exit 0
fi

gpt_efi_type=c12a7328-f81f-11d2-ba4b-00a0c93ec93b
gpt_bios_boot_type=21686148-6449-6e6f-744e-656564454649
msdos_efi_type=0xef

NUM_ESP=0
NUM_NOT_ESP=0

for dev in /var/lib/partman/devices/*; do
	[ -d "$dev" ] || continue
	cd $dev

	open_dialog GET_LABEL_TYPE
	read_line label_type
	close_dialog

	if [ "$label_type" = msdos ]; then
		DISK_BIOS_BOOT=yes
	else
		DISK_BIOS_BOOT=no
	fi

	NON_EFI_THIS_DISK=0
	partitions=
	open_dialog PARTITIONS
	while { read_line num id size type fs path name; [ "$id" ]; }; do
		# Build a list of partitions that:
		# 1. Will *not* be bios-bootable (e.g. ESP)
		# 2. Might be bios-bootable (~anything that's not
		#    "free space"
		if [ "$fs" = fat16 ]; then
			partitions="$partitions $id"
		elif [ "$fs" = fat32 ] && echo "$name" |
                     grep -i "^EFI System Partition" >/dev/null; then
			partitions="$partitions $id"
		elif [ "$label_type" = msdos ] && \
		     [ "$(blkid -o value -s PART_ENTRY_TYPE -p "$path" 2>/dev/null)" = "$msdos_efi_type" ]; then
			partitions="$partitions $id"
		elif [ "$label_type" = gpt ] && \
		     [ "$(blkid -o value -s PART_ENTRY_TYPE -p "$path" 2>/dev/null)" = "$gpt_efi_type" ]; then
			partitions="$partitions $id"
		elif [ "$label_type" = gpt ] && \
		     [ "$(blkid -o value -s PART_ENTRY_TYPE -p "$path" 2>/dev/null)" = "$gpt_bios_boot_type" ]; then
			# We have a GPT disk with a "BIOS BOOT"
			# partition included, so this disk might be
			# set up for BIOS boot.
			DISK_BIOS_BOOT=yes
			log "Disk $dev contains a BIOS boot partition"
			partitions="$partitions $id"
		else
			if [ "$fs" != "free" ]; then
				log "Partition $path might be bios-bootable, checking further"
				partitions="$partitions $id"
			fi
		fi
	done
	close_dialog

	# Now look for more details on each of those partitions
	for id in $partitions; do
		efi=no

		open_dialog GET_FLAGS $id
		# cannot break here until we've hit close_dialog below
		while { read_line flag; [ "$flag" ]; }; do
			log "$dev $id has $flag flag"
			if [ "$flag" = boot ] && [ "$label_type" = gpt ]; then
				efi=yes
			elif [ "$flag" = esp ]; then
				efi=yes
			fi
		done
		close_dialog

		if [ "$efi" = yes ]; then
			# An ESP is clearly not for BIOS use!
			log "$dev $id is an ESP"
			mkdir -p $id
			echo efi >$id/method
			NUM_ESP=$(($NUM_ESP + 1))
		else
			# BIOS may well work with anything else
			# remaining
			log "$dev $id is possibly bootable"
			NON_EFI_THIS_DISK=$(($NON_EFI_THIS_DISK + 1))
		fi
	done

	if [ "$DISK_BIOS_BOOT" = "yes" ]; then
		log "Disk $dev is BIOS-bootable"
		log "Disk $dev has $NON_EFI_THIS_DISK non-ESP partition(s)"
		if [ $NON_EFI_THIS_DISK -gt 0 ]; then
			NUM_NOT_ESP=$(($NUM_NOT_ESP + 1))
		fi
	fi

done

log "Found $NUM_ESP ESP(s), $NUM_NOT_ESP BIOS-bootable disk(s) total"

if in_efi_mode && [ $NUM_ESP = 0 ] && [ $NUM_NOT_ESP -gt 0 ]; then
	case $ARCH in
		i386/*|amd64/*)
			db_input critical partman-efi/non_efi_system || true
			db_go || exit 1
			db_fset partman-efi/non_efi_system seen true
			db_get partman-efi/non_efi_system
			if [ "$RET" = false ]; then
				log "User chose to ignore UEFI"
				touch /var/lib/partman/ignore_uefi
			else
				log "User chose to continue in UEFI mode"
			fi
			;;
	esac
fi
# We've got this far at least once without triggering the
# check. Flag that so that any further changes we make in this
# d-i session can't trigger a false-positive here.
touch /var/lib/partman/uefi_check_done
log "UEFI check done, wrote flag file /var/lib/partman/uefi_check_done"
#!/bin/sh

. /lib/partman/lib/auto-lvm.sh

devs="$*"
method="lvm"

# Ensure we have no pre-existing partitions marked as swap and efi
clean_method

auto_lvm_prepare "$devs" $method || exit $?

auto_lvm_perform || exit 1

Reply to: