[pve-devel] [PATCH kernel-meta 07/13] pve-kernel-helper: add new package

Fabian Grünbichler f.gruenbichler at proxmox.com
Wed Jul 10 17:05:05 CEST 2019


From: Stoiko Ivanov <s.ivanov at proxmox.com>

with (sh) pveesptool to format, initialize and refresh synced ESPs, as
well as the hooks previously shipped via proxmox-ve.

pveesptool based on a never-released version written in perl by Stoiko
Ivanov.

Co-Developed-By: Stoiko Ivanov <s.ivanov at proxmox.com>

Signed-off-by: Fabian Grünbichler <f.gruenbichler at proxmox.com>
---
 Makefile                         |  17 ++-
 bin/Makefile                     |  12 ++
 efiboot/Makefile                 |  18 +++
 debian/control.in                |  14 ++
 bin/pveesptool                   | 219 +++++++++++++++++++++++++++++++
 debian/pve-kernel-helper.install |   3 +
 debian/rules                     |  15 +--
 7 files changed, 281 insertions(+), 17 deletions(-)
 create mode 100644 bin/Makefile
 create mode 100644 efiboot/Makefile
 create mode 100755 bin/pveesptool
 create mode 100644 debian/pve-kernel-helper.install

diff --git a/Makefile b/Makefile
index d432599..74527eb 100644
--- a/Makefile
+++ b/Makefile
@@ -7,12 +7,17 @@ GITVERSION:=$(shell git rev-parse HEAD)
 
 KERNEL_DEB=pve-kernel-${KERNEL_VER}_${DEB_VERSION_UPSTREAM_REVISION}_all.deb
 HEADERS_DEB=pve-headers-${KERNEL_VER}_${DEB_VERSION_UPSTREAM_REVISION}_all.deb
+HELPER_DEB=pve-kernel-helper_${DEB_VERSION_UPSTREAM_REVISION}_all.deb
 
 BUILD_DIR=build
 
-DEBS=${KERNEL_DEB} ${HEADERS_DEB}
+DEBS=${KERNEL_DEB} ${HEADERS_DEB} ${HELPER_DEB}
 
-all: deb
+SUBDIRS = efiboot bin
+
+.PHONY: all
+all: ${SUBDIRS}
+	set -e && for i in ${SUBDIRS}; do ${MAKE} -C $$i; done
 
 .PHONY: deb
 deb: ${DEBS}
@@ -21,11 +26,15 @@ ${HEADERS_DEB}: ${KERNEL_DEB}
 ${KERNEL_DEB}: debian
 	rm -rf ${BUILD_DIR}
 	mkdir -p ${BUILD_DIR}/debian
-	cp -ar debian/* ${BUILD_DIR}/debian/
+	rsync -a * ${BUILD_DIR}/
 	cd ${BUILD_DIR}; debian/rules debian/control
 	echo "git clone git://git.proxmox.com/git/pve-kernel-meta.git\\ngit checkout ${GITVERSION}" > ${BUILD_DIR}/debian/SOURCE
 	cd ${BUILD_DIR}; dpkg-buildpackage -b -uc -us
-	lintian ${KERNEL_DEB} ${HEADERS_DEB}
+	lintian ${DEBS}
+
+.PHONY: install
+install: ${SUBDIRS}
+	set -e && for i in ${SUBDIRS}; do ${MAKE} -C $$i $@; done
 
 .PHONY: upload
 upload: ${DEBS}
diff --git a/bin/Makefile b/bin/Makefile
new file mode 100644
index 0000000..c5ac674
--- /dev/null
+++ b/bin/Makefile
@@ -0,0 +1,12 @@
+SBINDIR=${DESTDIR}/usr/sbin
+
+.PHONY: all
+all:
+
+install:
+	install -d ${SBINDIR}
+	install -m 0755 pveesptool ${SBINDIR}/
+
+.PHONY: clean distclean
+distclean:
+clean:
diff --git a/efiboot/Makefile b/efiboot/Makefile
new file mode 100644
index 0000000..dfda9b4
--- /dev/null
+++ b/efiboot/Makefile
@@ -0,0 +1,18 @@
+KERNEL_HOOKSCRIPTS = pve-auto-removal zz-pve-efiboot
+SHARE_FILES = functions
+
+HOOKDIR = ${DESTDIR}/etc/kernel/postinst.d
+SHARE_SCRIPTDIR = ${DESTDIR}/usr/share/pve-kernel-helper/scripts
+
+.PHONY: all
+all:
+
+install:
+	install -d ${HOOKDIR}
+	install -m 0755 ${KERNEL_HOOKSCRIPTS} ${HOOKDIR}
+	install -d ${SHARE_SCRIPTDIR}
+	install -m 0755 ${SHARE_FILES} ${SHARE_SCRIPTDIR}
+
+.PHONY: clean distclean
+distclean:
+clean:
diff --git a/debian/control.in b/debian/control.in
index 4972ea7..f6d9f4d 100644
--- a/debian/control.in
+++ b/debian/control.in
@@ -25,3 +25,17 @@ Depends: pve-firmware,
 Description: Latest Proxmox VE Kernel Image
  This is a virtual package which will install the latest available
  proxmox kernel from the @KERNEL_VER@ series.
+
+Package: pve-kernel-helper
+Architecture: all
+Section: admin
+Priority: optional
+Depends: dosfstools,
+         gdisk,
+         systemd,
+         udev,
+         ${misc:Depends},
+Description: Function for various kernel maintenance tasks.
+ .
+ This package includes kernel-hooks for marking certain kernels as
+ NeverAutoRemove and helpers for systemd-boot
diff --git a/bin/pveesptool b/bin/pveesptool
new file mode 100755
index 0000000..601c1e9
--- /dev/null
+++ b/bin/pveesptool
@@ -0,0 +1,219 @@
+#!/bin/sh
+
+set -e
+
+. /usr/share/pve-kernel-helper/scripts/functions
+
+
+_get_partition_info() {
+	if [ ! -e "$1" ]; then
+		warn "E: '$1' does not exist!"
+		exit 1
+	fi
+	bdev=$(realpath "$1")
+	if [ ! -b "$bdev" ]; then
+		warn "E: '$bdev' is not a block device!"
+		exit 1
+	fi
+
+	bdev_info=$( \
+	          lsblk \
+	          --bytes \
+	          --pairs \
+	          -o 'UUID,SIZE,FSTYPE,PARTTYPE,PKNAME,MOUNTPOINT' \
+	          "$bdev" \
+	          )
+	if [ -z "$bdev_info" ]; then
+		warn "E: unable to get information about block device '$1'!"
+		exit 1
+	fi
+
+	count=$(echo "$bdev_info" | grep -c '^')
+	if [ "$count" -ne '1' ]; then
+		echo "$bdev_info"
+		warn "E: block device '$1' has children!"
+		exit 1
+	fi
+
+	echo "$bdev_info"
+	eval "$bdev_info"
+
+	if [ -z "$PKNAME" ]; then
+		warn "E: cannot determine parent device of '$1' - please provide a partition, not a full disk."
+		exit 1
+	fi
+
+	if [ -n "$SIZE" ] && [ "$SIZE" -lt 268435456 ]; then
+		warn "E: '$1' is too small (<256M)."
+		exit 1
+	fi
+
+	if [ -n "$MOUNTPOINT" ]; then
+		warn "E: '$1' is mounted on '$MOUNTPOINT' - exiting."
+		exit 1
+	fi
+}
+
+format() {
+	part="$1"
+	force="$2"
+
+	_get_partition_info "$part"
+
+	if [ -n "$FSTYPE" ]; then
+		if [ -z "$force" ] || [ "$force" != '--force' ]; then
+			warn "E: '$part' contains a filesystem ('$FSTYPE') - exiting (use --force to override)"
+			exit 1
+		fi
+	fi
+
+	part_basename=$(basename "$part")
+	if [ -z "$part_basename" ]; then
+		warn "E: unable to determine basename of '$part'"
+		exit 1
+	fi
+
+	part_num=$(cat /sys/block/"$PKNAME"/"$part_basename"/partition)
+	if [ -z "$part_num" ]; then
+		warn "E: unable to determine partition number of '$part'"
+		exit 1
+	fi
+
+	if [ -z "$PARTTYPE" ] || [ "$PARTTYPE" != "$ESPTYPE" ]; then
+		echo "Setting partition type of '$part' to '$ESPTYPE'.."
+		sgdisk "-t$part_num:$ESPTYPE" "/dev/$PKNAME"
+		echo "Calling 'udevadm settle'.."
+		udevadm settle --timeout=5
+	fi
+
+	echo "Formatting '$part' as vfat.."
+	mkfs.vfat -F 32 "$part"
+	echo "Done."
+	exit 0
+}
+
+init() {
+	part="$1"
+
+	_get_partition_info "$part"
+
+	if [ -z "$PARTTYPE" ] || [ "$PARTTYPE" != "$ESPTYPE" ]; then
+		warn "E: '$part' has wrong partition type (!= $ESPTYPE)."
+		exit 1
+	fi
+
+	if [ -z "$FSTYPE" ] || [ "$FSTYPE" != 'vfat' ]; then
+		warn "E: '$part' has wrong filesystem (!= vfat)."
+		exit 1
+	fi
+
+	if [ -z "$UUID" ]; then
+		warn "E: '$part' has no UUID set, required for mounting."
+		exit 1
+	fi
+
+	esp_mp="/var/tmp/espmounts/$UUID"
+
+	mkdir -p "$esp_mp"
+	echo "Mounting '$part' on '$esp_mp'."
+	mount -t vfat "$part" "$esp_mp"
+
+	echo "Installing systemd-boot.."
+	mkdir -p "$esp_mp/$PMX_ESP_DIR"
+	bootctl --path "$esp_mp" install
+
+	echo "Configuring systemd-boot.."
+	echo "timeout 3" > "$esp_mp/$PMX_LOADER_CONF.tmp"
+	echo "default proxmox-*" >> "$esp_mp/$PMX_LOADER_CONF.tmp"
+	mv "$esp_mp/$PMX_LOADER_CONF.tmp" "$esp_mp/$PMX_LOADER_CONF"
+	echo "Unmounting '$part'."
+	umount "$part"
+
+	echo "Adding '$part' to list of synced ESPs.."
+	if [ -e "$ESP_LIST" ]; then
+		cp "$ESP_LIST" "$ESP_LIST.new"
+	fi
+	echo "$UUID" >> "$ESP_LIST.new"
+	sort -uo "$ESP_LIST.new" "$ESP_LIST.new"
+	mv "$ESP_LIST.new" "$ESP_LIST"
+
+	echo "Refreshing kernels and initrds.."
+	refresh
+}
+
+refresh() {
+	hookscript='/etc/kernel/postinst.d/zz-pve-efiboot'
+	echo "Running hook script '$hookscript'.."
+	exec $hookscript
+}
+
+usage() {
+	warn "USAGE: $0 <commands> [ARGS]"
+	warn ""
+	warn "       $0 format <partition> [--force]"
+	warn "       $0 init <partition>"
+	warn "       $0 refresh"
+}
+
+help() {
+	echo "USAGE: $0 format <partition> [--force]"
+	echo ""
+	echo "    format <partition> as EFI system partition. Use --force to format even if <partition> is currently in use."
+	echo ""
+	echo "USAGE: $0 init <partition>"
+	echo ""
+	echo "    initialize EFI system partition at <partition> for automatic synchronization of pve-kernels and their associated initrds."
+	echo ""
+	echo "USAGE: $0 refresh"
+	echo ""
+	echo "    refresh all configured EFI system partitions."
+	echo ""
+}
+
+if [ -z "$1" ]; then
+    usage
+    exit 0
+fi
+
+case "$1" in
+	'format')
+		shift
+		if [ -z "$1"  ]; then
+			warn "E: <partition> is mandatory."
+			warn ""
+			usage
+			exit 1
+		fi
+		format "$@"
+		exit 0
+	;;
+	'init')
+		shift
+		if [ -z "$1"  ]; then
+			warn "E: <partition> is mandatory."
+			warn ""
+			usage
+			exit 1
+		fi
+		init "$@"
+		exit 0
+	;;
+	'refresh')
+		shift
+		refresh
+		exit 0
+	;;
+	'help')
+		shift
+		help
+		exit 0
+	;;
+	*)
+		warn "Invalid/unknown command '$1'."
+		warn ""
+		usage
+		exit 1
+	;;
+esac
+
+exit 1
diff --git a/debian/pve-kernel-helper.install b/debian/pve-kernel-helper.install
new file mode 100644
index 0000000..f79ab7f
--- /dev/null
+++ b/debian/pve-kernel-helper.install
@@ -0,0 +1,3 @@
+etc/kernel/postinst.d/*
+usr/sbin/pveesptool
+usr/share/pve-kernel-helper/scripts/functions
diff --git a/debian/rules b/debian/rules
index 1592fb5..58f7f7d 100755
--- a/debian/rules
+++ b/debian/rules
@@ -9,19 +9,8 @@ debian/control: $(wildcard debian/*.in)
 	sed -e 's/@KERNEL_ABI@/${KERNEL_ABI}/g' -e 's/@KERNEL_VER@/${KERNEL_VER}/g' < debian/postinst.in > debian/pve-kernel-${KERNEL_VER}.postinst
 	sed -e 's/@KERNEL_ABI@/${KERNEL_ABI}/g' -e 's/@KERNEL_VER@/${KERNEL_VER}/g' < debian/control.in > debian/control
 
-
-install:
-	dh_installdocs -A debian/SOURCE debian/copyright
-	dh_installchangelogs
-	dh_strip_nondeterminism
-	dh_compress
-	dh_fixperms
-
-binary: install
-	dh_installdeb
-	dh_gencontrol
-	dh_md5sums
-	dh_builddeb
+%:
+	dh $@
 
 .PHONY: build clean
 build clean:
-- 
2.20.1





More information about the pve-devel mailing list