Files
proxmox-ha-setup/scripts/fix-vm-access.sh
2025-10-31 21:00:14 +01:00

186 lines
5.2 KiB
Bash
Executable File

#!/bin/bash
# fix-vm-access.sh
# Script per fixare accesso SSH e password su VM che non rispondono
set -e
VM_ID=${1:-201}
SSH_KEY="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOyva+cul3WOW3ct53a0QMRTkhtKvA2QpJI0p8bv48tH alex@alex-XPS-15-9570"
ROOT_PASSWORD="TempProxmox123!"
echo "=== VM Access Fix Tool ==="
echo "VM ID: $VM_ID"
echo ""
# Ferma la VM
echo "⏸ Stopping VM $VM_ID..."
qm stop $VM_ID || true
sleep 5
# Trova il disco
echo "🔍 Finding VM disk..."
DISK_INFO=$(qm config $VM_ID | grep -E "^scsi0:" | head -1)
echo "Disk info: $DISK_INFO"
# Estrai il volume
VOLUME=$(echo "$DISK_INFO" | cut -d: -f2 | cut -d, -f1 | xargs)
echo "Volume: $VOLUME"
# Converti il path del volume in device path
STORAGE_NAME=$(echo $VOLUME | cut -d: -f1)
DISK_NAME=$(echo $VOLUME | cut -d: -f2)
# Check storage type
STORAGE_TYPE=$(pvesm status | grep "^$STORAGE_NAME " | awk '{print $2}')
echo "Storage type: $STORAGE_TYPE"
if [[ $STORAGE_TYPE == "zfspool" ]]; then
# ZFS storage
ZFS_POOL=$(cat /etc/pve/storage.cfg | grep -A5 "^zfspool: $STORAGE_NAME" | grep "pool " | awk '{print $2}')
DEVICE_PATH="/dev/zvol/$ZFS_POOL/$DISK_NAME"
echo "ZFS pool: $ZFS_POOL"
elif [[ $STORAGE_TYPE == "lvmthin" ]] || [[ $STORAGE_TYPE == "lvm" ]]; then
# LVM storage
VG_NAME=$(cat /etc/pve/storage.cfg | grep -A5 "^lvmthin: $STORAGE_NAME\|^lvm: $STORAGE_NAME" | grep "vgname " | awk '{print $2}')
DEVICE_PATH="/dev/$VG_NAME/$DISK_NAME"
echo "LVM VG: $VG_NAME"
elif [[ $STORAGE_TYPE == "dir" ]]; then
# Directory storage
DIR_PATH=$(cat /etc/pve/storage.cfg | grep -A5 "^dir: $STORAGE_NAME" | grep "path " | awk '{print $2}')
DEVICE_PATH="$DIR_PATH/images/$VM_ID/$DISK_NAME"
echo "Directory path: $DIR_PATH"
else
echo "❌ Unknown storage type: $STORAGE_TYPE"
exit 1
fi
echo "Device path: $DEVICE_PATH"
if [ ! -e "$DEVICE_PATH" ]; then
echo "❌ Error: Device $DEVICE_PATH not found!"
if [[ $STORAGE_TYPE == "zfspool" ]]; then
echo "Available ZFS volumes:"
zfs list -t volume | grep vm-$VM_ID
else
echo "Available LVM volumes:"
lvs | grep vm-$VM_ID
fi
exit 1
fi
# Crea mount point
MOUNT_POINT="/mnt/vm${VM_ID}_rescue"
mkdir -p "$MOUNT_POINT"
echo "📦 Setting up loop device..."
# Setup device mapper per il disco
kpartx -av "$DEVICE_PATH"
sleep 2
# Trova la partizione root (prova diverse possibilità)
ROOT_PART=""
# Per ZFS e LVM, usa kpartx
if [[ $STORAGE_TYPE == "zfspool" ]] || [[ $STORAGE_TYPE == "lvmthin" ]] || [[ $STORAGE_TYPE == "lvm" ]]; then
# Cerca i mapper devices creati da kpartx
DISK_BASENAME=$(basename "$DEVICE_PATH" | sed 's/-/--/g')
for PART in /dev/mapper/${DISK_BASENAME}p1 \
/dev/mapper/${DISK_BASENAME}p2 \
/dev/mapper/*vm-${VM_ID}*p1 \
/dev/mapper/*vm-${VM_ID}*p2 \
/dev/mapper/*vm--${VM_ID}*p1 \
/dev/mapper/*vm--${VM_ID}*p2; do
if [ -e "$PART" ]; then
echo "Testing partition: $PART"
if mount -o ro "$PART" "$MOUNT_POINT" 2>/dev/null; then
if [ -d "$MOUNT_POINT/root" ] && [ -d "$MOUNT_POINT/etc" ]; then
ROOT_PART="$PART"
umount "$MOUNT_POINT"
break
fi
umount "$MOUNT_POINT"
fi
fi
done
fi
if [ -z "$ROOT_PART" ]; then
echo "❌ Could not find root partition!"
echo "Available mapper devices:"
ls -la /dev/mapper/ | grep vm-${VM_ID}
kpartx -dv "$DEVICE_PATH"
exit 1
fi
echo "✓ Found root partition: $ROOT_PART"
# Monta la partizione
echo "📂 Mounting filesystem..."
mount "$ROOT_PART" "$MOUNT_POINT"
echo "🔧 Fixing access..."
# Configura password
echo "Setting root password..."
echo "root:${ROOT_PASSWORD}" | chroot "$MOUNT_POINT" chpasswd 2>/dev/null || \
echo "root:${ROOT_PASSWORD}" > "$MOUNT_POINT/tmp/setpw.txt"
# Crea directory SSH
mkdir -p "$MOUNT_POINT/root/.ssh"
# Aggiungi chiave SSH
echo "Adding SSH key..."
echo "$SSH_KEY" > "$MOUNT_POINT/root/.ssh/authorized_keys"
# Permessi corretti
chmod 700 "$MOUNT_POINT/root/.ssh"
chmod 600 "$MOUNT_POINT/root/.ssh/authorized_keys"
# Fix SSH config
echo "Configuring SSH..."
if [ -f "$MOUNT_POINT/etc/ssh/sshd_config" ]; then
sed -i 's/#*PermitRootLogin.*/PermitRootLogin yes/' "$MOUNT_POINT/etc/ssh/sshd_config"
sed -i 's/#*PubkeyAuthentication.*/PubkeyAuthentication yes/' "$MOUNT_POINT/etc/ssh/sshd_config"
fi
# Se c'era un file temporaneo per la password, crea uno script di startup
if [ -f "$MOUNT_POINT/tmp/setpw.txt" ]; then
cat > "$MOUNT_POINT/etc/rc.local" << 'EOFRC'
#!/bin/bash
if [ -f /tmp/setpw.txt ]; then
cat /tmp/setpw.txt | chpasswd
rm /tmp/setpw.txt
fi
exit 0
EOFRC
chmod +x "$MOUNT_POINT/etc/rc.local"
fi
echo "✓ Configuration applied"
# Sync e unmount
sync
sleep 2
echo "📤 Unmounting..."
umount "$MOUNT_POINT"
kpartx -dv "$DEVICE_PATH"
rmdir "$MOUNT_POINT"
echo "🚀 Starting VM..."
qm start $VM_ID
echo ""
echo "✅ Fix completed!"
echo ""
echo "Wait 30 seconds, then try:"
echo " ssh root@192.168.1.$((200 + VM_ID - 200))"
echo " or"
echo " qm terminal $VM_ID"
echo " Login: root"
echo " Password: $ROOT_PASSWORD"
echo ""
echo "⚠️ Remember to change the password after first login!"