#!/usr/bin/env bash # Make validator VMIDs (1000-1004) writable by running e2fsck on their rootfs. # Fixes "Read-only file system" / JNA UnsatisfiedLinkError when Besu tries to write temp files. # SSHs to r630-01 (1000,1001,1002) and ml110 (1003,1004), stops each CT, e2fsck, starts. # # Usage: ./scripts/maintenance/make-validator-vmids-writable-via-ssh.sh [--dry-run] # Run from project root. Requires SSH to r630-01 and ml110 (root, key-based). set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" [[ -f "${PROJECT_ROOT}/config/ip-addresses.conf" ]] && source "${PROJECT_ROOT}/config/ip-addresses.conf" 2>/dev/null || true R630_01="${PROXMOX_HOST_R630_01:-192.168.11.11}" ML110="${PROXMOX_ML110:-192.168.11.10}" SSH_OPTS="-o ConnectTimeout=15 -o StrictHostKeyChecking=accept-new" # Validators: 1000,1001,1002 on r630-01; 1003,1004 on ml110 VALIDATORS=( "1000:$R630_01" "1001:$R630_01" "1002:$R630_01" "1003:$ML110" "1004:$ML110" ) DRY_RUN=false [[ "${1:-}" == "--dry-run" ]] && DRY_RUN=true log_info() { echo -e "\033[0;34m[INFO]\033[0m $1"; } log_ok() { echo -e "\033[0;32m[✓]\033[0m $1"; } log_warn() { echo -e "\033[0;33m[⚠]\033[0m $1"; } echo "" echo "=== Make validator VMIDs writable (e2fsck) ===" echo " dry-run=$DRY_RUN" echo "" for entry in "${VALIDATORS[@]}"; do IFS=':' read -r vmid host <<< "$entry" if ! ssh $SSH_OPTS "root@$host" "echo OK" 2>/dev/null; then log_warn "Cannot SSH to $host; skip VMID $vmid" continue fi log_info "VMID $vmid @ $host: stop, e2fsck, start..." status=$(ssh $SSH_OPTS "root@$host" "pct status $vmid 2>/dev/null | awk '{print \$2}'" 2>/dev/null || echo "missing") if [[ "$status" == "missing" || -z "$status" ]]; then log_warn " VMID $vmid not found; skip" continue fi if $DRY_RUN; then log_info " [dry-run] would: pct stop $vmid; e2fsck -f -y /dev/pve/vm-${vmid}-disk-0; pct start $vmid" continue fi ssh $SSH_OPTS "root@$host" "pct stop $vmid 2>/dev/null || true" sleep 2 out=$(ssh $SSH_OPTS "root@$host" "lvchange -ay /dev/pve/vm-${vmid}-disk-0 2>/dev/null; e2fsck -f -y /dev/pve/vm-${vmid}-disk-0 2>&1" || true) echo "$out" | tail -2 if echo "$out" | grep -q "FILE SYSTEM WAS MODIFIED\|No errors detected\|e2fsck"; then log_ok " e2fsck done for $vmid" else log_warn " e2fsck may have failed for $vmid (LV name may differ)" fi ssh $SSH_OPTS "root@$host" "pct start $vmid 2>/dev/null" || log_warn " pct start $vmid failed" sleep 2 if ssh $SSH_OPTS "root@$host" "pct exec $vmid -- touch /tmp/.w 2>/dev/null && pct exec $vmid -- rm -f /tmp/.w 2>/dev/null"; then log_ok " VMID $vmid writable" else log_warn " VMID $vmid /tmp may still be read-only" fi done echo "" log_ok "Done. Restart validators: bash scripts/fix-all-validators-and-txpool.sh" log_info "Then: bash scripts/monitoring/monitor-blockchain-health.sh" echo ""