From: Stoiko Ivanov <s.iva...@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.iva...@proxmox.com> Signed-off-by: Fabian Grünbichler <f.gruenbich...@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 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel