Quoting the commit message from [0] verbatim:
thin_check v1.0.x reveals data block ref count issue that is not being
detected by previous versions, which blocks the pool from activation if
there are any leaked blocks. To reduce potential user complaints on
inactive pools after upgrading and also maintain backward compatibility
between LVM and older thin_check, we decided to adopt the 'auto-repair'
functionality in the --clear-needs-check-flag option, rather than
passing --auto-repair from lvm.conf.
[0]: eb28ab94
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
Link: https://lore.proxmox.com/all/20250808140419.119992-3-f.ebner@proxmox.com
258 lines
9.7 KiB
Bash
Executable file
258 lines
9.7 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
# Abort if any command returns an error value
|
|
set -e
|
|
|
|
# This script is called as the last step of the installation of the package.
|
|
# All the package's files are in place, dpkg has already done its automatic
|
|
# conffile handling, and all the packages we depend of are already fully
|
|
# installed and configured.
|
|
|
|
set_lvm_conf() {
|
|
# shellcheck disable=SC3043
|
|
local FORCE="$1"
|
|
LVM_CONF_MARKER="# added by pve-manager to avoid scanning"
|
|
|
|
if [ ! -e /etc/lvm/lvm.conf ]; then
|
|
echo "No /etc/lvm/lvm.conf found - skipping checking the global_filter."
|
|
return
|
|
fi
|
|
|
|
# keep user changes afterwards provided marker is still there..
|
|
if grep -qLF "$LVM_CONF_MARKER" /etc/lvm/lvm.conf && test -z "$FORCE"; then
|
|
return 0 # only do these changes once
|
|
fi
|
|
|
|
export LVM_SUPPRESS_FD_WARNINGS=1
|
|
|
|
OLD_VALUE="$(lvmconfig --typeconfig diff devices/global_filter || true)"
|
|
NEW_VALUE='global_filter=["r|/dev/zd.*|","r|/dev/rbd.*|"]'
|
|
|
|
# update global_filter if:
|
|
# it is empty and there is no marker OR exactly the one we set before 8.1.4
|
|
if (! grep -qF "$LVM_CONF_MARKER" /etc/lvm/lvm.conf && test -z "$OLD_VALUE")\
|
|
|| (echo "$OLD_VALUE" | grep -qF '="r|/dev/zd.*|"');
|
|
then
|
|
SET_FILTER=1
|
|
BACKUP=1
|
|
# print warning if global_filter is set but not our old/new default
|
|
elif test -n "$OLD_VALUE"\
|
|
&& ! echo "$OLD_VALUE" | grep -qF '="r|/dev/zd.*|"'\
|
|
&& ! echo "$OLD_VALUE" | grep -qF "$NEW_VALUE";
|
|
then
|
|
echo "non-default 'global_filter' value '$OLD_VALUE' in /etc/lvm/lvm.conf, not setting '$NEW_VALUE' automatically"
|
|
echo "consider adapting your 'global_filter' manually."
|
|
fi
|
|
# should be the default since bullseye
|
|
if lvmconfig --typeconfig full devices/scan_lvs | grep -qv 'scan_lvs=0'; then
|
|
SET_SCAN_LVS=1
|
|
BACKUP=1
|
|
fi
|
|
if test -n "$BACKUP"; then
|
|
echo "Backing up lvm.conf before setting pve-manager specific settings.."
|
|
cp -vb /etc/lvm/lvm.conf /etc/lvm/lvm.conf.bak
|
|
fi
|
|
NEW_MARKER="$LVM_CONF_MARKER ZFS zvols and Ceph rbds"
|
|
if test -n "$SET_FILTER"; then
|
|
echo "Setting 'global_filter' in /etc/lvm/lvm.conf to prevent zvols and rbds from being scanned:"
|
|
echo "$OLD_VALUE => $NEW_VALUE"
|
|
if test -n "$OLD_VALUE"; then
|
|
if grep -qLF "$LVM_CONF_MARKER" /etc/lvm/lvm.conf; then
|
|
sed -i -e "s/$LVM_CONF_MARKER ZFS zvols/$NEW_MARKER/" /etc/lvm/lvm.conf
|
|
sed -i -e 's!^\([[:space:]]*\)\(global_filter[[:space:]]*=.*\)$!\1# \2\n\1'"$NEW_VALUE"'!' /etc/lvm/lvm.conf
|
|
else
|
|
sed -i -e 's!^\([[:space:]]*\)\(global_filter[[:space:]]*=.*\)$!\1# \2\n\1'"$NEW_MARKER"'\n\1'"$NEW_VALUE"'!' /etc/lvm/lvm.conf
|
|
fi
|
|
else
|
|
cat >> /etc/lvm/lvm.conf <<EOF
|
|
devices {
|
|
$NEW_MARKER
|
|
$NEW_VALUE
|
|
}
|
|
EOF
|
|
fi
|
|
fi
|
|
if test -n "$SET_SCAN_LVS"; then
|
|
echo "Adding scan_lvs=0 setting to /etc/lvm/lvm.conf to prevent LVs from being scanned."
|
|
# comment out existing setting
|
|
sed -i -e 's/^\([[:space:]]*scan_lvs[[:space:]]*=\)/#\1/' /etc/lvm/lvm.conf
|
|
# add new section with our setting
|
|
cat >> /etc/lvm/lvm.conf <<EOF
|
|
devices {
|
|
$LVM_CONF_MARKER LVM volumes
|
|
scan_lvs=0
|
|
}
|
|
EOF
|
|
fi
|
|
|
|
if ! lvmconfig --validate; then
|
|
echo "Invalid LVM config detected - restoring from /etc/lvm/lvm.conf.bak"
|
|
mv /etc/lvm/lvm.conf.bak /etc/lvm/lvm.conf
|
|
fi
|
|
}
|
|
|
|
update_ceph_conf() {
|
|
UNIT='ceph-crash.service'
|
|
|
|
# Don't fail in case user has "exotic" configuration where RADOS
|
|
# isn't available on all nodes for some reason
|
|
/usr/share/pve-manager/helpers/pve-init-ceph-crash || true
|
|
|
|
if systemctl -q is-enabled "$UNIT" 2> /dev/null; then
|
|
deb-systemd-invoke restart "$UNIT" || true
|
|
fi
|
|
}
|
|
|
|
migrate_apt_auth_conf() {
|
|
output=""
|
|
removed=""
|
|
match=0
|
|
|
|
while read -r l; do
|
|
if echo "$l" | grep -q "^machine enterprise.proxmox.com/debian/pve"; then
|
|
match=1
|
|
elif echo "$l" | grep -q "machine"; then
|
|
match=0
|
|
fi
|
|
|
|
if test "$match" = "1"; then
|
|
removed="$removed\n$l"
|
|
else
|
|
output="$output\n$l"
|
|
fi
|
|
done < /etc/apt/auth.conf
|
|
|
|
if test -n "$removed"; then
|
|
if test ! -e /etc/apt/auth.conf.d/pve.conf; then
|
|
echo "Migrating APT auth config for enterprise.proxmox.com to /etc/apt/auth.conf.d/pve.conf .."
|
|
echo "$removed" > /etc/apt/auth.conf.d/pve.conf
|
|
else
|
|
echo "Removing stale APT auth config from /etc/apt/auth.conf"
|
|
fi
|
|
echo "$output" > /etc/apt/auth.conf
|
|
fi
|
|
}
|
|
|
|
# Copied from dh_installtmpfiles/13.24.2
|
|
if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then
|
|
if [ -x "$(command -v systemd-tmpfiles)" ]; then
|
|
systemd-tmpfiles ${DPKG_ROOT:+--root="$DPKG_ROOT"} --create pve-manager.conf || true
|
|
fi
|
|
fi
|
|
|
|
case "$1" in
|
|
triggered)
|
|
# We don't print a status message here, as dpkg already said
|
|
# "Processing triggers for ...".
|
|
|
|
# test if /etc/pve is mounted; else simple exit to avoid
|
|
# error during updates
|
|
test -f /etc/pve/local/pve-ssl.pem || exit 0;
|
|
test -e /proxmox_install_mode && exit 0;
|
|
|
|
# the ExecStartPre doesn't triggers on service reload, so just in case
|
|
pvecm updatecerts --silent || true
|
|
|
|
deb-systemd-invoke reload-or-try-restart pvedaemon.service || true
|
|
deb-systemd-invoke reload-or-try-restart pvestatd.service || true
|
|
deb-systemd-invoke reload-or-try-restart pveproxy.service || true
|
|
deb-systemd-invoke reload-or-try-restart spiceproxy.service || true
|
|
deb-systemd-invoke reload-or-try-restart pvescheduler.service || true
|
|
|
|
exit 0;;
|
|
|
|
configure)
|
|
# Configure this package. If the package must prompt the user for
|
|
# information, do it here.
|
|
|
|
mkdir /etc/pve 2>/dev/null || true
|
|
|
|
if test ! -e /var/lib/pve-manager/apl-info/download.proxmox.com; then
|
|
mkdir -p /var/lib/pve-manager/apl-info
|
|
cp /usr/share/doc/pve-manager/aplinfo.dat /var/lib/pve-manager/apl-info/download.proxmox.com
|
|
pveam update || true
|
|
fi
|
|
|
|
systemctl --system daemon-reload >/dev/null || true
|
|
|
|
# same as dh_systemd_enable (code copied)
|
|
|
|
UNITS="pvedaemon.service pveproxy.service spiceproxy.service pvestatd.service pvebanner.service pvescheduler.service pve-daily-update.timer"
|
|
NO_RESTART_UNITS="pvenetcommit.service pve-guests.service pve-sdn-commit.service pve-firewall-commit.service"
|
|
|
|
for unit in ${UNITS} ${NO_RESTART_UNITS}; do
|
|
deb-systemd-helper unmask "$unit" >/dev/null || true
|
|
|
|
# was-enabled defaults to true, so new installations run enable.
|
|
if deb-systemd-helper --quiet was-enabled "$unit"; then
|
|
# Enables the unit on first installation, creates new
|
|
# symlinks on upgrades if the unit file has changed.
|
|
deb-systemd-helper enable "$unit" >/dev/null || true
|
|
else
|
|
# Update the statefile to add new symlinks (if any), which need to be
|
|
# cleaned up on purge. Also remove old symlinks.
|
|
deb-systemd-helper update-state "$unit" >/dev/null || true
|
|
fi
|
|
done
|
|
|
|
BETA_SOURCES="/etc/apt/sources.list.d/pve-test-for-beta.sources"
|
|
if test -f "$BETA_SOURCES" && dpkg --compare-versions "$2" 'lt' '9.0.1' && dpkg --compare-versions "$2" 'gt' '9.0~~'; then
|
|
printf "\nNOTE: Remove the pve-test repository, which was added during the beta phase.\nYou can (re-)add repositories on the web UI (Node -> Repositories)\n\n"
|
|
rm -v "$BETA_SOURCES" || true
|
|
fi
|
|
|
|
if test ! -e /proxmox_install_mode && test -n "$2" && dpkg --compare-versions "$2" 'lt' '8.1.4~'; then
|
|
# TODO: remove with PVE 10
|
|
# pass FORCE as we want to ensure the filter for RBDs gets added to our existing one.
|
|
set_lvm_conf 1
|
|
else
|
|
set_lvm_conf
|
|
fi
|
|
|
|
if test -n "$2" && dpkg --compare-versions "$2" 'lt' '8.1.11'; then
|
|
update_ceph_conf
|
|
fi
|
|
|
|
if test ! -e /proxmox_install_mode; then
|
|
# modeled after code generated by dh_start
|
|
for unit in ${UNITS}; do
|
|
if test -n "$2"; then
|
|
dh_action="reload-or-restart";
|
|
else
|
|
dh_action="start"
|
|
fi
|
|
if systemctl -q is-enabled "$unit"; then
|
|
deb-systemd-invoke $dh_action "$unit" || true
|
|
fi
|
|
done
|
|
fi
|
|
|
|
if test ! -e /proxmox_install_mode && test -n "$2" && dpkg --compare-versions "$2" 'lt' '7.2-11~'; then
|
|
if test -e /etc/apt/auth.conf ; then
|
|
migrate_apt_auth_conf
|
|
fi
|
|
fi
|
|
|
|
if test -n "$2" && dpkg --compare-versions "$2" 'lt' '9.0.0~15'; then
|
|
printf '\n\nNOTE: Migrating existing RRD metrics data from nodes, storages and virtual guests to new PVE format version - this can take some time!\n\n'
|
|
/usr/libexec/proxmox/proxmox-rrd-migration-tool --migrate || \
|
|
echo "migration failed, see output above for errors and try to migrate existing data manually by running '/usr/libexec/proxmox/proxmox-rrd-migration-tool --migrate'"
|
|
fi
|
|
|
|
if test -n "$2" && dpkg --compare-versions "$2" 'lt' '9.0.4'; then
|
|
if test -e /etc/lvm/lvm.conf && grep "^\s*thin_check_options" /etc/lvm/lvm.conf | grep -qv -- "--clear-needs-check-flag"; then
|
|
printf '\nNOTE: Detected override for 'thin_check_options' without '--clear-needs-check-flag' option in /etc/lvm/lvm.conf\n'
|
|
printf 'Add the option to the override or thin pools with minor issues might not automatically activate anymore!\n\n'
|
|
fi
|
|
fi
|
|
|
|
;;
|
|
|
|
abort-upgrade|abort-remove|abort-deconfigure)
|
|
;;
|
|
|
|
*) echo "$0: didn't understand being called with \`$1'" 1>&2
|
|
exit 0;;
|
|
esac
|
|
|
|
exit 0
|