From 2a8a4b5e37e87a0a994fe3820b015e051e6259fb Mon Sep 17 00:00:00 2001 From: Stoiko Ivanov Date: Thu, 23 Sep 2021 10:43:17 +0200 Subject: [PATCH] proxmox-boot: fix #3632 copy kernel+initrd unconditionally 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 --- proxmox-boot/zz-proxmox-boot | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/proxmox-boot/zz-proxmox-boot b/proxmox-boot/zz-proxmox-boot index 244fe8e..4bd63a6 100755 --- a/proxmox-boot/zz-proxmox-boot +++ b/proxmox-boot/zz-proxmox-boot @@ -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 -- 2.39.2