Last active
January 11, 2026 16:54
-
-
Save macedot/540d935d876f7f6c1637b2204088946f to your computer and use it in GitHub Desktop.
Proxmox Node Rename Script
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| # Proxmox Node Rename Script v1.6 - FUSE/Bypass Fix for Standalone | |
| # Usage: ./rename_proxmox.sh [OPTIONS] <FULL_HOSTNAME> | |
| # Example: ./rename_proxmox.sh -n horus.localdomain | |
| set -e | |
| DRY_RUN=false | |
| FULL_HOSTNAME="" | |
| while [[ $# -gt 0 ]]; do | |
| case $1 in | |
| -n|--dry-run) | |
| DRY_RUN=true | |
| shift | |
| ;; | |
| *) | |
| FULL_HOSTNAME="$1" | |
| shift | |
| ;; | |
| esac | |
| done | |
| if [ -z "$FULL_HOSTNAME" ]; then | |
| echo "Usage: $0 [-n|--dry-run] <FULL_HOSTNAME>" | |
| exit 1 | |
| fi | |
| NEWHOSTNAME=$(echo "$FULL_HOSTNAME" | cut -d'.' -f1) | |
| OLDHOSTNAME=$(hostname) | |
| OLDHOSTNAME_SHORT=$(hostname -s) | |
| IP=$(grep -v '127.0.0.1\|::1' /etc/hosts | grep -v '^$' | head -1 | awk '{print $1}') | |
| MODE="${DRY_RUN:+DRY RUN - }Renaming Proxmox node" | |
| echo "$MODE: '$OLDHOSTNAME' → '$NEWHOSTNAME' ('$FULL_HOSTNAME')" | |
| echo "IP: $IP" | |
| if $DRY_RUN; then | |
| echo "✅ Dry run complete - no changes." | |
| exit 0 | |
| fi | |
| echo | |
| echo "⚠️ LIVE MODE - Press Enter to continue..." | |
| read | |
| echo "🔓 Unlocking pmxcfs (stops FUSE mount)..." | |
| systemctl stop pveproxy pvedaemon pve-cluster spiceproxy | |
| pmxcfs -l | |
| echo "📁 Working in REAL storage (/var/lib/pve-cluster/):" | |
| # 1. Backup & update system files | |
| cp /etc/hosts /etc/hosts.bak | |
| cp /etc/hostname /etc/hostname.bak | |
| [ -f /etc/mailname ] && cp /etc/mailname /etc/mailname.bak | |
| sed -i "s/$OLDHOSTNAME/$FULL_HOSTNAME/g; s/$OLDHOSTNAME_SHORT/$NEWHOSTNAME/g" /etc/hosts | |
| echo "$IP $FULL_HOSTNAME $NEWHOSTNAME" >> /etc/hosts | |
| echo "$NEWHOSTNAME" > /etc/hostname | |
| echo "$FULL_HOSTNAME" > /etc/mailname | |
| sed -i "s/myhostname = .*/myhostname = $FULL_HOSTNAME/g" /etc/postfix/main.cf 2>/dev/null || true | |
| hostnamectl set-hostname "$FULL_HOSTNAME" | |
| # 2. Migrate cluster config (REAL files) | |
| CLUSTER_DIR="/var/lib/pve-cluster" | |
| OLD_NODE_DIR="$CLUSTER_DIR/nodes/$OLDHOSTNAME_SHORT" | |
| NEW_NODE_DIR="$CLUSTER_DIR/nodes/$NEWHOSTNAME" | |
| mkdir -p "$NEW_NODE_DIR/qemu-server" "$NEW_NODE_DIR/lxc" "$NEW_NODE_DIR/openvz" "$NEW_NODE_DIR/priv" | |
| if [ -d "$OLD_NODE_DIR" ]; then | |
| rsync -a "$OLD_NODE_DIR/" "$NEW_NODE_DIR/" | |
| rm -rf "$OLD_NODE_DIR" | |
| fi | |
| # RRD data | |
| OLD_RRD_NODE="$CLUSTER_DIR/rrdcached/pve2-node/$OLDHOSTNAME_SHORT" | |
| NEW_RRD_NODE="$CLUSTER_DIR/rrdcached/pve2-node/$NEWHOSTNAME" | |
| OLD_RRD_STORAGE="$CLUSTER_DIR/rrdcached/pve2-storage/$OLDHOSTNAME_SHORT" | |
| NEW_RRD_STORAGE="$CLUSTER_DIR/rrdcached/pve2-storage/$NEWHOSTNAME" | |
| mkdir -p "$NEW_RRD_NODE" "$NEW_RRD_STORAGE" | |
| [ -d "$OLD_RRD_NODE" ] && rsync -a "$OLD_RRD_NODE/" "$NEW_RRD_NODE/" && rm -rf "$OLD_RRD_NODE" | |
| [ -d "$OLD_RRD_STORAGE" ] && rsync -a "$OLD_RRD_STORAGE/" "$NEW_RRD_STORAGE/" && rm -rf "$OLD_RRD_STORAGE" | |
| # Storage config | |
| [ -f "$CLUSTER_DIR/storage.cfg" ] && sed -i "s/nodes $OLDHOSTNAME_SHORT/nodes $NEWHOSTNAME/g" "$CLUSTER_DIR/storage.cfg" | |
| echo "✅ Restarting services..." | |
| pmxcfs -u # Unlock | |
| systemctl start pve-cluster pveproxy pvedaemon spiceproxy | |
| sleep 3 | |
| systemctl status pve-cluster --no-pager -l | |
| echo "✅ Done! Reboot NOW to complete the changes → https://$FULL_HOSTNAME:8006" | |
| # sleep 5 | |
| # reboot |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment