initial working
This commit is contained in:
185
scripts/fix-vm-access.sh
Executable file
185
scripts/fix-vm-access.sh
Executable file
@@ -0,0 +1,185 @@
|
||||
#!/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!"
|
||||
Reference in New Issue
Block a user