<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Archiwa Uncategorized - soban</title>
	<atom:link href="https://soban.pl/fr/category/uncategorized-fr/feed/" rel="self" type="application/rss+xml" />
	<link>https://soban.pl/fr/category/uncategorized-fr/</link>
	<description>IT, Linux, Servers, Security</description>
	<lastBuildDate>Tue, 24 Feb 2026 11:13:40 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>
	<item>
		<title>Debian 13 (Trixie) → Proxmox VE 9 – Installation simplifiée sur un Debian pur</title>
		<link>https://soban.pl/fr/installation-proxmox-ve-9-sur-debian-13/</link>
		
		<dc:creator><![CDATA[soban]]></dc:creator>
		<pubDate>Mon, 23 Feb 2026 16:29:36 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://soban.pl/?p=737</guid>

					<description><![CDATA[<p>Proxmox VE 9 est basé sur Debian 13 (Trixie) et introduit un noyau plus récent, des versions mises à jour de LXC et QEMU ainsi qu’une pile de virtualisation améliorée. Ce guide présente une méthode simplifiée et automatisée pour installer Proxmox VE 9 sur un système Debian 13 propre à l’aide de deux scripts d’installation. [&#8230;]</p>
<p>Artykuł <a href="https://soban.pl/fr/installation-proxmox-ve-9-sur-debian-13/">Debian 13 (Trixie) → Proxmox VE 9 – Installation simplifiée sur un Debian pur</a> pochodzi z serwisu <a href="https://soban.pl/fr">soban</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large is-resized"><img fetchpriority="high" decoding="async" width="1024" height="680" src="https://soban.pl/wp-content/uploads/2026/02/image-2-1024x680.png" alt="" class="wp-image-727" style="width:593px;height:auto" srcset="https://soban.pl/wp-content/uploads/2026/02/image-2-1024x680.png 1024w, https://soban.pl/wp-content/uploads/2026/02/image-2-300x199.png 300w, https://soban.pl/wp-content/uploads/2026/02/image-2-768x510.png 768w, https://soban.pl/wp-content/uploads/2026/02/image-2.png 1118w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Proxmox VE 9 est basé sur Debian 13 (Trixie) et introduit un noyau plus récent, des versions mises à jour de LXC et QEMU ainsi qu’une pile de virtualisation améliorée. Ce guide présente une méthode simplifiée et automatisée pour installer Proxmox VE 9 sur un système Debian 13 propre à l’aide de deux scripts d’installation.</p>



<p>La méthode suit la même approche que mon précédent guide Proxmox 8 sur Debian 12, mais adaptée à Debian 13 et Proxmox VE 9.</p>



<h2 class="wp-block-heading">Prérequis</h2>



<ul class="wp-block-list">
<li>Installation fraîche de Debian 13 (Trixie)</li>



<li>Accès root</li>



<li>Connexion Internet</li>
</ul>



<p>Toutes les commandes doivent être exécutées en tant que root.</p>



<h2 class="wp-block-heading">Partie 1 – Préparation du système &amp; installation du noyau Proxmox</h2>



<p>Téléchargez le premier script :</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">wget http://soban.pl/bash/install-proxmox9-part1.sh
chmod +x install-proxmox9-part1.sh
./install-proxmox9-part1.sh</pre></div>



<p>Ce script :</p>



<ul class="wp-block-list">
<li>Définit le nom d’hôte et met à jour le fichier /etc/hosts</li>



<li>Installe le trousseau (keyring) d’archives Proxmox (vérifié via SHA512)</li>



<li>Ajoute le dépôt Proxmox VE 9 pour Debian 13</li>



<li>Effectue une mise à niveau complète du système</li>



<li>Installe proxmox-default-kernel</li>



<li>Redémarre le système</li>
</ul>



<h3 class="wp-block-heading">Contenu de install-proxmox9-part1.sh</h3>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">#!/usr/bin/env bash
set -euo pipefail

# Part 1/2: Debian 13 (Trixie) -&gt; Proxmox VE 9
# - sets /etc/hosts
# - adds PVE repo + installs Proxmox archive keyring (verified by SHA512)
# - full-upgrade
# - installs proxmox-default-kernel
# - reboots

log() { echo "[$(date '+%F %T')] $*"; }
die() { echo "ERROR: $*" &gt;&amp;2; exit 1; }

if [[ "$(id -u)" -ne 0 ]]; then
  die "Run as root."
fi

log "=== Proxmox VE 9 install (part 1/2) on Debian 13 Trixie ==="

if ! grep -qi 'trixie' /etc/os-release; then
  log "WARNING: This does not look like Debian 13 (Trixie). Continue at your own risk."
fi

log "Network interfaces (for reference):"
ip -br -c a || true

CURRENT_HOSTNAME="$(hostname)"
CURRENT_IP="$(hostname -I | awk '{print $1}')"

read -r -p "Hostname for this node [${CURRENT_HOSTNAME}]: " HOSTNAME
HOSTNAME="${HOSTNAME:-$CURRENT_HOSTNAME}"

read -r -p "Primary IP for /etc/hosts [${CURRENT_IP}]: " IPADDR
IPADDR="${IPADDR:-$CURRENT_IP}"

if [[ -z "${HOSTNAME}" || -z "${IPADDR}" ]]; then
  die "Hostname/IP cannot be empty."
fi

log "Setting hostname to: ${HOSTNAME}"
hostnamectl set-hostname "${HOSTNAME}"

log "Backing up /etc/hosts -&gt; /etc/hosts.backup"
cp -a /etc/hosts /etc/hosts.backup

log "Writing /etc/hosts (makes hostname resolvable locally)"
cat &gt; /etc/hosts &lt;&lt;EOT
127.0.0.1       localhost
${IPADDR}       ${HOSTNAME}

# IPv6
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
EOT

log "Installing prerequisites"
apt update
apt install -y wget ca-certificates gnupg

log "Installing Proxmox archive keyring to /usr/share/keyrings/proxmox-archive-keyring.gpg"
KEYRING="/usr/share/keyrings/proxmox-archive-keyring.gpg"
wget -q https://enterprise.proxmox.com/debian/proxmox-release-trixie.gpg -O "${KEYRING}"

log "Verifying SHA512 of keyring"
EXPECTED_SHA512="8678f2327c49276615288d7ca11e7d296bc8a2b96946fe565a9c81e533f9b15a5dbbad210a0ad5cd46d361ff1d3c4bac55844bc296beefa4f88b86e44e69fa51"
ACTUAL_SHA512="$(sha512sum "${KEYRING}" | awk '{print $1}')"

if [[ "${ACTUAL_SHA512}" != "${EXPECTED_SHA512}" ]]; then
  die "Keyring SHA512 mismatch!
Expected: ${EXPECTED_SHA512}
Actual:   ${ACTUAL_SHA512}"
fi

log "Adding Proxmox VE 9 no-subscription repo (Trixie)"
cat &gt; /etc/apt/sources.list.d/pve-install-repo.list &lt;&lt;EOT
deb [arch=amd64 signed-by=/usr/share/keyrings/proxmox-archive-keyring.gpg] http://download.proxmox.com/debian/pve trixie pve-no-subscription
EOT

log "Updating + full-upgrade"
apt update
apt full-upgrade -y

log "Installing Proxmox kernel meta-package: proxmox-default-kernel"
apt install -y proxmox-default-kernel

log "Part 1 done. Rebooting now. After reboot run: ./install-proxmox9-part2.sh"
reboot</pre></div>



<h2 class="wp-block-heading">Partie 2 – Installation de Proxmox VE 9</h2>



<p>Après le redémarrage, téléchargez et exécutez :</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">wget http://soban.pl/bash/install-proxmox9-part2.sh
chmod +x install-proxmox9-part2.sh
./install-proxmox9-part2.sh</pre></div>



<h3 class="wp-block-heading">Contenu de install-proxmox9-part2.sh</h3>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">#!/usr/bin/env bash
set -euo pipefail

# Part 2/2: Debian 13 (Trixie) -&gt; Proxmox VE 9
# - verifies running PVE kernel (unless FORCE=1)
# - installs proxmox-ve + required packages
# - removes Debian kernel packages (keeps pve)
# - updates grub
# - removes os-prober
# - prints URL to GUI

log() { echo "[$(date '+%F %T')] $*"; }
die() { echo "ERROR: $*" &gt;&amp;2; exit 1; }

FORCE="${FORCE:-0}"

if [[ "$(id -u)" -ne 0 ]]; then
  die "Run as root."
fi

log "=== Proxmox VE 9 install (part 2/2) ==="

KERNEL="$(uname -r || true)"
if ! echo "${KERNEL}" | grep -qi 'pve'; then
  if [[ "${FORCE}" != "1" ]]; then
    die "You are NOT running a PVE kernel (uname -r: ${KERNEL}).
Reboot and select the Proxmox kernel first.
If you really want to continue anyway: FORCE=1 ./install-proxmox9-part2.sh"
  else
    log "WARNING: Continuing despite not running PVE kernel because FORCE=1"
  fi
else
  log "OK: running PVE kernel: ${KERNEL}"
fi

log "Update package lists"
apt update

log "Install Proxmox VE packages"
# postfix is optional but commonly installed by docs; choose config during prompts
DEBIAN_FRONTEND=readline apt install -y proxmox-ve postfix open-iscsi chrony

log "Upgrade remaining packages"
apt full-upgrade -y

log "Removing Debian kernel meta-package and non-PVE kernels (best-effort)"
# Remove Debian meta kernel (keeps proxmox kernel)
apt remove -y linux-image-amd64 || true

# Purge any installed linux-image-* that is NOT a pve kernel
mapfile -t KPKGS &lt; &lt;(dpkg -l | awk '/^ii  linux-image-/{print $2}' | grep -vE 'pve|proxmox' || true)
if (( ${#KPKGS[@]} &gt; 0 )); then
  log "Purging non-PVE kernel packages: ${KPKGS[*]}"
  apt purge -y "${KPKGS[@]}" || true
fi

log "Update grub"
update-grub || true

log "Remove os-prober (recommended for servers; avoids odd grub side effects)"
apt remove -y os-prober || true

log "Done. Proxmox UI should be available at:"
IP="$(hostname -I | awk '{print $1}')"
echo "https://${IP}:8006"

log "Login: root + your root password"</pre></div>



<h2 class="wp-block-heading">Accès à l’interface Web</h2>



<p>Après avoir terminé le second script, ouvrez :</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">https://YOUR_SERVER_IP:8006</pre></div>



<p>Connectez-vous avec l’utilisateur <strong>root</strong> et votre mot de passe root. Vous pouvez voir un avertissement de certificat — c’est normal pour une installation récente.</p>



<h2 class="wp-block-heading">Dépannage – erreur 401 Unauthorized (dépôt pve-enterprise)</h2>



<p>Si après l’installation ou lors de l’exécution de <code>apt update</code> vous obtenez l’erreur suivante&nbsp;:</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">Err:8 https://enterprise.proxmox.com/debian/pve trixie InRelease
  401  Unauthorized [IP: 2001:41d0:b00:5900::34 443]
Error: Failed to fetch https://enterprise.proxmox.com/debian/pve/dists/trixie/InRelease  401  Unauthorized
Error: The repository 'https://enterprise.proxmox.com/debian/pve trixie InRelease' is not signed.
Notice: Updating from such a repository can't be done securely, and is therefore disabled by default.</pre></div>



<p>Cela signifie que le <strong>dépôt enterprise</strong> est activé, mais que votre système ne dispose pas d’un abonnement Proxmox valide.  
Dans ce guide, nous utilisons le dépôt <em>pve-no-subscription</em>, il est donc nécessaire de désactiver le dépôt enterprise.</p>



<p>Corrigez le problème en exécutant&nbsp;:</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">mv /etc/apt/sources.list.d/pve-enterprise.sources \
   /etc/apt/sources.list.d/pve-enterprise.sources.disabled

apt update</pre></div>



<p>Après cela, la mise à jour devrait s’exécuter correctement&nbsp;:</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">apt update && apt dist-upgrade -y && apt autoremove -y</pre></div>



<p>Si tout est correctement configuré, vous verrez le message&nbsp;:</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="lang:sh decode:true ">All packages are up to date.</pre></div>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Cette méthode offre une manière propre et contrôlée de déployer Proxmox VE 9 directement sur Debian 13 sans utiliser l’installateur ISO. Elle est particulièrement utile pour les environnements automatisés, les laboratoires et les configurations d’infrastructure personnalisées.</p>
<p>Artykuł <a href="https://soban.pl/fr/installation-proxmox-ve-9-sur-debian-13/">Debian 13 (Trixie) → Proxmox VE 9 – Installation simplifiée sur un Debian pur</a> pochodzi z serwisu <a href="https://soban.pl/fr">soban</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Proxmox Mises à jour automatiques des VM (qm + vzdump) avec tests réseau et restauration automatique</title>
		<link>https://soban.pl/fr/proxmox-vm-auto-upgrade-script-4/</link>
		
		<dc:creator><![CDATA[soban]]></dc:creator>
		<pubDate>Fri, 23 Jan 2026 16:17:10 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://soban.pl/?p=691</guid>

					<description><![CDATA[<p>Dans cet article, je présente un script simple (mais très efficace) pour automatiser les mises à jour des machines virtuelles sur Proxmox VE. Le script peut : Où télécharger le script Vous pouvez télécharger le script directement depuis mon site : soban.pl/bash/upgrade_proxmox_qm.sh Dossiers requis Avant de lancer l’automatisation, créez deux dossiers : un pour les [&#8230;]</p>
<p>Artykuł <a href="https://soban.pl/fr/proxmox-vm-auto-upgrade-script-4/">Proxmox Mises à jour automatiques des VM (qm + vzdump) avec tests réseau et restauration automatique</a> pochodzi z serwisu <a href="https://soban.pl/fr">soban</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full is-resized"><img decoding="async" width="498" height="745" src="https://soban.pl/wp-content/uploads/2026/01/image-1.png" alt="" class="wp-image-681" style="width:452px;height:auto" srcset="https://soban.pl/wp-content/uploads/2026/01/image-1.png 498w, https://soban.pl/wp-content/uploads/2026/01/image-1-201x300.png 201w" sizes="(max-width: 498px) 100vw, 498px" /></figure>



<p>Dans cet article, je présente un script simple (mais très efficace) pour automatiser les mises à jour des machines virtuelles sur Proxmox VE. Le script peut :</p>



<ul class="wp-block-list">
<li>créer une sauvegarde de la VM (optionnel),</li>



<li>démarrer la VM si elle était arrêtée au départ,</li>



<li>effectuer une mise à niveau complète via apt et redémarrer la VM,</li>



<li>lancer des tests réseau avant et après la mise à jour,</li>



<li>restaurer automatiquement depuis la sauvegarde en cas de problème (optionnel),</li>



<li>éteindre la VM à la fin si elle était initialement arrêtée.</li>
</ul>



<h3 class="wp-block-heading">Où télécharger le script</h3>



<p>Vous pouvez télécharger le script directement depuis mon site :</p>



<p><strong>soban.pl/bash/upgrade_proxmox_qm.sh</strong></p>



<h3 class="wp-block-heading">Dossiers requis</h3>



<p>Avant de lancer l’automatisation, créez deux dossiers : un pour les scripts et un pour les logs :</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">mkdir -p /root/automate_scripts /root/logs</pre></div>



<h3 class="wp-block-heading">Installer le script</h3>



<p>Téléchargez le script dans <code>/root/automate_scripts/</code> et rendez-le exécutable :</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">cd /root/automate_scripts
curl -fsSL -o upgrade_proxmox_qm.sh "https://soban.pl/bash/upgrade_proxmox_qm.sh"
chmod +x /root/automate_scripts/upgrade_proxmox_qm.sh</pre></div>



<h3 class="wp-block-heading">Comment ça marche (version courte)</h3>



<ul class="wp-block-list">
<li>D’abord, une <strong>sauvegarde</strong> est créée (vzdump snapshot + zstd) si l’option est activée.</li>



<li>Si la VM était en état <strong>stopped</strong>, le script la démarre et attend <strong>WAIT_TIME</strong> secondes.</li>



<li>Ensuite, le script exécute des <strong>tests réseau AVANT la mise à jour</strong> :
		<ul>
			
			
			
			
		</ul>
	





</li>



<li>Le script exécute apt update/upgrade/dist-upgrade/autoremove/clean puis redémarre la VM (<strong>reboot</strong>).</li>



<li>Après le redémarrage, il attend à nouveau (<strong>WAIT_TIME</strong>) et relance les tests <strong>APRÈS la mise à jour</strong>.</li>



<li>Si les tests échouent et qu’une sauvegarde est disponible, la VM est restaurée automatiquement via <strong>qmrestore</strong>.</li>



<li>Enfin, la VM est arrêtée si elle était initialement arrêtée.</li>
</ul>



<h3 class="wp-block-heading">Lancer le script manuellement</h3>



<p>Le script attend exactement deux arguments :</p>



<ul class="wp-block-list">
<li><code>VMID</code> – l’ID de la VM dans Proxmox</li>



<li><code>TIME_SEC</code> – le temps d’attente après démarrage/redémarrage (en secondes)</li>
</ul>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">/root/automate_scripts/upgrade_proxmox_qm.sh 901 500</pre></div>



<p><strong>Astuce :</strong> adaptez WAIT_TIME au temps réel de démarrage de la VM et à la durée de la mise à jour. En pratique, <code>300</code> à <code>1000</code> secondes fonctionnent très bien selon la VM.</p>



<h3 class="wp-block-heading">Script complet (référence)</h3>



<p>Ci-dessous, le script complet (code et commentaires restent en anglais) :</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">#!/bin/bash

WAIT_TIME=$2  # wait time for VM start/restart (in seconds)
DO_BACKUP="y" # 'y' - create backup, 'n' - skip backup
DO_UPDATE="y" # 'y' - run system update, 'n' - skip update

echo "---------------START---------------"
date
echo "-----------------------------------"

# Argument check
if [ "$#" -ne 2 ]; then
    echo "Usage: $0 &lt;VMID&gt; &lt;TIME_SEC&gt;"
    exit 1
fi

VMID="$1"
TARGET_HOSTNAME=$(/usr/sbin/qm list | grep -w "$VMID" | awk '{print $2}')
VM_STATUS=$(/usr/sbin/qm status "$VMID" | awk '{print $2}')
HOST_MACHINE=$(hostname)
WAS_STOPPED=0

if [ "$VM_STATUS" = "stopped" ]; then
    WAS_STOPPED=1
else
    WAS_STOPPED=0
fi

# Create backup if DO_BACKUP is set to 'y'
backup_result="Backup not attempted"
if [ "$DO_BACKUP" = "y" ]; then
    echo "Creating backup for VM $VMID..."
    BACKUP_OUTPUT=$(/usr/bin/vzdump "$VMID" --storage local --mode snapshot --compress zstd)
    BACKUP_FILE=$(echo "$BACKUP_OUTPUT" | grep -oP 'vzdump-qemu-[^\s]+' | tr -d "'")

    if [ -z "$BACKUP_FILE" ]; then
        echo "Backup failed: No backup file created."
        backup_result="Backup created: NOK"
        exit 1
    else
        echo "Backup created successfully: $BACKUP_FILE"
        backup_result="Backup created: OK"
    fi
else
    echo "Backup not attempted (backup is disabled)."
fi

# Start VM if it was originally stopped
if [ "$WAS_STOPPED" -eq 1 ]; then
    echo "Starting VM $VMID for update..."
    /usr/sbin/qm start "$VMID"
    echo "Waiting $WAIT_TIME seconds for VM to start..."
    sleep "$WAIT_TIME"
fi

# Test functions
perform_ping_test() {
    source="$1"
    target="$2"
    if ssh root@"$source" "ping -c 3 -W 2 $target" &gt;/dev/null 2&gt;&amp;1; then
        echo "Ping from $source to $target: OK"
        return 0
    else
        echo "Ping from $source to $target: NOK"
        return 1
    fi
}

test_curl() {
    source="$1"
    target="$2"
    if ssh root@"$source" "curl -s --head --connect-timeout 5 $target" &gt;/dev/null 2&gt;&amp;1; then
        echo "Curl from $source to $target: OK"
        return 0
    else
        echo "Curl from $source to $target: NOK"
        return 1
    fi
}

perform_local_ping_test() {
    source="$1"
    target="$2"
    if ping -c 3 -W 2 "$target" &gt;/dev/null 2&gt;&amp;1; then
        echo "Ping from $source to $target: OK"
        return 0
    else
        echo "Ping from $source to $target: NOK"
        return 1
    fi
}

DEFAULT_GW=$(/sbin/ip route | grep default | awk '{print $3}')

perform_tests() {
    status=0
    perform_local_ping_test "$HOST_MACHINE" "$TARGET_HOSTNAME" || status=1
    perform_ping_test "$TARGET_HOSTNAME" "8.8.8.8" || status=1
    perform_ping_test "$TARGET_HOSTNAME" "$DEFAULT_GW" || status=1
    test_curl "$TARGET_HOSTNAME" "http://google.com" || status=1
    return ${status:-0}
}

# General tests before update
echo "--- General tests BEFORE update ---"
if perform_tests; then
    echo "All network tests before update: OK"
    echo "$backup_result"

    if [ "$backup_result" == "Backup created: OK" ] || [ "$backup_result" == "Backup not attempted" ]; then
        echo "BEFORE status: OK"
    else
        echo "BEFORE status: NOK"
    fi
else
    echo "Some network tests before update: NOK"
    echo "$backup_result"
    echo "BEFORE status: NOK"
    [ "$WAS_STOPPED" -eq 1 ] &amp;&amp; /usr/sbin/qm shutdown "$VMID"
    exit 1
fi
echo "-----------------------------------"

# System update and reboot
update_result="Upgrade system: NOK"
if [ "$DO_UPDATE" = "y" ]; then
    echo "--- Updating VM $VMID ---"
    if ssh root@"$TARGET_HOSTNAME" "/usr/bin/apt update &amp;&amp; \
                          /usr/bin/apt upgrade -y &amp;&amp; \
                          /usr/bin/apt dist-upgrade -y &amp;&amp; \
                          /usr/bin/apt autoremove -y &amp;&amp; \
                          /usr/bin/apt autoclean &amp;&amp; \
                          /usr/bin/apt clean &amp;&amp; \
                          /usr/bin/apt --purge autoremove &amp;&amp; \
                          /sbin/reboot"; then
        echo "---END Updating VM $VMID ---"
        echo "Upgrade system: OK"
        update_result="Upgrade system: OK"
    else
        echo "Upgrade system: NOK"
        update_result="Upgrade system: NOK"
        [ "$WAS_STOPPED" -eq 1 ] &amp;&amp; /usr/sbin/qm shutdown "$VMID"
        echo "Update failed. Exiting."
        exit 1
    fi
fi

# Wait for VM reboot if update was performed
if [ "$DO_UPDATE" = "y" ]; then
    echo "Waiting $WAIT_TIME seconds for VM to reboot..."
    sleep "$WAIT_TIME"
fi

# Tests after reboot if update was performed
if [ "$DO_UPDATE" = "y" ]; then
    echo "--- Network tests AFTER update ---"
    if perform_tests; then
        echo "All network tests after update: OK"
        echo "$update_result"
        echo "AFTER status: OK"
    else
        echo "Some network tests after update: NOK"
        echo "$update_result"
        echo "Attempting to restore from backup..."

        if [ "$DO_BACKUP" = "y" ]; then
            /usr/sbin/qm stop "$VMID"
            /usr/sbin/qmrestore "/var/lib/vz/dump/$BACKUP_FILE" "$VMID" --force

            if [ "$WAS_STOPPED" -eq 1 ]; then
                /usr/sbin/qm shutdown "$VMID"
            fi

            echo "Restore attempt finished. Please check VM status."
            echo "AFTER status: NOK"
        else
            echo "No backup available for restoration. The VM might not function properly after failed update."
            echo "AFTER status: NOK"
        fi
    fi
    echo "-----------------------------------"
fi

# Shut down VM if it was originally stopped
if [ "$WAS_STOPPED" -eq 1 ]; then
    echo "Shutting down VM $VMID (originally stopped)."
    /usr/sbin/qm shutdown "$VMID"
fi

echo "---------------END---------------"
date
echo "-----------------------------------"</pre></div>



<h3 class="wp-block-heading">Cron (planning hebdomadaire + logs séparés par VM)</h3>



<p>Voici un exemple de crontab : une VM différente est mise à jour chaque jour de la semaine, et les logs sont enregistrés dans des fichiers séparés sous <code>/root/logs/</code>.</p>



<p>Modifier le crontab root :</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">crontab -e</pre></div>



<p>Collez les règles ci-dessous (les commentaires restent en anglais) :</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">15 0 * * 1 /root/automate_scripts/upgrade_proxmox_qm.sh 901 500 &gt; /root/logs/kali.log 2&gt;&amp;1                 # Monday: upgrade Kali Linux (VMID 901)
15 0 * * 2 /root/automate_scripts/upgrade_proxmox_qm.sh 903 500 &gt; /root/logs/proxmox-test-01.log 2&gt;&amp;1      # Tuesday: upgrade proxmox-test-01 (VMID 903)
15 0 * * 3 /root/automate_scripts/upgrade_proxmox_qm.sh 904 500 &gt; /root/logs/ubuntu-lte.log 2&gt;&amp;1           # Wednesday: upgrade ubuntu-lte (VMID 904)
15 0 * * 4 /root/automate_scripts/upgrade_proxmox_qm.sh 905 1000 &gt; /root/logs/backup-machine.log 2&gt;&amp;1      # Thursday: upgrade backup-machine (VMID 905)</pre></div>



<h3 class="wp-block-heading">Vérifications rapides / Dépannage</h3>



<ul class="wp-block-list">
<li>Assurez-vous que root peut se connecter en SSH depuis l’hôte Proxmox vers la VM (le script utilise <code>ssh root@&lt;vm-hostname&gt;</code>).</li>



<li>Vérifiez que DNS (ou <code>/etc/hosts</code>) résout correctement le hostname de la VM sur l’hôte Proxmox.</li>



<li>Si apt demande des confirmations, configurez des mises à niveau non interactives ou bloquez les paquets problématiques.</li>
</ul>



<p>Voilà ! Déposez le script dans /root/automate_scripts/, envoyez les journaux dans /root/logs/, et la maintenance hebdomadaire de votre machine virtuelle devient quasiment automatique.</p>
<p>Artykuł <a href="https://soban.pl/fr/proxmox-vm-auto-upgrade-script-4/">Proxmox Mises à jour automatiques des VM (qm + vzdump) avec tests réseau et restauration automatique</a> pochodzi z serwisu <a href="https://soban.pl/fr">soban</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Dell WD19/WD19S : mise à jour du firmware sur Proxmox/Debian sans timeouts USB (fwupd + correctif autosuspend)</title>
		<link>https://soban.pl/fr/dell-wd19s-mise-a-jour-firmware-proxmox-debian-timeout-usb/</link>
		
		<dc:creator><![CDATA[soban]]></dc:creator>
		<pubDate>Sun, 18 Jan 2026 21:16:28 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://soban.pl/?p=672</guid>

					<description><![CDATA[<p>Si vous essayez de mettre à jour le firmware d’une station d’accueil Dell WD19/WD19S sur Proxmox (ou Debian) via fwupdmgr, vous pouvez tomber sur l’erreur classique Operation timed out pendant l’étape Erasing…. En pratique, la mise à jour échoue à cause de la gestion d’énergie USB (autosuspend). Ci-dessous, vous trouverez un correctif simple et efficace, [&#8230;]</p>
<p>Artykuł <a href="https://soban.pl/fr/dell-wd19s-mise-a-jour-firmware-proxmox-debian-timeout-usb/">Dell WD19/WD19S : mise à jour du firmware sur Proxmox/Debian sans timeouts USB (fwupd + correctif autosuspend)</a> pochodzi z serwisu <a href="https://soban.pl/fr">soban</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="669" src="https://soban.pl/wp-content/uploads/2026/01/image-1024x669.png" alt="" class="wp-image-667" style="aspect-ratio:1.5306645407436934;width:654px;height:auto" srcset="https://soban.pl/wp-content/uploads/2026/01/image-1024x669.png 1024w, https://soban.pl/wp-content/uploads/2026/01/image-300x196.png 300w, https://soban.pl/wp-content/uploads/2026/01/image-768x502.png 768w, https://soban.pl/wp-content/uploads/2026/01/image.png 1113w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><br>Si vous essayez de mettre à jour le firmware d’une station d’accueil Dell WD19/WD19S sur Proxmox (ou Debian) via <code>fwupdmgr</code>, vous pouvez tomber sur l’erreur classique <em>Operation timed out</em> pendant l’étape <strong>Erasing…</strong>. En pratique, la mise à jour échoue à cause de la gestion d’énergie USB (autosuspend). Ci-dessous, vous trouverez un correctif simple et efficace, ainsi qu’un script prêt à l’emploi à lancer sur un serveur ou un ordinateur portable.</p>



<h2 class="wp-block-heading">Symptômes</h2>



<p>Le plus souvent, pendant la mise à jour du firmware du dock (WD19/WD19S), vous verrez une erreur similaire à :</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">failed to write-firmware: failed to erase bank: failed after 5 retries: failed to SetReport: USB error: Operation timed out [-7]</pre></div>



<p>À ce stade, <code>fwupdmgr</code> peut afficher le périphérique WD19S en <strong>Update State: Failed</strong> ou continuer à indiquer <strong>pending activation</strong>, mais le flash ne se termine jamais complètement.</p>



<h2 class="wp-block-heading">Pourquoi cela arrive-t-il ?</h2>



<p>Pendant le flash, le dock effectue des opérations longues. Si le système tente d’économiser de l’énergie sur l’USB (autosuspend), les transferts de contrôle USB peuvent échouer. Résultat : un timeout exactement lors de l’effacement de la banque de firmware (<em>erase bank</em>).</p>



<h2 class="wp-block-heading">Correctif rapide : désactiver l’autosuspend USB pendant la mise à jour</h2>



<p>La solution la plus simple consiste à définir temporairement l’autosuspend à <code>-1</code> (désactivé). Ce paramètre reste actif jusqu’au redémarrage (sauf si vous le rendez permanent via la cmdline du noyau), mais cela suffit largement le temps de la mise à jour.</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">echo -1 &gt; /sys/module/usbcore/parameters/autosuspend</pre></div>



<p>Ensuite, lancez la mise à jour :</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">fwupdmgr refresh --force
fwupdmgr update</pre></div>



<h2 class="wp-block-heading">Après la mise à jour : “pending activation” et nécessité de débrancher le câble</h2>



<p>Après une installation réussie du firmware pour WD19/WD19S, <code>fwupdmgr</code> affiche souvent le message suivant :</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">The update will continue when the device USB cable has been unplugged.
WD19S is pending activation; use fwupdmgr activate to complete the update.</pre></div>



<p>Procédez dans cet ordre précis :</p>



<ul class="wp-block-list">
<li>Débranchez le câble USB-C du dock (côté ordinateur).</li>



<li>(Optionnel) Débranchez l’alimentation du dock pendant 10–15 secondes, puis rebranchez-la.</li>



<li>Rebranchez le câble USB-C.</li>



<li>Lancez l’activation :</li>
</ul>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">fwupdmgr activate</pre></div>



<p>Enfin, vérifiez le statut :</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">fwupdmgr get-updates
fwupdmgr get-devices | less</pre></div>



<h2 class="wp-block-heading">Script prêt à l’emploi : installation + mise à jour + désactivation autosuspend (avec restauration)</h2>



<p>Ci-dessous, un script prêt à l’emploi qui :</p>



<ul class="wp-block-list">
<li>installe <code>fwupd</code></li>



<li>rafraîchit les métadonnées LVFS</li>



<li>désactive temporairement l’autosuspend USB (pour éviter les timeouts sur WD19S)</li>



<li>lance les mises à jour du firmware</li>



<li>restaure ensuite la valeur précédente d’autosuspend (même en cas d’échec)</li>
</ul>



<p>Vous pouvez copier le script directement depuis cet article, mais si vous préférez aller plus vite, vous pouvez le télécharger ici :</p>



<p><strong>https://soban.pl/bash/dell_updage.sh</strong></p>



<p>Exemple de téléchargement et d’exécution :</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">cd /root/scripts
curl -fsSL https://soban.pl/bash/dell_updage.sh -o dell_updage.sh
chmod +x dell_updage.sh
./dell_updage.sh</pre></div>



<p>Si vous voulez prévisualiser le script avant de l’exécuter :</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">curl -fsSL https://soban.pl/bash/dell_updage.sh | less</pre></div>



<p>Si <code>less</code> n’est pas installé :</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">apt update
apt install -y less</pre></div>



<h2 class="wp-block-heading">Script (contenu complet)</h2>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">#!/bin/bash
set -euo pipefail

# dell upgrade:
# - installs fwupd
# - refreshes metadata
# - runs fwupdmgr update
# - TEMPORARILY disables USB autosuspend to avoid WD19/WD19S timeouts
# - restores autosuspend setting after update

echo "[INFO] Installing fwupd..."
apt update
apt install -y fwupd

echo "[INFO] Refreshing firmware metadata..."
fwupdmgr refresh --force
fwupdmgr get-updates || true

# Save current autosuspend value (if exists)
AUTOSUSPEND_PATH="/sys/module/usbcore/parameters/autosuspend"
OLD_AUTOSUSPEND=""

if [[ -f "$AUTOSUSPEND_PATH" ]]; then
  OLD_AUTOSUSPEND="$(cat "$AUTOSUSPEND_PATH" || true)"
  echo "[INFO] Current usbcore autosuspend: ${OLD_AUTOSUSPEND}"
else
  echo "[WARN] autosuspend sysfs file not found: $AUTOSUSPEND_PATH"
fi

restore_autosuspend() {
  if [[ -f "$AUTOSUSPEND_PATH" &amp;&amp; -n "${OLD_AUTOSUSPEND}" ]]; then
    echo "[INFO] Restoring usbcore autosuspend back to: ${OLD_AUTOSUSPEND}"
    echo "${OLD_AUTOSUSPEND}" &gt; "$AUTOSUSPEND_PATH" || true
  fi
}
trap restore_autosuspend EXIT

# Disable autosuspend to prevent USB timeout during dock firmware erase/write
if [[ -f "$AUTOSUSPEND_PATH" ]]; then
  echo "[INFO] Disabling USB autosuspend (set to -1) to avoid dock update timeouts..."
  echo -1 &gt; "$AUTOSUSPEND_PATH"
fi

read -p ""Do you want to update the entire device? (y/n): " answer
if [[ "$answer" == "y" || "$answer" == "Y" ]]; then
  echo "[INFO] Running fwupdmgr update..."
  fwupdmgr update || {
    echo "[ERROR] fwupdmgr update failed."
    echo "[HINT] If this is Dell dock (WD19/WD19S), try: unplug USB-C, replug, then run: fwupdmgr activate"
    exit 1
  }

  echo "[INFO] Update finished."
  echo "[INFO] If you updated a Dell dock and it says 'pending activation':"
  echo "       1) Unplug USB-C cable from the dock"
  echo "       2) (Optional) Unplug dock power for 10 seconds, plug back"
  echo "       3) Run: fwupdmgr activate"
else
  echo "[INFO] Skipping firmware update."
fi

echo "[INFO] Done."</pre></div>



<h2 class="wp-block-heading">Exécuter le script</h2>



<p>Le plus simple :</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">chmod +x dell_updage.sh
./dell_updage.sh</pre></div>



<h2 class="wp-block-heading">FAQ &amp; conseils</h2>



<ul class="wp-block-list">
<li><strong>La mise à jour échoue encore ?</strong> Débranchez tous les périphériques du dock (écrans/LAN/USB), ne laissez que l’alimentation et l’USB-C, faites un hard reset (débranchez l’alimentation 30s), puis réessayez.</li>



<li><strong>“pending activation” après la mise à jour</strong> – c’est normal pour WD19/WD19S. Vous devez débrancher l’USB-C, rebrancher, puis exécuter <code>fwupdmgr activate</code>.</li>



<li><strong>Est-ce que ça met à jour le BIOS du laptop ?</strong> Pas forcément. <code>fwupdmgr</code> liste séparément “System Firmware” (BIOS/UEFI) et le dock. Cet article se concentre sur le dock et le problème de timeout USB.</li>
</ul>



<h2 class="wp-block-heading">Résumé</h2>



<p>Si la mise à jour du firmware Dell WD19/WD19S échoue sur Proxmox/Debian pendant l’étape <em>Erasing…</em>, il suffit dans la plupart des cas de désactiver temporairement l’autosuspend USB. Le script ci-dessus le fait automatiquement, puis restaure le réglage précédent afin que le système continue de fonctionner normalement.</p>
<p>Artykuł <a href="https://soban.pl/fr/dell-wd19s-mise-a-jour-firmware-proxmox-debian-timeout-usb/">Dell WD19/WD19S : mise à jour du firmware sur Proxmox/Debian sans timeouts USB (fwupd + correctif autosuspend)</a> pochodzi z serwisu <a href="https://soban.pl/fr">soban</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
