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

Is udpkg --configure another package from postinst OK? (flash-kernel-installer from grub-installer)



In order to use the grub arm-uboot support something needs to arrange
for the grub kernel to be loaded from u-boot on the various platforms,
which in turn requires some platform specific knowledge (load addresses,
partitions and the like). Since flash-kernel already has a bunch of
infrastructure for this I thought it might be good to reuse it rather
than reinventing that wheel in grub-installer (or upstream grub).

I changed grub-installer's XB-Installer-Menu-Item to 7200 (from 7400) so
it would come before flash-kernel-installer (also 7400) and added to the
grub-installer postinst (bit WIP, especially the error handling):
        @@ -829,6 +837,17 @@ EOF
         
         fi
         
        +case $ARCH:$grub_package in
        +       *:grub-uboot)
        +               log "Installing flash-kernel-installer"
        +               ANNA_VERBOSE=1 anna-install flash-kernel-installer || error "failed to install flash-kernel-installer"
        +               log "Configuring flash-kernel-installer"
        +               udpkg --force-configure --configure flash-kernel-installer || error "failed to configure flash-kernel-installer"
        +               ;;
        +       *)
        +               log "ARCH:PKG is $ARCH:$grub_package"
        +esac
        +
         # Split a device name into a disk device name and a partition number, if
         # possible.
         split_device () {

(full WIP patches to grub-installer and flash-kernel, which are working
on Calxeda Midway, are appended)

Just doing anna-install was not sufficient, I think because once
grub-installer's postinst finishes the top-level bootable-system
dependency is satisfied so main-menu sees no reason to configure
flash-kernel too.

Is this call to udpkg allowable? codesearch seems to suggest that the
idiom is not very widespread, only kickseed and cdrom-checker use it.

Another approach might be to split bootable-system into two parts
(perhaps only on armhf) e.g. stage1 (==flash-kernel) and stage2
(==grub).

It's worth mentioning that unless the grub-kernel can be made
relocatable it may turn out that grub-installer needs some platform
specific knowledge (the grub load address, see [0]) anyway. Leif was
going to investigate -fpie but if that doesn't pan out then I wonder if
grub-installer can/should share the flash-kernel db or if it should go
its own way? Ideally only one place would need updating for each
platform.

[0] http://lists.gnu.org/archive/html/grub-devel/2013-12/msg00415.html

Ian.

===WIP: grub-installer===
diff --git a/debian/control b/debian/control
index 571459a..a4a8c34 100644
--- a/debian/control
+++ b/debian/control
@@ -8,10 +8,10 @@ Vcs-Browser: http://anonscm.debian.org/gitweb/?p=d-i/grub-installer.git
 Vcs-Git: git://anonscm.debian.org/d-i/grub-installer.git
 
 Package: grub-installer
-Architecture: i386 hurd-i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc mipsel
+Architecture: i386 hurd-i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc mipsel armhf
 XB-Subarchitecture: ${subarch}
 Provides: bootable-system
 Depends: cdebconf-udeb, kernel-installer, created-fstab, di-utils (>= 1.15), di-utils-mapdevfs, os-prober, partman-utils
-XB-Installer-Menu-Item: 7400
+XB-Installer-Menu-Item: 7200
 Package-Type: udeb
 Description: Install GRUB on a hard disk
diff --git a/grub-installer b/grub-installer
index 71e10c8..dbb46ad 100755
--- a/grub-installer
+++ b/grub-installer
@@ -327,6 +327,10 @@ case $ARCH in
     i386/*|amd64/*)
 	grub_package="grub-pc"
 	;;
+    armhf/*)
+	# XXX detect and handle EFI too
+	grub_package="grub-uboot"
+	;;
     powerpc/*)
 	grub_package="grub-ieee1275"
 	experimental_arch
@@ -753,6 +757,10 @@ if [ -z "$frdisk" ]; then
 			fi
 		fi
 
+		#if [ "$ARCH" = "armhf/XXX" ] ; then
+		#	grub_install_params="$grub_install_params -T 0xLOADADDRESS"
+		#fi
+
 		if [ "$ARCH" = "powerpc/chrp_pegasos" ] ; then
 			# nvram is broken here
 			grub_install_params="$grub_install_params --no-nvram"
@@ -829,6 +837,17 @@ EOF
 
 fi
 
+case $ARCH:$grub_package in
+	*:grub-uboot)
+		log "Installing flash-kernel-installer"
+		ANNA_VERBOSE=1 anna-install flash-kernel-installer || error "failed to install flash-kernel-installer"
+		log "Configuring flash-kernel-installer"
+		udpkg --force-configure --configure flash-kernel-installer || error "failed to configure flash-kernel-installer"
+		;;
+	*)
+		log "ARCH:PKG is $ARCH:$grub_package"
+esac
+
 # Split a device name into a disk device name and a partition number, if
 # possible.
 split_device () {

===WIP: flash-kernel===
diff --git a/bootscript/bootscr.calxeda b/bootscript/bootscr.calxeda
new file mode 100644
index 0000000..4d925e2
--- /dev/null
+++ b/bootscript/bootscr.calxeda
@@ -0,0 +1,4 @@
+echo "Loading Debian Grub ..."
+${fs}load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}/grub/arm-uboot/core.img
+bootm ${kernel_addr_r} - ${fdt_addr}
+
diff --git a/db/all.db b/db/all.db
index 76e99fd..95e503e 100644
--- a/db/all.db
+++ b/db/all.db
@@ -40,6 +40,13 @@ Boot-Initrd-Path: /boot/initrd.buffalo
 Required-Packages: u-boot-tools
 Bootloader-Sets-Root: yes
 
+Machine: Calxeda ECX-2000
+Method: grub
+Required-Packages: u-boot-tools
+Boot-Script-Path: /boot/boot.scr
+U-Boot-Script-Name: bootscr.calxeda
+Bootloader-Sets-Root: no
+
 Machine: D-Link DNS-323
 Kernel-Flavors: orion5x
 Machine-Id: 1542
diff --git a/debian/control b/debian/control
index f8bfa67..bdd1378 100644
--- a/debian/control
+++ b/debian/control
@@ -29,7 +29,7 @@ Section: debian-installer
 Priority: standard
 Package-Type: udeb
 Architecture: armel armhf
-XB-Subarchitecture: iop32x ixp4xx kirkwood orion5x s3c24xx mx5
+XB-Subarchitecture: iop32x ixp4xx kirkwood orion5x s3c24xx mx5 generic
 Provides: bootable-system
 Depends: cdebconf-udeb, installed-base
 XB-Installer-Menu-Item: 7300
diff --git a/debian/flash-kernel-installer.isinstallable b/debian/flash-kernel-installer.isinstallable
index ce85af3..0d75039 100755
--- a/debian/flash-kernel-installer.isinstallable
+++ b/debian/flash-kernel-installer.isinstallable
@@ -20,8 +20,14 @@ case "`archdetect`" in
 	arm*/s3c24xx)
 		exit 0
 	;;
+	armhf/generic)
+		logger -t flash-kernel-installer armhf/generic is installable
+		# XXX check db for /proc/device-tree/model?
+		exit 0
+	;;
 	# Don't activate it by default
 	*)
+		logger -t flash-kernel-installer `archdetect` is installable
 		exit 1
 	;;
 esac
diff --git a/functions b/functions
index 66e9738..54c84ba 100644
--- a/functions
+++ b/functions
@@ -488,13 +492,29 @@ case "$method" in
 		fi
 		android_flash "$part"
 	;;
+	"grub")
+		grub="/boot/grub/arm-uboot/core.img"
+		# Address to load to:
+		#  ukaddr="$(get_machine_field "$machine" "U-Boot-Kernel-Address")" || :
+		# Script address: (needed?)
+		#  usaddr="$(get_machine_field "$machine" "U-Boot-Script-Address")" || :
+		# Name of the input script:
+		#  usname="$(get_machine_field "$machine" "U-Boot-Script-Name")" || :
+		# File to load
+		ugrubname="$(get_machine_field "$machine" "U-Boot-Grub-Name")" || ugrubname="/boot/grub/arm-uboot/core.img"
+		# Script output path:
+		#  boot_script_path="$(get_machine_field "$machine" "Boot-Script-Path")" || :
+		boot_script_path="$boot_mnt_dir/$boot_script_path"
+		boot_script="$BOOTSCRIPTS_DIR/$usname"
+		mkimage_script "$usaddr" "grub boot script" "$boot_script" \
+			"$tmpdir/boot.scr"
+		boot_script="$tmpdir/boot.scr"
+		backup_and_install "$boot_script" "$boot_script_path"
+	;;
 	"generic")
 		kernel="$kfile"
 		initrd="$ifile"
 		if [ -n "$machine_id" ]; then
[...snip some unrelated local hacks...]

Attachment: signature.asc
Description: This is a digitally signed message part


Reply to: