No. 26 Writing · Tech

From Hardware RAID to ZFS on My R720xd

Contents Introduction

From Hardware RAID to ZFS on My R720xd

My server thinks it’s an R720.

The firmware says “PowerEdge R720”. But the front has 24 drive bays and the back has two more, and only the R720xd has that layout. So it’s an xd with an identity crisis. Relatable, honestly.

Last night I pulled its hardware RAID card, put in a Dell HBA330, and reinstalled Proxmox on ZFS. I bought zero new drives. Here’s what it looked like before, what I did, and how it went.

Hardware usually has opinions. This time it mostly kept them to itself.

TD-LAB-02 · FIG 1 · The storage path, before and after Before: seven disks into the PERC H710P Mini, a hardware RAID card, and four virtual disks up to Proxmox VE 8.4 on LVM-thin. After, as built: six disks straight through the HBA330 into ZFS, three pools up to Proxmox VE 9.2. Seven disksSATA + SAS PERC H710P Minicame out 1 Virtual disks× 4 Proxmox VE 8.4on LVM-thin Six disksSATA + SAS HBA330went in 2 ZFSchecksums, mirrors,snapshots Proxmox VE 9.23 pools on ZFS BEFORE hardware RAID AFTER pass-through AS BUILT
Title
The storage path, before and after
Scale
NTS
Rev
B
Date
2026-09-29
Dwg no
TD-LAB-02 · FIG 1
Same disks, minus one. The difference is who gets to see them.

Hover or tap anything numbered.

Before: the RAID card was hiding things

The server ran a PERC H710P Mini, Dell’s hardware RAID card. It took the physical disks, grouped them into virtual disks, and handed Proxmox only those. Proxmox put LVM-thin on top and never saw a real drive.

That’s fine until you want ZFS. ZFS wants raw disks so it can checksum every block, run its own mirrors and take its own snapshots. It can’t do that through a card that’s pretending.

Turns out the card was also hiding problems.

Before touching anything, I had an AI agent inspect the box, read-only. It dug through the logs and came back with this:

  • In late August, the PERC reset both of my Gigastone SSDs and logged one of them as “not functioning correctly” and then “removed”. It was all sitting in the iDRAC’s lifecycle log.
  • Both Gigastones still passed SMART, with 6 and 22 reallocated sectors. Not dead. Just not trustworthy.
  • One of the two 15k SAS drives in the back, half of the RAID1 that Proxmox booted from, reported “HARDWARE IMPENDING FAILURE” with 16 grown defects.

So the boot mirror was one bad day away from being a boot drive, and two SSDs were quietly getting kicked out by the card. Cool cool cool.

DriveHealth before the swapNow
2× Gigastone 256 GB SSDSMART passed; 6 and 22 reallocated sectorsrpool, bays 0 and 1
Seagate ST300MP0004, 300 GB 15k SAS0 defects, about 55,500 hours powered onrpool, rear bay 24
2× Crucial MX500 500 GB SSDpassed; 64% and 90% life leftfast, bays 2 and 3
Crucial MX500 1 TB SSDpassed; 84% life leftbulk, bay 4
Seagate ST9300653SS, 300 GB 15k SAS”HARDWARE IMPENDING FAILURE”, 16 grown defectsout of rear bay 25, for good

Proxmox 8 went end of life in August, and everything on the old install was disposable. A clean reinstall cost me nothing.

The card

The HBA330 (Dell part J7TNV) is an LSI SAS3008 at 12 Gb/s in pass-through mode. No RAID, no virtual disks, no opinions. Every disk shows up as itself.

The catch: Dell doesn’t list the HBA330 for the R720 or R720xd. But it’s the same chip and the same Linux driver (mpt3sas) as the widely used LSI 9300-8i. So Linux seeing it was a safe bet. Booting from it was the open question.

Three pools, no new drives

I didn’t buy drives for this. Everything in the box that was still healthy got a job.

TD-LAB-02 · FIG 2 · Three pools, no new drives Three ZFS pools from drives already in the server. rpool, 3-way mirror: Gigastone 256 GB #1, Gigastone 256 GB #2, ST300MP0004, about 220 GiB, for boot and isos. fast, mirror: MX500 500 GB #1, MX500 500 GB #2, about 450 GiB, for vm disks. bulk, single disk: MX500 1 TB, about 930 GiB, for scratch and sandboxes. Set aside: the failing ST9300653SS, pulled from rear bay 25. 6 drives kept, 0 bought, 1 set aside. rpool 3-way mirror Gigastone 256 GB #1Gigastone 256 GB #2ST300MP0004 ≈ 220 GiB Boot and ISOs 1 fast mirror MX500 500 GB #1MX500 500 GB #2 ≈ 450 GiB VM disks 2 bulk single disk MX500 1 TB ≈ 930 GiB Scratch and sandboxes 3 set aside not replaced ST9300653SS FAILING pulled fromrear bay 25 4 6 drives kept · 0 bought · 1 set aside
Title
Three pools, no new drives
Scale
NTS
Rev
B
Date
2026-09-29
Dwg no
TD-LAB-02 · FIG 2
Every healthy drive gets a job. The one that isn't healthy gets a drawer.

Hover or tap anything numbered.

  • rpool holds Proxmox itself and ISOs. It’s a 3-way mirror: both Gigastones plus the good 15k SAS drive. About 220 GiB usable.
  • fast holds VM disks. It’s a mirror of the two 500 GB MX500s. About 450 GiB.
  • bulk is scratch and sandboxes. The 1 TB MX500 on its own, about 930 GiB. Losing it costs nothing.

Why three disks just to boot? Because I don’t trust the Gigastones. They were flaky behind the old card, so the healthy SAS drive is a third copy. If both Gigastones die, the server still runs and still boots from the SAS drive.

Is a mirror of two sketchy SSDs and a 15k spinner what a storage textbook would draw? No. It’s what I have.

TD-LAB-02 · FIG 3 · Bay map, as built As built. The 24 front bays, 0 far left to 23 far right: 0 Gigastone 256 GB (rpool), 1 Gigastone 256 GB (rpool), 2 MX500 500 GB (fast), 3 MX500 500 GB (fast), 4 MX500 1 TB (bulk); 5 to 23 empty. Rear flex bays: 24 ST300MP0004 (rpool); 25 empty. Gigastone 0 Gigastone 1 MX500 500 2 MX500 500 3 MX500 1TB 4 567891011 121314151617181920212223 FRONT · 24 BAYS REAR · FLEX 15k SAS 24 rpool 25 empty rpool fast bulk empty
Title
Bay map, as built
Scale
NTS
Rev
B
Date
2026-09-29
Dwg no
TD-LAB-02 · FIG 3
Five SSDs up front, one spinner out back, and twenty bays of optimism.

Hover or tap anything numbered.

Every drive went where that map says. The failing one isn’t coming back.

The installer’s 10% rule

The Proxmox installer has opinions too. It refuses to build a mirror if the disks differ in size by more than 10%. The error literally says “Mirrored disks must have same size”.

The Gigastones are about 238 GiB each. The SAS drive is about 279 GiB, roughly 17% bigger. So the installer said no.

TD-LAB-02 · FIG 4 · Mirror members, to scale Bars to scale from 0 to 300 GiB: both Gigastones about 238 GiB, the ST300MP0004 about 279 GiB. A band marks the installer's 10% limit, from 238 to 261.8 GiB. Both Gigastones sit inside it; the SAS drive is about 17% larger and lands outside, so it joined the mirror after the install. 300 GiB2001000 300 GiB2001000 Gigastone #1 ≈ 238 GiB Gigastone #2 ≈ 238 GiB ST300MP0004 15k SAS ≈ 279 GiB · +17% installer's limit +10%
Title
Mirror members, to scale
Scale
TO SCALE
Rev
B
Date
2026-09-29
Dwg no
TD-LAB-02 · FIG 4
Two fit, one doesn't. The SAS drive waited outside and joined after the install.

So Proxmox 9.2 went onto the two Gigastones only. After that, the SAS drive was attached as the third copy, with its own boot partition.

Two more tricks. The boot pool is capped at 220 GiB, so any SSD of 240 GB or more can replace a boot disk later. And during the install, every other drive was slid 2–3 cm out of its bay. The installer pre-selects every disk it sees; this made erasing the wrong one impossible.

Lazy-proofing. My favorite kind.

Two cables, 26 bays

The HBA330 has two ports. The server has three SAS cables. That math bugged me for a minute.

The third cable never went to the controller. It runs from the front backplane to the two rear flex bays. The front backplane has a SAS expander that feeds all 24 front bays and the 2 rear ones, so two cables from the card reach all 26.

TD-LAB-02 · FIG 5 · Two cables, 26 bays The server from above, simplified. New cables 2 and 3 run from the HBA330 in riser 1 to backplane SAS A and SAS B; its SAS expander feeds all 24 front bays. Cable 4 was untouched and feeds the 2 rear bays. Cable 1, from the system board's J_SASX8, came out with the PERC H710P Mini. FRONT 24 bays backplane + SAS expander SAS BSAS ASAS A1 HBA330 riser 1 PERC H710P Mini came out J_SASX8 flex backplane 2 rear bays REAR 2, 3 · new4 · untouched1 · came out 1 2 3 4
Title
Two cables, 26 bays
Scale
SCHEMATIC
Rev
B
Date
2026-09-29
Dwg no
TD-LAB-02 · FIG 5
Two cables reach all 26 bays, because the backplane does the fanning out.

Hover or tap anything numbered.

The old card’s cable didn’t get moved, it got pulled: the mini PERC has no cable ports, so its cable starts at the system board. Two new cables run from the HBA330 to backplane SAS A and SAS B. The flex-bay cable stayed put.

Me and the agent

The runbook split every step into two columns: You (me, with hands) and Agent (the AI, over SSH, after I say go).

Stages 0 to 9 were mostly mine: shut down, pull the card, cable, close up, sort the drives, install. There’s no virtual console on this server’s management licence, so the install happened on a real VGA monitor and a USB keyboard. A VGA monitor. In 2026.

Once I said “Proxmox is up”, stage 10 was the agent’s: check the card’s firmware, attach the SAS drive to rpool, create fast and bulk, and write down which bay holds which drive.

TD-LAB-02 · FIG 6 · Me and the agent, step by step 2 lanes: Me, Agent. In order: Agent: Shut it down (on my go); hand-off to Me: Swapped the card (PERC out, HBA330 in); Me: Sorted the drives (bay 25 out); Me: Installed Proxmox (on a VGA monitor); hand-off (“Proxmox is up”) to Agent: Checked the firmware (already current); Agent: Built the pools (rpool, fast, bulk); Agent: Wrote down the bays. Shut itdownon my go Swappedthe cardPERC out,HBA330 in Sorted thedrivesbay 25 out InstalledProxmoxon a VGAmonitor Checkedthefirmwarealreadycurrent Built thepoolsrpool, fast,bulk Wrote downthe bays ME hands AGENT over SSH “Proxmox is up”
Title
Me and the agent, step by step
Scale
NTS
Rev
B
Date
2026-09-29
Dwg no
TD-LAB-02 · FIG 6
Hands for me, SSH for the agent. It doesn't get a screwdriver.

It can’t pull a drive. That part is still my job.

How it went

Short version: boring. The good kind.

  • Drives. Every one landed in its planned bay.
  • Fans. A Dell server can crank its fans when it sees a PCIe card it doesn’t recognize. Mine didn’t. They stayed right at the old baseline. No jet engine.
  • Firmware. The card’s firmware was already current. No flashing. The best step is the one you get to skip.
  • Boot. UEFI boot worked, so the legacy-BIOS fallback stayed in the drawer. All three rpool disks can boot the server, so any one of them can die and it still comes up.

Two surprises

Nothing broke. Two things were just weird.

The Gigastones are twins. Both report the same serial number. And the same WWN, which is supposed to be unique worldwide. Linux builds its stable disk names under /dev/disk/by-id from exactly those, so two disks got one link between them. So the pool names those two by bay path instead: the route through the card to the bay each one sits in. The bay map stopped being just tidiness. Move a Gigastone and it shows up under a new name.

No blinking lights. Behind the HBA330, Linux gets no enclosure support, so there’s no command to blink a bay’s locate LED. The bay numbers still come through from the SAS layer, which knows where each disk is plugged in even though it can’t light one up. If a drive dies, I’ll find it by number. And by counting.

What’s next

A couple of hours later, a three-node Talos cluster went on top of fast. That’s a whole other drawing: the stack.

Next is getting that cluster to do something useful. What, exactly? Not decided yet. It’s a homelab.

The full drawing of the server, bays and cables and all, is on Sheet 02.

TD-LAB-02 · Sheet 2 of 3 · Rev B · Checked TD The server The R720xd inside and out, after the PERC H710P Mini → HBA330 swap. Open Sheet 02

Hardware RAID: retired. ZFS: in charge. The server: still convinced it’s an R720.

Post 26 of 26 · Published · Back to top ↑
Matthew DeGarmo, known online as TechDufus
Written by

Matthew, a.k.a. TechDufus

Platform Engineer / Agentic Engineer. I break things, fix them, and write down what actually worked.