On February 14, 2022 4:57 pm, Stoiko Ivanov wrote: > ignore the current bootmode (uefi/legacy) when deciding which configs > to generate - make this decision based on the found boot loader > configs on the ESP. > > Change systemd-boot to load the kernel+initrd from the ESPs root where > grub needs them. This prevents the double use of space for systems > having both boot-loaders present (since FAT does not support > symlinks). While this is against the recommendations of the > boot-loader-specification [0]) it works fine (and we deviate from [0] > by not having the machine-id in the kernel subdirs anyways). > The UEFI spec on the directory structure [1], also should be fine with > it. > > Additionally adapt the output of `p-b-t status` to the new paths > > [0] https://systemd.io/BOOT_LOADER_SPECIFICATION/ > [1] section 13.3.1.3 of > https://uefi.org/sites/default/files/resources/UEFI_Spec_2_9_2021_03_18.pdf > > Signed-off-by: Stoiko Ivanov <s.iva...@proxmox.com> > --- > bin/proxmox-boot-tool | 14 +++---- > proxmox-boot/zz-proxmox-boot | 78 ++++++++++++------------------------ > 2 files changed, 32 insertions(+), 60 deletions(-) > > diff --git a/bin/proxmox-boot-tool b/bin/proxmox-boot-tool > index 5197f5b..320f49b 100755 > --- a/bin/proxmox-boot-tool > +++ b/bin/proxmox-boot-tool > @@ -396,20 +396,18 @@ _status_detail() { > > result="" > if [ -f "${mountpoint}/$PMX_LOADER_CONF" ]; then > - if [ ! -d "${mountpoint}/$PMX_ESP_DIR" ]; then > - warn "${path}/$PMX_ESP_DIR does not exist" > - fi > - versions_uefi=$(ls -1 ${mountpoint}/$PMX_ESP_DIR | awk '{printf > (NR>1?", ":"") $0}') > - result="uefi (versions: ${versions_uefi})" > + result="uefi" > fi > if [ -d "${mountpoint}/grub" ]; then > - versions_grub=$(ls -1 ${mountpoint}/vmlinuz-* | awk '{ > gsub(/.*\/vmlinuz-/, ""); printf (NR>1?", ":"") $0 }') > if [ -n "$result" ]; then > - result="${result}, grub (versions: ${versions_grub})" > + result="${result}, grub" > else > - result="grub (versions: ${versions_grub})" > + result="grub"
this here > fi > fi > + versions=$(find "${mountpoint}" -maxdepth 1 -name 'vmlinuz-*' | awk '{ > gsub(/.*\/vmlinuz-/, ""); printf (NR>1?", ":"") $0 }') > + result="${result} (versions: ${versions})" > + > echo "$curr_uuid is configured with: $result" > umount "${mountpoint}" || \ > { warn "umount of ${path} failed - failure"; exit 0; } > diff --git a/proxmox-boot/zz-proxmox-boot b/proxmox-boot/zz-proxmox-boot > index 5fe16a6..244373d 100755 > --- a/proxmox-boot/zz-proxmox-boot > +++ b/proxmox-boot/zz-proxmox-boot > @@ -75,33 +75,33 @@ update_esp_func() { > { warn "creation of mountpoint ${mountpoint} failed - > skipping"; return; } > mount "${path}" "${mountpoint}" || \ > { warn "mount of ${path} failed - skipping"; return; } > - if [ -d /sys/firmware/efi ]; then > - if [ ! -f "${mountpoint}/$PMX_LOADER_CONF" ]; then > - warn "${path} contains no loader.conf - skipping" > - return > - fi > - if [ ! -d "${mountpoint}/$PMX_ESP_DIR" ]; then > - warn "${path}/$PMX_ESP_DIR does not exist- skipping" > - return > - fi > - elif [ ! -d "${mountpoint}/grub" ]; then > - warn "${path} contains no grub directory - skipping" > + sd_boot="" > + grub="" > + if [ -f "${mountpoint}/$PMX_LOADER_CONF" ]; then > + sd_boot=1 > + fi > + if [ -d "${mountpoint}/grub" ]; then > + grub=1 > + fi and this here looks rather similar - maybe it makes sense to have helpers for 'ESP contains grub' and 'ESP contains sd-boot' before we add more copies? ;) > + if [ -z "$sd_boot" ] && [ -z "$grub" ]; then > + warn "${path} contains no bootloader config - skipping!" > return > fi > warn "Copying and configuring kernels on ${path}" > - copy_and_config_kernels "${mountpoint}" > + copy_and_config_kernels "${mountpoint}" "${sd_boot}" > > pinned_kernel=$(get_first_line "${PINNED_KERNEL_CONF}") > > if [ -e "${NEXT_BOOT_PIN}" ]; then > pinned_kernel=$(get_first_line "${NEXT_BOOT_PIN}") > fi > - if [ -d /sys/firmware/efi ]; then > + if [ -n "$sd_boot" ]; then > set_systemd_boot_default "${mountpoint}" "${pinned_kernel}" > - remove_old_kernels_efi "${mountpoint}" > - else > + remove_old_kernels "${mountpoint}" > + fi > + if [ -n "$grub" ]; then > set_grub_default "${pinned_kernel}" > - remove_old_kernels_legacy "${mountpoint}" > + remove_old_kernels "${mountpoint}" > mount --bind "${mountpoint}" "/boot" > update-grub > umount /boot > @@ -116,7 +116,7 @@ update_esp_func() { > > copy_and_config_kernels() { > esp="$1" > - > + sd_boot="$2" > > for kver in ${BOOT_KVERS}; do > > @@ -132,52 +132,25 @@ copy_and_config_kernels() { > continue > fi > > - if [ -d /sys/firmware/efi ]; then > - > - warn " Copying kernel and creating boot-entry for > ${kver}" > - KERNEL_ESP_DIR="${PMX_ESP_DIR}/${kver}" > - KERNEL_LIVE_DIR="${esp}/${KERNEL_ESP_DIR}" > - mkdir -p "${KERNEL_LIVE_DIR}" > - cp --preserve=timestamps "${linux_image}" > "${KERNEL_LIVE_DIR}/" > - cp --preserve=timestamps "${initrd}" > "${KERNEL_LIVE_DIR}/" > + warn " Copying kernel and creating boot-entry for ${kver}" nit: technically only true for the uefi/sd_boot if below > + cp --preserve=timestamps "${linux_image}" "${esp}/" > + cp --preserve=timestamps "${initrd}" "${esp}/" > > - # create loader entry > + if [ -n "$sd_boot" ]; then > + # create loader entry > cat > "${esp}/loader/entries/proxmox-${kver}.conf" <<- > EOF > title ${LOADER_TITLE} > version ${kver} > options ${CMDLINE} > - linux /${KERNEL_ESP_DIR}/vmlinuz-${kver} > - initrd /${KERNEL_ESP_DIR}/initrd.img-${kver} > + linux /vmlinuz-${kver} > + initrd /initrd.img-${kver} > EOF > - else > - warn " Copying kernel ${kver}" > - cp --preserve=timestamps "${linux_image}" "${esp}/" > - cp --preserve=timestamps "${initrd}" "${esp}/" > - fi > - done > - > -} > - > -remove_old_kernels_efi() { > - esp="$1" > - > - for kerneldir in "${esp}/${PMX_ESP_DIR}"/*; do > - if [ ! -d "${kerneldir}" ]; then > - warn " ${kerneldir} is not a directory - skipping" > - continue > fi > - > - kver="$(echo "${kerneldir}" | sed -r > "s#^${esp}/${PMX_ESP_DIR}/(.+)\$#\\1#")" > - > - echo "${BOOT_KVERS}" | grep -q "${kver}" && continue; > - warn " Removing old version ${kver}" > - rm -rf "${kerneldir}" > - rm -f "${esp}/loader/entries/proxmox-${kver}.conf" > done this still needs to be done at least once per ESP post-upgrade, else all the (now unused) kernels+initrds in the old efi location are kept around forever, taking up precious space on our small ESPs ;) maybe replace it with a simple if dir_exists; then rm -rf ...; fi ? > > } > > -remove_old_kernels_legacy() { > +remove_old_kernels() { > esp="$1" > > for kernel in "${esp}/"vmlinuz-*; do > @@ -187,6 +160,7 @@ remove_old_kernels_legacy() { > warn " Removing old version ${kver}" > rm -rf "${esp}/vmlinuz-${kver}" > rm -rf "${esp}/initrd.img-${kver}" > + rm -rf "${esp}/loader/entries/proxmox-${kver}.conf" > done > > } > -- > 2.30.2 > > > > _______________________________________________ > pve-devel mailing list > pve-devel@lists.proxmox.com > https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel > > > _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel