Moving to zfs, a journey
The background. I've maintained a server for my home systems for more than 15 years. Originally built as a Frankenstein system, with random available parts during my time running Scalable Informatics (RIP). Rebuilt a number of times since with parts procured from ebay. This server runs a number of my VMs ... yeah yeah ... I can't quite convince myself to go full k8s or k3s on my services. And I like the isolation of the VMs.
The disks I had in there, 4TB units, were used enterprise disks purchased about 5 years ago. I have 10 organized into an 8 disk RAID6 with 2 hot spares, built and managed using mdadm.
I had a set of SSDs in there as well, since changed (as SSDs wear out), for a small/fast 4 disk RAID10 with 1 hot spare.
Well, entropy happens. This is entropy in the physical sense. Things gradually fall apart (maximize entropy). Data decays. Bitrot happens. The spinning disks are all reporting north of 60k hours of operation. That is, apart from the replacements which range from 35k to 45k hours. They are long in the tooth, and beyond their 5 year warranty.
The mdadm array has rarely given me problems. Not never. A few times, on shutdown, the array ejected a disk or two, and then deleted the metadata for the array. That was ... unnerving. I was able to fix it, but ... still ... I moved to software RAID from HW RAID specifically due to my ability to repair a software RAID. With a hardware RAID, this was much harder. And I recall customers occasionally losing data due to a failed hardware RAID card from my time at Scalable.
Add to this, a great wipeout of data had occured thanks to a failed disk and some background file system optimization processes I was running. In the past, I've never had an issue with xfs_fsr. And even today, I don't blame xfs_fsr.
Basically, there was a write error on a drive. I run scans monthly, and they are supposed to catch them and flag them. Needless to say, this didn't happen. This write error was eventually traced to a failed SATA/SAS card and cable, both replaced.
But the damage was done. For those who don't know, xfs_fsr remaps/moves blocks of data around on the file system so as to be sequentially accessible. I'd been using it for years (well, more than a decade). The tool does not check data integrity. Nor does the file system, nor the mdadm RAID on read or write.
It just moves blocks.
I think you can see where this was going.
I had a bad block generator, which occasionally wrote bad block in a read-modify-write cycle, and a file system block mover, wandering all over my file system ... my 20-ish TB file system, containing about 20+ years of data ... it was/is my backup ...
I was an expert with xfs_repair. And hardware debugging/remediation. And Linux internals. I found and fixed the hardware problems. That took about a week. The xfs_repair (not a single repair cycle, but many) took about 2 weeks. At the end of it, I had lost, maybe, 75% of my data.
None of it was irreplaceable, I recovered most of it. But I got a really good scare out of that. And I swore I would eventually shift to zfs when I had the chance.
That was 3 years ago.
About a month ago, I was reviewing system logs, and saw enough smart errors that I thought "I should really do something about that".
So, I bought 5 (new) 14TB enterprise drives. Got them into the unit. Turned it on, and ...
It powered off as it started spinning up the drives. Sure enough, the power supply was old, and the disk rails didn't have enough power. So, lets get a new 1kW power supply.
Put that in, wire it all up and ...
Works.
Ok, lets pull down the latest zfs-on-linux (2.1.2 as of then), build it against this kernel (5.10.x). Then, create my zpool
zpool create storage mirror ata-ST14000NM001G-2KJ103_ZL2H871A ata-ST14000NM001G-2KJ103_ZL2HBL8G mirror ata-ST14000NM001G-2KJ103_ZL2HCAQ7 ata-ST14000NM001G-2KJ103_ZL2HCP50 spare ata-ST14000NM001G-2KJ103_ZL2HQJ4W
zpool set autoreplace=on storage
Make sure it worked
# zpool status
pool: storage
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
storage ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ata-ST14000NM001G-2KJ103_ZL2H871A ONLINE 0 0 0
ata-ST14000NM001G-2KJ103_ZL2HBL8G ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
ata-ST14000NM001G-2KJ103_ZL2HCAQ7 ONLINE 0 0 0
ata-ST14000NM001G-2KJ103_ZL2HCP50 ONLINE 0 0 0
spares
ata-ST14000NM001G-2KJ103_ZL2HQJ4W AVAIL
errors: No known data errors
That is, it is a stripe across a pair of mirrors (RAID1's), with a hot spare. And autoreplace turned on so if a drive fails, it will be, autoreplaced from hot spare pool.
Then create the file system atop the pool
zfs create -o compression=zstd storage/data
zfs set atime=off storage/data
Then I rsynced the data over from the mdadm array to the zfs array. It was quite pleasing to see 500MB/s to 1GB/s read and write going during this time. Took about 50k seconds, less than a day, to move the data. And now
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
storage 9.06T 16.3T 104K /storage
storage/data 9.06T 16.3T 9.06T /storage/data
I've got about 25TB total storage, using 9TB (with compression).
All working, right? Right?
Well, no. Turns out the zfs-on-linux package doesn't know much about debian, and prefers to try to use dracut level rather than systemd level to deal with the arrays. This causes pain.
A few frustrating hours and many reboots later, I came to debug what the project shipped as its startup mechanism. I wrote my own unit file, added it into systemd, and voila, I get the arrays mounted on reboot.
I've now commented out the /etc/fstab
entry for the xfs file system, made a soft-link, and the system is working perfectly ... apart from the VMs not being launched automatically on boot. That is a systemd ordering issue, and a solvable one at that, I've just not spent time to do it yet.
Next up is gutting this system, and replacing MB and CPU with something from this decade, as compared to the 2000s ...
And finally figuring out the long term backup I need for this.