]> git.proxmox.com Git - pve-kernel-meta.git/commitdiff
proxmox-boot: fix #3632 copy kernel+initrd unconditionally
authorStoiko Ivanov <s.ivanov@proxmox.com>
Thu, 23 Sep 2021 08:43:17 +0000 (10:43 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Fri, 1 Oct 2021 07:09:59 +0000 (09:09 +0200)
do not use the -u (update) flag when copying kernel images and inird
from /boot to the ESPs:
* the ESPs are formatted with vfat, which has a 2 second precision for
  mtime (`linux/fs/fat/misc.c` - `fat_truncate_time`)
* cp -u compares the mtimes of source (kernel image in /boot not on
  vfat) and destination - leading to the copy always being carried
  out, if the source files remain the same (and do not happen to have
  a mtime exactly happening on a even second)

as laid out in the bug-report - the case where this leads to an
unbootable system is when a kernel-version is shipped twice (built
with different tool-chains) - e.g. currently the 5.11 kernels in PVE 6
and PVE 7.

tested the behavior of `cp -u` by running opensnopp-bpfcc and copying
a file twice onto ext4 (opened only once) and on vfat (opened twice).

additionally reproduced the issue (by dist-upgrading a PVE 6 VM to 7
with the pve-no-subscription repo) and verified this patch fixes it.

Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
proxmox-boot/zz-proxmox-boot

index 244fe8ec9c1fe5732ccb1cfed45cf7e4327fe10c..4bd63a6d4b726ccab928b376c7d852b3776c2638 100755 (executable)
@@ -132,21 +132,21 @@ copy_and_config_kernels() {
                        KERNEL_ESP_DIR="${PMX_ESP_DIR}/${kver}"
                        KERNEL_LIVE_DIR="${esp}/${KERNEL_ESP_DIR}"
                        mkdir -p "${KERNEL_LIVE_DIR}"
-                       cp -u --preserve=timestamps "${linux_image}" "${KERNEL_LIVE_DIR}/"
-                       cp -u --preserve=timestamps "${initrd}" "${KERNEL_LIVE_DIR}/"
+                       cp --preserve=timestamps "${linux_image}" "${KERNEL_LIVE_DIR}/"
+                       cp --preserve=timestamps "${initrd}" "${KERNEL_LIVE_DIR}/"
 
                        # 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    /${KERNEL_ESP_DIR}/vmlinuz-${kver}
+                           initrd   /${KERNEL_ESP_DIR}/initrd.img-${kver}
                        EOF
                else
                        warn "  Copying kernel ${kver}"
-                       cp -u --preserve=timestamps "${linux_image}" "${esp}/"
-                       cp -u --preserve=timestamps "${initrd}" "${esp}/"
+                       cp --preserve=timestamps "${linux_image}" "${esp}/"
+                       cp --preserve=timestamps "${initrd}" "${esp}/"
                fi
        done