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

[PATCH 5/5] Adapt grub-install parameters and finally perform GRUB installation. Make CHRP script bootable by OpenFirmware. Configure NVRAM defaults but do not boot automatically.



The NVRAM is (re)configured explicitly after the call to `grub-install`
because `grub-install` uses and configures a wrong OF path (thanks to
`ofpathname`). As it doesn't work the way `grub-install` does it
currently, I tried to support the NVRAM defaults, which are to boot from
the first found tbxi file in a "blessed" directory AFAIK:

```
boot-device = hd:,\\:tbxi
boot-command = mac-boot
```

Automatic boot is currently disabled to allow for easy manual changes in
OpenFirmware in case of any problems during boot. The system will end up
in OpenFirmware after reboot.

---
 debian/changelog |   3 ++
 grub-installer   | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 116 insertions(+)

diff --git a/debian/changelog b/debian/changelog
index d3da6e9..b68c451 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -9,6 +9,9 @@ grub-installer (1.147) UNRELEASED; urgency=medium
       d-i/yaboot-installer).
     - Handle HFS file systems (format, mount, unmount, permanent mount).
     - Create and configure the missing CHRP boot script.
+    - Adapt grub-install parameters and finally perform GRUB installation.
+      Make CHRP script bootable by OpenFirmware. Configure NVRAM defaults
+      but do not boot automatically.
 
  -- Frank Scheiner <frank.scheiner@web.de>  Thu, 06 Nov 2017 08:42:00 +0200
 
diff --git a/grub-installer b/grub-installer
index 3f1c606..ad2f38a 100755
--- a/grub-installer
+++ b/grub-installer
@@ -434,6 +434,98 @@ nw_create_boot_script()
 
 	return
 }
+
+nw_make_boot_script_of_bootable()
+{
+	local offs_part="$1"
+	local hfs_path="$2"
+	local boot_script_name="$3"
+
+	local self="nw_make_boot_script_of_bootable"
+	local exit_code=0
+
+	# create script for in-target Operation
+	cat > ${ROOT}/tmp/make_boot_script_of_bootable <<-EOF
+		#!/bin/sh
+		if hmount "$offs_part"; then
+		        # Set file type of boot script to tbxi and "bless" directory
+		        hattrib -t tbxi -c UNIX "${hfs_path}:${boot_script_name}" && \\
+		        hattrib -b "${hfs_path}"
+		        if [ $? -ne 0 ]; then
+		                humount
+		                exit 1
+		        else
+		                humount
+		                exit 0
+		        fi
+		else
+		        exit 2
+		fi
+	EOF
+
+	chmod +x ${ROOT}/tmp/make_boot_script_of_bootable
+
+	in-target /tmp/make_boot_script_of_bootable || exit_code=$?
+
+	if [ $exit_code -eq 0 ]; then
+		info "$self: Operation suceeded."
+		#rm ${ROOT}/tmp/make_boot_script_of_bootable
+		return 0
+	elif [ $exit_code -eq 1 ]; then
+		error "$self: Operation failed." 1>&2
+		return 1
+	elif [ $exit_code -eq 2 ]; then
+		error "$self: Couldn't hmount \"$offs_part\"" 1>&2
+		return 1
+	fi
+}
+
+nw_backup_nvram_contents()
+{
+	local self="nw_backup_nvram_contents"
+	local nvram_backup="${ROOT}/root/nvram_backup"
+
+	if in-target nvram --print-config > "$nvram_backup"; then
+		info "$self: Original NVRAM contents backed up to $nvram_backup"
+		return 0
+	else
+		error "$self: Original NVRAM contents couldn't be backed up to $nvram_backup" 1>&2
+		return 1
+	fi
+}
+
+nw_configure_nvram()
+{
+	local self="nw_configure_nvram"
+
+	# `boot-device`
+	# boot file of type tbxi from "blessed" directory
+	if in-target nvram --update-config boot-device='hd:,\\:tbxi'; then
+		info "$self: Configured \"boot-device\" to \"hd:,\\:tbxi\""
+	else
+		error "$self: Couldn't configure \"boot-device\" to \"hd:,\\:tbxi\"" 1>&2
+		return 1
+	fi
+
+	# `boot-command`
+	if in-target nvram --update-config boot-command='mac-boot'; then
+		info "$self: Configured \"boot-command\" to \"mac-boot\""
+		return 0 # do not reconfigure `auto-boot?` currently
+	else
+		error "$self: Couldn't configure \"boot-command\" to \"mac-boot\"" 1>&2
+		return 1
+	fi
+
+	# `auto-boot?`
+	if in-target nvram --update-config 'auto-boot?'='true'; then
+		info "$self: Configured \"auto-boot?\" to \"true\""
+		return 0
+	else
+		error "$self: Couldn't configure \"auto-boot?\" to \"true\"" 1>&2
+		return 1
+	fi
+}
+
 ARCH="$(archdetect)"
 info "architecture: $ARCH"
 
@@ -1280,6 +1372,9 @@ if [ -z "$frdisk" ]; then
 			# see: https://github.com/esnowberg/grub2-sparc/wiki
 			grub_install_params="$grub_install_params --skip-fs-probe"
 			;;
+		    powerpc/powermac_newworld|ppc64/powermac_newworld)
+			grub_install_params="$grub_install_params --macppc-directory=$NW_OFFS_MOUNT_POINT"
+			;;
 		esac
 
 		if [ "$grub_version" = "grub" ] ; then
@@ -1291,6 +1386,24 @@ if [ -z "$frdisk" ]; then
 
 		CODE=0
 		case $ARCH:$grub_package in
+		    powerpc/powermac_newworld:grub-ieee1275|ppc64/powermac_newworld:grub-ieee1275)
+			nw_backup_nvram_contents || true
+			info "Running $chroot $ROOT grub-install $grub_install_params"
+			log-output -t grub-installer $chroot $ROOT grub-install $grub_install_params || CODE=$?
+			# Unmount OFFS before using `hattrib` in the next step so all
+			# changes in the file system are written back and are visible
+			# to `hattrib` later on.
+			nw_unmount_offs "$offs_part"
+			# HFS path from [1] adapted for use with `hattrib`. `BootX` as
+			# installed by `grub-install` later is located in the same HFS
+			# path as the `grub.elf` referenced in `BootX`
+			#
+			# [1]: http://git.savannah.gnu.org/cgit/grub.git/tree/grub-core/boot/powerpc/grub.chrp.in?id=446794de8da4329ea532cbee4ca877bcafd0e534
+			nw_make_boot_script_of_bootable "$offs_part" "bootstrap:System:Library:CoreServices" "BootX" || exit 1
+			# Mount OFFS again before continuing
+			nw_mount_offs "$offs_part"
+			nw_configure_nvram || true
+			;;
 		    *:grub|*:grub-pc|*:grub-efi*|sparc/*:grub-ieee1275|sparc64/*:grub-ieee1275|powerpc/*:grub-ieee1275|ppc64/*:grub-ieee1275|ppc64el/*:grub-ieee1275)
 			info "Running $chroot $ROOT grub-install $grub_install_params \"$bootdev\""
 			log-output -t grub-installer $chroot $ROOT grub-install $grub_install_params "$bootdev" || CODE=$?
-- 
1.9.1


Reply to: