fix: perc-nonraid.sh add JBOD controller enable and per-drive JBOD state

H730 requires two steps: enable JBOD on the controller, then set each
UGood drive to JBOD state. Without both, drives show in perccli but
are invisible to lsblk/the OS. Also skip Onln drives (OS RAID members).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Claude
2026-06-27 04:58:31 +00:00
parent b3aaf999d5
commit 89f8a453b7
+20 -14
View File
@@ -1,10 +1,12 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Convert PERC H730 drives to Non-RAID (per-disk passthrough) mode. # Convert PERC H730 drives to JBOD (per-disk passthrough) mode.
# Run once on the Proxmox host before assigning drives to VMs. # Run once on the Proxmox host before assigning drives to VMs.
# Requires: perccli (install from Dell's website or local .deb) # Requires: perccli (install from Dell's website or local .deb)
# #
# Dell PERC H730 does not have a true HBA/IT mode. Non-RAID mode is the # Dell PERC H730 requires two steps to expose drives to the OS:
# equivalent — each disk is presented directly to the OS with SMART intact. # 1. Enable JBOD mode on the controller
# 2. Set each unconfigured drive to JBOD state
# Without both steps, drives show as UGood in perccli but are invisible to lsblk.
set -euo pipefail set -euo pipefail
@@ -29,23 +31,26 @@ echo "=== Drives on controller 0 ==="
$PERCCLI /c0 /eall /sall show $PERCCLI /c0 /eall /sall show
echo "" echo ""
read -rp "Proceed with converting all non-OS drives to Non-RAID mode? [y/N] " confirm read -rp "Proceed with converting all non-OS drives to JBOD mode? [y/N] " confirm
[[ "$confirm" =~ ^[Yy]$ ]] || { echo "Aborted."; exit 0; } [[ "$confirm" =~ ^[Yy]$ ]] || { echo "Aborted."; exit 0; }
# Identify enclosure IDs (typically 8 for the internal backplane on R730xd) # Step 1: Enable JBOD mode on the controller
echo ""
echo "--- Enabling JBOD mode on controller 0 ---"
$PERCCLI /c0 set jbod=on
echo ""
# Step 2: Set each UGood drive to JBOD state so the OS can see it
# Only targets UGood drives — skips Onln drives (OS RAID members)
ENCLOSURES=$($PERCCLI /c0 /eall show | awk '/^[0-9]/{print $1}' | sort -u) ENCLOSURES=$($PERCCLI /c0 /eall show | awk '/^[0-9]/{print $1}' | sort -u)
for enc in $ENCLOSURES; do for enc in $ENCLOSURES; do
echo ""
echo "=== Processing enclosure $enc ===" echo "=== Processing enclosure $enc ==="
SLOTS=$($PERCCLI /c0 /e"$enc" /sall show | awk '/UGood|Onln|JBOD|DHS/{print $2}' | sort -u) SLOTS=$($PERCCLI /c0 /e"$enc" /sall show | awk '/UGood/{print $2}' | sort -u)
for slot in $SLOTS; do for slot in $SLOTS; do
echo -n " Slot $slot: setting to Good... " echo -n " Slot $slot: setting to JBOD... "
$PERCCLI /c0 /e"$enc" /s"$slot" set good force 2>&1 | grep -i "success\|error\|already" || true $PERCCLI /c0 /e"$enc" /s"$slot" set jbod 2>&1 | grep -i "success\|error\|already" || true
echo -n " Slot $slot: setting to Non-RAID... "
$PERCCLI /c0 /e"$enc" /s"$slot" set nonraid 2>&1 | grep -i "success\|error\|already" || true
done done
done done
@@ -54,5 +59,6 @@ echo "=== Final drive state ==="
$PERCCLI /c0 /eall /sall show $PERCCLI /c0 /eall /sall show
echo "" echo ""
echo "Done. Reboot the host for changes to take full effect." echo "Done. Drives should now be visible to the OS (check with lsblk)."
echo "After reboot, run build-bay-map.sh to map bays to /dev/disk/by-id paths." echo "No reboot required — drives appear immediately after JBOD transition."
echo "Run build-bay-map.sh to map bays to /dev/disk/by-id paths."