Skip to content

Instantly share code, notes, and snippets.

@macedot
Last active January 11, 2026 16:54
Show Gist options
  • Select an option

  • Save macedot/540d935d876f7f6c1637b2204088946f to your computer and use it in GitHub Desktop.

Select an option

Save macedot/540d935d876f7f6c1637b2204088946f to your computer and use it in GitHub Desktop.
Proxmox Node Rename Script
#!/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