[PATCH 2/5] Detect and select NewWorld bootstrap partitions (adapted from d-i/yaboot-installer).
---
debian/changelog | 4 +-
debian/grub-installer.templates | 19 ++++++
grub-installer | 126 +++++++++++++++++++++++++++++++++++++++-
3 files changed, 147 insertions(+), 2 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index 0f1dc54..752849e 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -3,7 +3,9 @@ grub-installer (1.147) UNRELEASED; urgency=medium
[ Frank Scheiner ]
* Execute EFI related code only for installations of grub-efi* packages.
* Make d-i/grub-installer work for NewWorld Power Macs:
- * Install hfsutils in-target for NewWorld Power Macs (adapted from
+ - Install hfsutils in-target for NewWorld Power Macs (adapted from
+ d-i/yaboot-installer).
+ - Detect and select NewWorld bootstrap partitions (adapted from
d-i/yaboot-installer).
-- Frank Scheiner <frank.scheiner@web.de> Thu, 06 Nov 2017 08:42:00 +0200
diff --git a/debian/grub-installer.templates b/debian/grub-installer.templates
index 5f82c04..0c0b7f9 100644
--- a/debian/grub-installer.templates
+++ b/debian/grub-installer.templates
@@ -1,3 +1,22 @@
+Template: grub-installer/nopart_newworld
+Type: error
+# :sl4:
+_Description: No NewWorld boot partition found
+ No hard disks were found which have a "NewWorld boot partition".
+ You must create a 10-Megabyte partition of type "NewWorld boot partition".
+
+Template: grub-installer/bootdev_newworld
+Type: select
+Choices: ${DEVICES}
+Default: invaliddevice
+# :sl4:
+_Description: Device for boot loader installation:
+ GRUB needs to be installed on a "NewWorld boot partition" in order for
+ your system to be bootable. Please choose the destination partition
+ from among these partitions that have the bootable flag set.
+ .
+ Warning: this will erase all data on the selected partition!
+
Template: grub-installer/apt_install_hfsutils
Type: text
# :sl2:
diff --git a/grub-installer b/grub-installer
index a45b616..f65842a 100755
--- a/grub-installer
+++ b/grub-installer
@@ -37,6 +37,128 @@ debug () {
[ -z "${DEBCONF_DEBUG}" ] || log "debug: $@"
}
+# taken from yaboot-installer's postinst script
+die() {
+ template="$1"
+ shift
+
+ error "$@"
+ db_input critical "$template" || [ $? -eq 30 ]
+ db_go || true
+ db_progress STOP
+ exit 1
+}
+
+# taken from yaboot-installer
+partitions_with_flag () {
+ /usr/lib/partconf/find-partitions --colons --flag "$1" 2>/dev/null || true
+}
+
+# taken and adapted from yaboot-installer's `postinst` script
+# nw is short for NewWorld
+nw_select_offs_part()
+{
+ local self="nw_select_offs_part"
+
+ # Find the boot partition
+
+ # Telling parted to create an Apple_Bootstrap partition doesn't work as well
+ # as we might like: parted's probe function isn't intelligent enough to know
+ # about this, and reports the partition as containing whatever filesystem
+ # was there beforehand.
+ #
+ # As a workaround, we only check for partitions with the boot flag set, and
+ # don't bother checking the filesystem. However, this means that we *must*
+ # ask the user to confirm the bootstrap partition, otherwise we might
+ # mistakenly overwrite some other partition that happened to be flagged as
+ # bootable.
+
+ PARTITIONS=
+ DEFAULT=
+ bootdev_priority=critical
+
+ case "$ARCH" in
+ powerpc/powermac_newworld|ppc64/powermac_newworld)
+ if db_get partman-newworld/boot_partitions && [ "$RET" ]; then
+ OLDIFS="$IFS"
+ IFS=,
+ for part in $RET; do
+ IFS="$OLDIFS"
+ mappart="$(mapdevfs "$part")"
+ if [ -z "$PARTITIONS" ]; then
+ DEFAULT="$mappart"
+ PARTITIONS="$mappart"
+ else
+ PARTITIONS="$PARTITIONS, $mappart"
+ fi
+ IFS=,
+ done
+ IFS="$OLDIFS"
+ info "$self: partman-supplied bootstrap partitions: $PARTITIONS"
+ info "$self: partman-supplied default bootstrap partition: $DEFAULT"
+ if [ "$PARTITIONS" ] && [ "$DEFAULT" = "$PARTITIONS" ]; then
+ # We have explicit information from partman-newworld that only one
+ # bootstrap partition is available, so it's safe to bypass this
+ # question.
+ bootdev_priority=medium
+ fi
+ fi
+ ;;
+ esac
+
+ if [ -z "$PARTITIONS" ]; then
+ case $ARCH in
+ powerpc/powermac_newworld|ppc64/powermac_newworld)
+ PARTED_FLAGS='boot'
+ ;;
+ *)
+ error "$self: unknown subarchitecture; allowing any bootable partition" 1>&2
+ PARTED_FLAGS='boot'
+ ;;
+ esac
+
+ for flag in $PARTED_FLAGS; do
+ for part in $(partitions_with_flag "$flag" | cut -d: -f1); do
+ mappart="$(mapdevfs "$part")"
+ if [ -z "$PARTITIONS" ]; then
+ DEFAULT="$mappart"
+ PARTITIONS="$mappart"
+ else
+ PARTITIONS="$PARTITIONS, $mappart"
+ fi
+ done
+ done
+ if [ "$PARTED_FLAGS" ]; then
+ info "$self: guessed bootstrap partitions: $PARTITIONS"
+ info "$self: guessed default bootstrap partition: $DEFAULT"
+ fi
+ fi
+
+ if [ "$PARTED_FLAGS" ] && [ -z "$PARTITIONS" ]; then
+ # error: no viable boot partitions found; fall over
+ die grub-installer/nopart_newworld 'No NewWorld bootstrap partitions found'
+ fi
+
+ if [ "$PARTITIONS" ]; then
+ db_subst grub-installer/bootdev_newworld DEVICES "$PARTITIONS"
+ db_set grub-installer/bootdev_newworld "$DEFAULT"
+ db_input "$bootdev_priority" grub-installer/bootdev_newworld || [ $? -eq 30 ]
+ if ! db_go; then
+ db_progress STOP
+ exit 10 # back up to menu
+ fi
+
+ db_get grub-installer/bootdev_newworld
+ if [ "$RET" = false ]; then
+ die grub-installer/nopart_newworld 'No bootstrap partition selected (?)'
+ fi
+ # already devfs-mapped
+ boot="$RET"
+ fi
+
+ echo "$boot"
+ return 0
+}
ARCH="$(archdetect)"
info "architecture: $ARCH"
@@ -238,7 +360,9 @@ case $ARCH in
;;
ppc64/chrp|ppc64/chrp_rs6k|ppc64/chrp_ibm|ppc64/cell)
;;
- powerpc/*|ppc64/*)
+ powerpc/powermac_newworld|ppc64/powermac_newworld)
+ info "$ARCH selected."
+ offs_part=$( nw_select_offs_part )
offs=$(findfs /boot/grub)
[ -n "$offs" ] || error "GRUB requires that the OF partition is mounted in /boot/grub" 1>&2
;;
--
1.9.1
Reply to: