* [pve-devel] [PATCH pve-kernel-meta/pve-installer] improve boot-mode switching
@ 2022-02-14 15:57 Stoiko Ivanov
2022-02-14 15:57 ` [pve-devel] [PATCH pve-kernel-meta 1/5] rename pve-efiboot-manual-kernels to proxmox-boot-manual-kernels Stoiko Ivanov
` (6 more replies)
0 siblings, 7 replies; 11+ messages in thread
From: Stoiko Ivanov @ 2022-02-14 15:57 UTC (permalink / raw)
To: pve-devel
This patchset is the result from the discussion on the rfc for using grub as
only boot loader [0].
The patches for pve-kernel-meta are based on top of the v3 of the
`pin/unpin` addition [1].
The patches for pve-installer are independent from the pve-kernel-meta ones
(my tests used the current PVE 7.1 ISO w/o updating the pve-kernel-helper
package) - but I still consider them linked.
changes from the rfc:
* instead of using grub everywhere - we now use systemd-boot always for efi
systems and leave grub only for legacy booted systems
* instead of unconditionally installing the boot-loaders for both modes on
all ESPs users now can opt-in to installing the boot-loader for the other
bootmode (both are updated if their configs are present, by default we
only install the boot-loader for the current boot mode)
Tested the pve-kernel-meta with 3 VMs (ZFS+uefi, ZFS+legacy, ext4+uefi) and
switching boot-modes (after the necessary preparations).
Tested the pve-installer by scping proxinstall into a VM and installing
on btrfs+uefi, ext4+uefi, btrfs+legacy
[0] https://lists.proxmox.com/pipermail/pve-devel/2022-February/051562.html
[1] https://lists.proxmox.com/pipermail/pve-devel/2022-February/051732.html
pve-kernel-meta:
Stoiko Ivanov (5):
rename pve-efiboot-manual-kernels to proxmox-boot-manual-kernels
proxmox-boot: add reinit subcommand
proxmox-boot: refresh based on bootloader config instead of bootmode
proxmox-boot: init bootloaders based on esp contents
proxmox-boot: allow to manually specify bootloader
bin/grub-install-wrapper | 19 +-----
bin/proxmox-boot-tool | 100 +++++++++++++++++++++++++-----
debian/pve-kernel-helper.postinst | 4 ++
proxmox-boot/functions | 2 +-
proxmox-boot/zz-proxmox-boot | 78 ++++++++---------------
5 files changed, 116 insertions(+), 87 deletions(-)
pve-installer:
Stoiko Ivanov (2):
remove /mnt/hostrun after install
use proxmox-boot-tool for all uefi installs
proxinstall | 81 ++++++++++-------------------------------------------
1 file changed, 15 insertions(+), 66 deletions(-)
--
2.30.2
^ permalink raw reply [flat|nested] 11+ messages in thread
* [pve-devel] [PATCH pve-kernel-meta 1/5] rename pve-efiboot-manual-kernels to proxmox-boot-manual-kernels
2022-02-14 15:57 [pve-devel] [PATCH pve-kernel-meta/pve-installer] improve boot-mode switching Stoiko Ivanov
@ 2022-02-14 15:57 ` Stoiko Ivanov
[not found] ` <<20220214155737.1444136-2-s.ivanov@proxmox.com>
2022-02-14 15:57 ` [pve-devel] [PATCH pve-kernel-meta 2/5] proxmox-boot: add reinit subcommand Stoiko Ivanov
` (5 subsequent siblings)
6 siblings, 1 reply; 11+ messages in thread
From: Stoiko Ivanov @ 2022-02-14 15:57 UTC (permalink / raw)
To: pve-devel
was forgotten during the general renaming of pve-efiboot ->
proxmox-boot.
follows commit 8c0a22adfe15dc00cf2194647bb254201d8d187b
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
---
debian/pve-kernel-helper.postinst | 4 ++++
proxmox-boot/functions | 2 +-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/debian/pve-kernel-helper.postinst b/debian/pve-kernel-helper.postinst
index 891396c..4c78766 100644
--- a/debian/pve-kernel-helper.postinst
+++ b/debian/pve-kernel-helper.postinst
@@ -8,6 +8,10 @@ case "$1" in
echo "$0: legacy ESP list /etc/kernel/pve-efiboot-uuids found moving to /etc/kernel/proxmox-boot-uuids" 1>&2
mv /etc/kernel/pve-efiboot-uuids /etc/kernel/proxmox-boot-uuids
fi
+ if [ -e /etc/kernel/pve-efiboot-manual-kernels ]; then
+ echo "$0: legacy manual kernel list /etc/kernel/pve-efiboot-manual-kernels found moving to /etc/kernel/proxmox-boot-manual-kernels" 1>&2
+ mv /etc/kernel/pve-efiboot-manual-kernels /etc/kernel/proxmox-boot-manual-kernels
+ fi
;;
esac
diff --git a/proxmox-boot/functions b/proxmox-boot/functions
index b46d198..bdab987 100755
--- a/proxmox-boot/functions
+++ b/proxmox-boot/functions
@@ -4,7 +4,7 @@ set -e
ESP_LIST="/etc/kernel/proxmox-boot-uuids"
ESPTYPE='c12a7328-f81f-11d2-ba4b-00a0c93ec93b'
-MANUAL_KERNEL_LIST="/etc/kernel/pve-efiboot-manual-kernels"
+MANUAL_KERNEL_LIST="/etc/kernel/proxmox-boot-boot-manual-kernels"
PINNED_KERNEL_CONF="/etc/kernel/proxmox-boot-pin"
NEXT_BOOT_PIN="/etc/kernel/next-boot-pin"
--
2.30.2
^ permalink raw reply [flat|nested] 11+ messages in thread
* [pve-devel] [PATCH pve-kernel-meta 2/5] proxmox-boot: add reinit subcommand
2022-02-14 15:57 [pve-devel] [PATCH pve-kernel-meta/pve-installer] improve boot-mode switching Stoiko Ivanov
2022-02-14 15:57 ` [pve-devel] [PATCH pve-kernel-meta 1/5] rename pve-efiboot-manual-kernels to proxmox-boot-manual-kernels Stoiko Ivanov
@ 2022-02-14 15:57 ` Stoiko Ivanov
2022-02-14 15:57 ` [pve-devel] [PATCH pve-kernel-meta 3/5] proxmox-boot: refresh based on bootloader config instead of bootmode Stoiko Ivanov
` (4 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Stoiko Ivanov @ 2022-02-14 15:57 UTC (permalink / raw)
To: pve-devel
to iterate over all configured ESPs and refresh the boot-loader
installations.
the init function was changed to not run refresh directly - to prevent
refresh from running once for each ESP
currently reinit does not imply refresh
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
---
bin/grub-install-wrapper | 19 ++-----------------
bin/proxmox-boot-tool | 39 +++++++++++++++++++++++++++++++++++----
2 files changed, 37 insertions(+), 21 deletions(-)
diff --git a/bin/grub-install-wrapper b/bin/grub-install-wrapper
index 9facd04..90c144e 100755
--- a/bin/grub-install-wrapper
+++ b/bin/grub-install-wrapper
@@ -2,22 +2,6 @@
set -e
-. /usr/share/pve-kernel-helper/scripts/functions
-
-init_boot_disks() {
- if ! (echo "${curr_uuid}" | grep -qE '[0-9a-fA-F]{4}-[0-9a-fA-F]{4}'); then
- warn "WARN: ${curr_uuid} read from ${ESP_LIST} does not look like a VFAT-UUID - skipping"
- return
- fi
-
- path="/dev/disk/by-uuid/$curr_uuid"
- if [ ! -e "${path}" ]; then
- warn "WARN: ${path} does not exist - clean '${ESP_LIST}'! - skipping"
- return
- fi
- proxmox-boot-tool init "$path"
-}
-
if proxmox-boot-tool status --quiet; then
# detect when being called by dpkg (e.g. grub-pc.postinst
if [ -n "$DPKG_RUNNING_VERSION" ] && echo "$DPKG_MAINTSCRIPT_PACKAGE" | grep -sq "^grub-"; then
@@ -28,7 +12,8 @@ if proxmox-boot-tool status --quiet; then
MARKER_FILE="/tmp/proxmox-boot-tool.dpkg.marker"
if [ ! -e "$MARKER_FILE" ]; then
warn "This system is booted via proxmox-boot-tool, running proxmox-boot-tool init for all configured bootdisks"
- loop_esp_list init_boot_disks
+ proxmox-boot-tool reinit
+ proxmox-boot-tool refresh
touch "$MARKER_FILE"
exit 0
else
diff --git a/bin/proxmox-boot-tool b/bin/proxmox-boot-tool
index 178b6fb..5197f5b 100755
--- a/bin/proxmox-boot-tool
+++ b/bin/proxmox-boot-tool
@@ -124,7 +124,7 @@ format() {
exit 0
}
-init() {
+init_bootloader() {
part="$1"
_get_partition_info "$part"
@@ -174,8 +174,20 @@ init() {
echo "Adding '$part' to list of synced ESPs.."
_add_entry_to_list_file "$ESP_LIST" "$UUID"
- echo "Refreshing kernels and initrds.."
- refresh
+}
+
+reinit() {
+ if ! (echo "${curr_uuid}" | grep -qE '[0-9a-fA-F]{4}-[0-9a-fA-F]{4}'); then
+ warn "WARN: ${curr_uuid} read from ${ESP_LIST} does not look like a VFAT-UUID - skipping"
+ return
+ fi
+
+ path="/dev/disk/by-uuid/$curr_uuid"
+ if [ ! -e "${path}" ]; then
+ warn "WARN: ${path} does not exist - clean '${ESP_LIST}'! - skipping"
+ return
+ fi
+ init_bootloader "$path"
}
_clean_impl() {
@@ -306,6 +318,7 @@ usage() {
warn ""
warn " $0 format <partition> [--force]"
warn " $0 init <partition>"
+ warn " $0 reinit"
warn " $0 clean [--dry-run]"
warn " $0 refresh [--hook <name>]"
warn " $0 kernel <add|remove> <kernel-version>"
@@ -325,6 +338,10 @@ help() {
echo ""
echo " initialize EFI system partition at <partition> for automatic synchronization of pve-kernels and their associated initrds."
echo ""
+ echo "USAGE: $0 reinit"
+ echo ""
+ echo " reinitialize all configured EFI system partitions from $ESP_LIST."
+ echo ""
echo "USAGE: $0 clean [--dry-run]"
echo ""
echo " remove no longer existing EFI system partition UUIDs from $ESP_LIST. Use --dry-run to only print outdated entries instead of removing them."
@@ -493,7 +510,21 @@ case "$1" in
usage
exit 1
fi
- init "$@"
+ init_bootloader "$@"
+ echo "Refreshing kernels and initrds.."
+ refresh
+ exit 0
+ ;;
+ 'reinit')
+ reexec_in_mountns "$@"
+ shift
+ if [ "$#" -eq 1 ]; then
+ warn "E: no arguments allowed."
+ warn ""
+ usage
+ exit 1
+ fi
+ loop_esp_list reinit "$@"
exit 0
;;
'clean')
--
2.30.2
^ permalink raw reply [flat|nested] 11+ messages in thread
* [pve-devel] [PATCH pve-kernel-meta 3/5] proxmox-boot: refresh based on bootloader config instead of bootmode
2022-02-14 15:57 [pve-devel] [PATCH pve-kernel-meta/pve-installer] improve boot-mode switching Stoiko Ivanov
2022-02-14 15:57 ` [pve-devel] [PATCH pve-kernel-meta 1/5] rename pve-efiboot-manual-kernels to proxmox-boot-manual-kernels Stoiko Ivanov
2022-02-14 15:57 ` [pve-devel] [PATCH pve-kernel-meta 2/5] proxmox-boot: add reinit subcommand Stoiko Ivanov
@ 2022-02-14 15:57 ` Stoiko Ivanov
[not found] ` <<<20220214155737.1444136-4-s.ivanov@proxmox.com>
2022-02-14 15:57 ` [pve-devel] [PATCH pve-kernel-meta 4/5] proxmox-boot: init bootloaders based on esp contents Stoiko Ivanov
` (3 subsequent siblings)
6 siblings, 1 reply; 11+ messages in thread
From: Stoiko Ivanov @ 2022-02-14 15:57 UTC (permalink / raw)
To: pve-devel
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.ivanov@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"
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
+ 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}"
+ 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
}
-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
^ permalink raw reply [flat|nested] 11+ messages in thread
* [pve-devel] [PATCH pve-kernel-meta 4/5] proxmox-boot: init bootloaders based on esp contents
2022-02-14 15:57 [pve-devel] [PATCH pve-kernel-meta/pve-installer] improve boot-mode switching Stoiko Ivanov
` (2 preceding siblings ...)
2022-02-14 15:57 ` [pve-devel] [PATCH pve-kernel-meta 3/5] proxmox-boot: refresh based on bootloader config instead of bootmode Stoiko Ivanov
@ 2022-02-14 15:57 ` Stoiko Ivanov
2022-02-14 15:57 ` [pve-devel] [PATCH pve-kernel-meta 5/5] proxmox-boot: allow to manually specify bootloader Stoiko Ivanov
` (2 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Stoiko Ivanov @ 2022-02-14 15:57 UTC (permalink / raw)
To: pve-devel
in addition to installing the boot loader for the current bootmode
(grub for legacy, systemd-boot for uefi) also install the bootloader
if its config is already present on the ESP.
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
---
bin/proxmox-boot-tool | 26 ++++++++++++++++++++++++--
1 file changed, 24 insertions(+), 2 deletions(-)
diff --git a/bin/proxmox-boot-tool b/bin/proxmox-boot-tool
index 320f49b..c697f64 100755
--- a/bin/proxmox-boot-tool
+++ b/bin/proxmox-boot-tool
@@ -127,6 +127,9 @@ format() {
init_bootloader() {
part="$1"
+ install_sd_boot=""
+ install_grub=""
+
_get_partition_info "$part"
if [ -z "$PARTTYPE" ] || [ "$PARTTYPE" != "$ESPTYPE" ]; then
@@ -150,16 +153,35 @@ init_bootloader() {
echo "Mounting '$part' on '$esp_mp'."
mount -t vfat "$part" "$esp_mp"
+ if [ -e "${esp_mp}/$PMX_LOADER_CONF" ]; then
+ install_sd_boot=1
+ fi
+ if [ -d "${esp_mp}/grub" ]; then
+ install_grub=1
+ fi
+ # always init for the current boot-mode
if [ -d /sys/firmware/efi ]; then
+ install_sd_boot=1
+ else
+ install_grub=1
+ fi
+
+ if [ -n "$install_sd_boot" ]; then
echo "Installing systemd-boot.."
mkdir -p "$esp_mp/$PMX_ESP_DIR"
- bootctl --path "$esp_mp" install
+ bootctl_args="--path ${esp_mp}"
+ if [ ! -d /sys/firmware/efi ]; then
+ bootctl_args="${bootctl_args} --no-variables"
+ fi
+ bootctl ${bootctl_args} 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"
- else
+ fi
+
+ if [ -n "$install_grub" ]; then
echo "Installing grub i386-pc target.."
grub-install.real \
--boot-directory $esp_mp \
--
2.30.2
^ permalink raw reply [flat|nested] 11+ messages in thread
* [pve-devel] [PATCH pve-kernel-meta 5/5] proxmox-boot: allow to manually specify bootloader
2022-02-14 15:57 [pve-devel] [PATCH pve-kernel-meta/pve-installer] improve boot-mode switching Stoiko Ivanov
` (3 preceding siblings ...)
2022-02-14 15:57 ` [pve-devel] [PATCH pve-kernel-meta 4/5] proxmox-boot: init bootloaders based on esp contents Stoiko Ivanov
@ 2022-02-14 15:57 ` Stoiko Ivanov
[not found] ` <<20220214155737.1444136-6-s.ivanov@proxmox.com>
2022-02-14 15:57 ` [pve-devel] [PATCH installer 1/2] remove /mnt/hostrun after install Stoiko Ivanov
2022-02-14 15:57 ` [pve-devel] [PATCH installer 2/2] use proxmox-boot-tool for all uefi installs Stoiko Ivanov
6 siblings, 1 reply; 11+ messages in thread
From: Stoiko Ivanov @ 2022-02-14 15:57 UTC (permalink / raw)
To: pve-devel
this commit adds the optional [--legacy|--uefi] arguments to
`p-b-t init`. If provided the respective boot-loader is installed
(regardless of what is found on the esp, and of the boot-mode)
This should make switching the boot-mode possible without the need
to boot into a live CD, chrooting and manually running the necessary
p-b-t commands.
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
---
bin/proxmox-boot-tool | 47 ++++++++++++++++++++++++++++---------------
1 file changed, 31 insertions(+), 16 deletions(-)
diff --git a/bin/proxmox-boot-tool b/bin/proxmox-boot-tool
index c697f64..68401ee 100755
--- a/bin/proxmox-boot-tool
+++ b/bin/proxmox-boot-tool
@@ -126,6 +126,7 @@ format() {
init_bootloader() {
part="$1"
+ mode="$2"
install_sd_boot=""
install_grub=""
@@ -153,17 +154,25 @@ init_bootloader() {
echo "Mounting '$part' on '$esp_mp'."
mount -t vfat "$part" "$esp_mp"
- if [ -e "${esp_mp}/$PMX_LOADER_CONF" ]; then
- install_sd_boot=1
- fi
- if [ -d "${esp_mp}/grub" ]; then
- install_grub=1
- fi
- # always init for the current boot-mode
- if [ -d /sys/firmware/efi ]; then
- install_sd_boot=1
+ if [ -n "$mode" ]; then
+ if [ "$mode" = "--uefi" ]; then
+ install_sd_boot=1
+ elif [ "$mode" = "--legacy" ]; then
+ install_grub=1
+ fi
else
- install_grub=1
+ if [ -e "${esp_mp}/$PMX_LOADER_CONF" ]; then
+ install_sd_boot=1
+ fi
+ if [ -d "${esp_mp}/grub" ]; then
+ install_grub=1
+ fi
+ # always init for the current boot-mode
+ if [ -d /sys/firmware/efi ]; then
+ install_sd_boot=1
+ else
+ install_grub=1
+ fi
fi
if [ -n "$install_sd_boot" ]; then
@@ -192,7 +201,6 @@ init_bootloader() {
fi
echo "Unmounting '$part'."
umount "$part"
-
echo "Adding '$part' to list of synced ESPs.."
_add_entry_to_list_file "$ESP_LIST" "$UUID"
@@ -339,7 +347,7 @@ usage() {
warn "USAGE: $0 <commands> [ARGS]"
warn ""
warn " $0 format <partition> [--force]"
- warn " $0 init <partition>"
+ warn " $0 init <partition> [--legacy|--uefi]"
warn " $0 reinit"
warn " $0 clean [--dry-run]"
warn " $0 refresh [--hook <name>]"
@@ -530,10 +538,17 @@ case "$1" in
usage
exit 1
fi
- init_bootloader "$@"
- echo "Refreshing kernels and initrds.."
- refresh
- exit 0
+ if [ -z "$2" ] || [ "$2" = "--legacy" ] || [ "$2" = "--uefi" ]; then
+ init_bootloader "$@"
+ echo "Refreshing kernels and initrds.."
+ refresh
+ exit 0
+ else
+ warn "E: invalid 'init' mode '$2'."
+ warn ""
+ usage
+ exit 1
+ fi
;;
'reinit')
reexec_in_mountns "$@"
--
2.30.2
^ permalink raw reply [flat|nested] 11+ messages in thread
* [pve-devel] [PATCH installer 1/2] remove /mnt/hostrun after install
2022-02-14 15:57 [pve-devel] [PATCH pve-kernel-meta/pve-installer] improve boot-mode switching Stoiko Ivanov
` (4 preceding siblings ...)
2022-02-14 15:57 ` [pve-devel] [PATCH pve-kernel-meta 5/5] proxmox-boot: allow to manually specify bootloader Stoiko Ivanov
@ 2022-02-14 15:57 ` Stoiko Ivanov
2022-02-14 15:57 ` [pve-devel] [PATCH installer 2/2] use proxmox-boot-tool for all uefi installs Stoiko Ivanov
6 siblings, 0 replies; 11+ messages in thread
From: Stoiko Ivanov @ 2022-02-14 15:57 UTC (permalink / raw)
To: pve-devel
else the directory lingers around on fresh systems.
follows 8d7ddbde84b3ebde29108b2080977b03853b2b69
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
---
noticed in my last tests - not really related to the series
proxinstall | 1 +
1 file changed, 1 insertion(+)
diff --git a/proxinstall b/proxinstall
index a39d405..bddcc5d 100755
--- a/proxinstall
+++ b/proxinstall
@@ -1937,6 +1937,7 @@ _EOD
syscmd("umount $targetdir/proc");
syscmd("umount $targetdir/sys/firmware/efi/efivars");
syscmd("umount $targetdir/sys");
+ rmdir("$targetdir/mnt/hostrun");
if ($use_zfs) {
syscmd("zfs umount -a") == 0 ||
--
2.30.2
^ permalink raw reply [flat|nested] 11+ messages in thread
* [pve-devel] [PATCH installer 2/2] use proxmox-boot-tool for all uefi installs
2022-02-14 15:57 [pve-devel] [PATCH pve-kernel-meta/pve-installer] improve boot-mode switching Stoiko Ivanov
` (5 preceding siblings ...)
2022-02-14 15:57 ` [pve-devel] [PATCH installer 1/2] remove /mnt/hostrun after install Stoiko Ivanov
@ 2022-02-14 15:57 ` Stoiko Ivanov
6 siblings, 0 replies; 11+ messages in thread
From: Stoiko Ivanov @ 2022-02-14 15:57 UTC (permalink / raw)
To: pve-devel
grub by itself is only used for btrfs/ext4/xfs installs on legacy
systems
for zfs proxmox-boot-tool is used in legacy and uefi mode
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
---
proxinstall | 80 ++++++++++-------------------------------------------
1 file changed, 14 insertions(+), 66 deletions(-)
diff --git a/proxinstall b/proxinstall
index bddcc5d..df65725 100755
--- a/proxinstall
+++ b/proxinstall
@@ -1220,37 +1220,6 @@ sub prepare_proxmox_boot_esp {
die "unable to init ESP and install proxmox-boot loader on '$espdev'\n";
}
-sub prepare_grub_efi_boot_esp {
- my ($dev, $espdev, $targetdir) = @_;
-
- syscmd("mount -n $espdev -t vfat $targetdir/boot/efi") == 0 ||
- die "unable to mount $espdev\n";
-
- eval {
- my $rc = syscmd("chroot $targetdir /usr/sbin/grub-install --target x86_64-efi --no-floppy --bootloader-id='proxmox' $dev");
- if ($rc != 0) {
- if ($boot_type eq 'efi') {
- die "unable to install the EFI boot loader on '$dev'\n";
- } else {
- warn "unable to install the EFI boot loader on '$dev', ignoring (not booted using UEFI)\n";
- }
- }
- # also install fallback boot file (OVMF does not boot without)
- mkdir("$targetdir/boot/efi/EFI/BOOT");
- syscmd("cp $targetdir/boot/efi/EFI/proxmox/grubx64.efi $targetdir/boot/efi/EFI/BOOT/BOOTx64.EFI") == 0 ||
- die "unable to copy efi boot loader\n";
- };
- my $err = $@;
-
- eval {
- syscmd("umount $targetdir/boot/efi") == 0 ||
- die "unable to umount $targetdir/boot/efi\n";
- };
- warn $@ if $@;
-
- die "failed to prepare EFI boot using Grub on '$espdev': $err" if $err;
-}
-
sub extract_data {
my ($basefile, $targetdir) = @_;
@@ -1266,6 +1235,7 @@ sub extract_data {
my $use_zfs = 0;
my $use_btrfs = 0;
+ my $btrfs_uuid;
my $filesys = $config_options->{filesys};
@@ -1492,7 +1462,6 @@ sub extract_data {
}
mkdir "$targetdir/boot";
- mkdir "$targetdir/boot/efi";
mkdir "$targetdir/var";
mkdir "$targetdir/var/lib";
@@ -1616,43 +1585,23 @@ sub extract_data {
if ($use_zfs) {
# do nothing
} elsif ($use_btrfs) {
- my $fsuuid;
my $cmd = "blkid -u filesystem -t TYPE=btrfs -o export $rootdev";
run_command($cmd, sub {
my $line = shift;
if ($line =~ m/^UUID=([A-Fa-f0-9\-]+)$/) {
- $fsuuid = $1;
+ $btrfs_uuid = $1;
}
});
- die "unable to detect FS UUID" if !defined($fsuuid);
+ die "unable to detect FS UUID" if !defined($btrfs_uuid);
- $fstab .= "UUID=$fsuuid / btrfs defaults 0 1\n";
+ $fstab .= "UUID=$btrfs_uuid / btrfs defaults 0 1\n";
} else {
my $root_mountopt = $fssetup->{$filesys}->{root_mountopt} || 'defaults';
$fstab .= "$rootdev / $filesys ${root_mountopt} 0 1\n";
}
- # mount /boot/efi
- # Note: this is required by current grub, but really dangerous, because
- # vfat does not have journaling, so it triggers manual fsck after each crash
- # so we only mount /boot/efi if really required (efi systems).
- if ($boot_type eq 'efi' && !$use_zfs) {
- if (scalar(@$bootdevinfo)) {
- my $di = @$bootdevinfo[0]; # simply use first disk
-
- if ($di->{esp}) {
- my $efi_boot_uuid = $di->{esp};
- if (my $uuid = find_dev_by_uuid ($di->{esp})) {
- $efi_boot_uuid = "UUID=$uuid";
- }
-
- $fstab .= "${efi_boot_uuid} /boot/efi vfat defaults 0 1\n";
- }
- }
- }
-
$fstab .= "$swapfile none swap sw 0 0\n" if $swapfile;
@@ -1791,6 +1740,12 @@ _EOD
write_config("root=ZFS=$zfspoolname/ROOT/$zfsrootvolname boot=zfs\n", "$targetdir/etc/kernel/cmdline");
+ } elsif ($boot_type eq 'efi') {
+ if ($use_btrfs){
+ write_config("root=UUID=$btrfs_uuid ro quiet\n", "$targetdir/etc/kernel/cmdline");
+ } else {
+ write_config("root=/dev/mapper/pve-root ro quiet\n", "$targetdir/etc/kernel/cmdline");
+ }
}
diversion_remove($targetdir, "/usr/sbin/update-grub");
@@ -1823,7 +1778,7 @@ _EOD
foreach my $di (@$bootdevinfo) {
my $dev = $di->{devname};
- if ($use_zfs) {
+ if ($use_zfs || ($boot_type eq 'efi')) {
prepare_proxmox_boot_esp($di->{esp}, $targetdir);
} else {
if (!$native_4k_disk_bootable) {
@@ -1833,18 +1788,11 @@ _EOD
};
push @$bootloader_err_list, $@ if $@;
}
-
- eval {
- if (my $esp = $di->{esp}) {
- prepare_grub_efi_boot_esp($dev, $esp, $targetdir);
- }
- }
- };
- push @$bootloader_err_list, $@ if $@;
+ syscmd("chroot $targetdir /usr/sbin/update-grub") == 0 ||
+ die "unable to update boot loader config\n";
+ }
}
- syscmd("chroot $targetdir /usr/sbin/update-grub") == 0 ||
- die "unable to update boot loader config\n";
};
push @$bootloader_err_list, $@ if $@;
--
2.30.2
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [pve-devel] [PATCH pve-kernel-meta 1/5] rename pve-efiboot-manual-kernels to proxmox-boot-manual-kernels
[not found] ` <<20220214155737.1444136-2-s.ivanov@proxmox.com>
@ 2022-02-16 11:29 ` Fabian Grünbichler
0 siblings, 0 replies; 11+ messages in thread
From: Fabian Grünbichler @ 2022-02-16 11:29 UTC (permalink / raw)
To: Proxmox VE development discussion
needs a (trivial) rebase ;)
On February 14, 2022 4:57 pm, Stoiko Ivanov wrote:
> was forgotten during the general renaming of pve-efiboot ->
> proxmox-boot.
>
> follows commit 8c0a22adfe15dc00cf2194647bb254201d8d187b
>
> Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
> ---
> debian/pve-kernel-helper.postinst | 4 ++++
> proxmox-boot/functions | 2 +-
> 2 files changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/debian/pve-kernel-helper.postinst b/debian/pve-kernel-helper.postinst
> index 891396c..4c78766 100644
> --- a/debian/pve-kernel-helper.postinst
> +++ b/debian/pve-kernel-helper.postinst
> @@ -8,6 +8,10 @@ case "$1" in
> echo "$0: legacy ESP list /etc/kernel/pve-efiboot-uuids found moving to /etc/kernel/proxmox-boot-uuids" 1>&2
> mv /etc/kernel/pve-efiboot-uuids /etc/kernel/proxmox-boot-uuids
> fi
> + if [ -e /etc/kernel/pve-efiboot-manual-kernels ]; then
> + echo "$0: legacy manual kernel list /etc/kernel/pve-efiboot-manual-kernels found moving to /etc/kernel/proxmox-boot-manual-kernels" 1>&2
> + mv /etc/kernel/pve-efiboot-manual-kernels /etc/kernel/proxmox-boot-manual-kernels
> + fi
> ;;
> esac
>
> diff --git a/proxmox-boot/functions b/proxmox-boot/functions
> index b46d198..bdab987 100755
> --- a/proxmox-boot/functions
> +++ b/proxmox-boot/functions
> @@ -4,7 +4,7 @@ set -e
> ESP_LIST="/etc/kernel/proxmox-boot-uuids"
> ESPTYPE='c12a7328-f81f-11d2-ba4b-00a0c93ec93b'
>
> -MANUAL_KERNEL_LIST="/etc/kernel/pve-efiboot-manual-kernels"
> +MANUAL_KERNEL_LIST="/etc/kernel/proxmox-boot-boot-manual-kernels"
> PINNED_KERNEL_CONF="/etc/kernel/proxmox-boot-pin"
> NEXT_BOOT_PIN="/etc/kernel/next-boot-pin"
>
> --
> 2.30.2
>
>
>
> _______________________________________________
> pve-devel mailing list
> pve-devel@lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
>
>
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [pve-devel] [PATCH pve-kernel-meta 3/5] proxmox-boot: refresh based on bootloader config instead of bootmode
[not found] ` <<<20220214155737.1444136-4-s.ivanov@proxmox.com>
@ 2022-02-16 11:31 ` Fabian Grünbichler
0 siblings, 0 replies; 11+ messages in thread
From: Fabian Grünbichler @ 2022-02-16 11:31 UTC (permalink / raw)
To: Proxmox VE development discussion
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.ivanov@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
>
>
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [pve-devel] [PATCH pve-kernel-meta 5/5] proxmox-boot: allow to manually specify bootloader
[not found] ` <<20220214155737.1444136-6-s.ivanov@proxmox.com>
@ 2022-02-16 11:32 ` Fabian Grünbichler
0 siblings, 0 replies; 11+ messages in thread
From: Fabian Grünbichler @ 2022-02-16 11:32 UTC (permalink / raw)
To: Proxmox VE development discussion
On February 14, 2022 4:57 pm, Stoiko Ivanov wrote:
> this commit adds the optional [--legacy|--uefi] arguments to
> `p-b-t init`. If provided the respective boot-loader is installed
> (regardless of what is found on the esp, and of the boot-mode)
would IMHO also make sense for `reinit` to do it for all configured
ESPs? granted, it's likely that people will switch from 'not managed by
p-b-t' to 'managed by p-b-t', and not so likely that they have to switch
from 'managed by p-b-t, UEFI' to 'managed by p-b-t, legacy' or
vice-versa, but it's basically free and you never know ;)
>
> This should make switching the boot-mode possible without the need
> to boot into a live CD, chrooting and manually running the necessary
> p-b-t commands.
>
> Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
> ---
> bin/proxmox-boot-tool | 47 ++++++++++++++++++++++++++++---------------
> 1 file changed, 31 insertions(+), 16 deletions(-)
>
> diff --git a/bin/proxmox-boot-tool b/bin/proxmox-boot-tool
> index c697f64..68401ee 100755
> --- a/bin/proxmox-boot-tool
> +++ b/bin/proxmox-boot-tool
> @@ -126,6 +126,7 @@ format() {
>
> init_bootloader() {
> part="$1"
> + mode="$2"
>
> install_sd_boot=""
> install_grub=""
> @@ -153,17 +154,25 @@ init_bootloader() {
> echo "Mounting '$part' on '$esp_mp'."
> mount -t vfat "$part" "$esp_mp"
>
> - if [ -e "${esp_mp}/$PMX_LOADER_CONF" ]; then
> - install_sd_boot=1
> - fi
> - if [ -d "${esp_mp}/grub" ]; then
> - install_grub=1
> - fi
> - # always init for the current boot-mode
> - if [ -d /sys/firmware/efi ]; then
> - install_sd_boot=1
> + if [ -n "$mode" ]; then
> + if [ "$mode" = "--uefi" ]; then
> + install_sd_boot=1
> + elif [ "$mode" = "--legacy" ]; then
> + install_grub=1
> + fi
> else
> - install_grub=1
> + if [ -e "${esp_mp}/$PMX_LOADER_CONF" ]; then
> + install_sd_boot=1
> + fi
> + if [ -d "${esp_mp}/grub" ]; then
> + install_grub=1
> + fi
> + # always init for the current boot-mode
> + if [ -d /sys/firmware/efi ]; then
> + install_sd_boot=1
> + else
> + install_grub=1
> + fi
> fi
>
> if [ -n "$install_sd_boot" ]; then
> @@ -192,7 +201,6 @@ init_bootloader() {
> fi
> echo "Unmounting '$part'."
> umount "$part"
> -
> echo "Adding '$part' to list of synced ESPs.."
> _add_entry_to_list_file "$ESP_LIST" "$UUID"
>
> @@ -339,7 +347,7 @@ usage() {
> warn "USAGE: $0 <commands> [ARGS]"
> warn ""
> warn " $0 format <partition> [--force]"
> - warn " $0 init <partition>"
> + warn " $0 init <partition> [--legacy|--uefi]"
> warn " $0 reinit"
> warn " $0 clean [--dry-run]"
> warn " $0 refresh [--hook <name>]"
> @@ -530,10 +538,17 @@ case "$1" in
> usage
> exit 1
> fi
> - init_bootloader "$@"
> - echo "Refreshing kernels and initrds.."
> - refresh
> - exit 0
> + if [ -z "$2" ] || [ "$2" = "--legacy" ] || [ "$2" = "--uefi" ]; then
> + init_bootloader "$@"
> + echo "Refreshing kernels and initrds.."
> + refresh
> + exit 0
> + else
> + warn "E: invalid 'init' mode '$2'."
> + warn ""
> + usage
> + exit 1
> + fi
> ;;
> 'reinit')
> reexec_in_mountns "$@"
> --
> 2.30.2
>
>
>
> _______________________________________________
> pve-devel mailing list
> pve-devel@lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
>
>
>
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2022-02-16 11:32 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-14 15:57 [pve-devel] [PATCH pve-kernel-meta/pve-installer] improve boot-mode switching Stoiko Ivanov
2022-02-14 15:57 ` [pve-devel] [PATCH pve-kernel-meta 1/5] rename pve-efiboot-manual-kernels to proxmox-boot-manual-kernels Stoiko Ivanov
[not found] ` <<20220214155737.1444136-2-s.ivanov@proxmox.com>
2022-02-16 11:29 ` Fabian Grünbichler
2022-02-14 15:57 ` [pve-devel] [PATCH pve-kernel-meta 2/5] proxmox-boot: add reinit subcommand Stoiko Ivanov
2022-02-14 15:57 ` [pve-devel] [PATCH pve-kernel-meta 3/5] proxmox-boot: refresh based on bootloader config instead of bootmode Stoiko Ivanov
[not found] ` <<<20220214155737.1444136-4-s.ivanov@proxmox.com>
2022-02-16 11:31 ` Fabian Grünbichler
2022-02-14 15:57 ` [pve-devel] [PATCH pve-kernel-meta 4/5] proxmox-boot: init bootloaders based on esp contents Stoiko Ivanov
2022-02-14 15:57 ` [pve-devel] [PATCH pve-kernel-meta 5/5] proxmox-boot: allow to manually specify bootloader Stoiko Ivanov
[not found] ` <<20220214155737.1444136-6-s.ivanov@proxmox.com>
2022-02-16 11:32 ` Fabian Grünbichler
2022-02-14 15:57 ` [pve-devel] [PATCH installer 1/2] remove /mnt/hostrun after install Stoiko Ivanov
2022-02-14 15:57 ` [pve-devel] [PATCH installer 2/2] use proxmox-boot-tool for all uefi installs Stoiko Ivanov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox