Image credit: [**pixabay**](https://pixabay.com/) Image credit: pixabay

Updating HP enterprise SSD firmware on Debian

I recently bought two used HP enterprise SSDs for VM storage on Proxmox. These are rebranded Intel drives, the specific ones I bought are designed for read intensive workloads because that’s what was available second hand.

Picture of two HP enterprise SSDs in anti-static bags
960GB of Intel enterprise SSD, branded HP

SMART attributes - before

When they arrived I wanted to check basic SMART attributes. Unfortunately, the output of smartctl was not particularly helpful. Many attributes were missing, and others such as Program_Fail_Count_Chip had raw values that made little sense.

SMART Attributes Data Structure revision number: 1
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   130   130   039    Pre-fail  Always       -       98040626
  5 Reallocated_Sector_Ct   0x0033   100   100   001    Pre-fail  Always       -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       5419
173 Unknown_Attribute       0x0033   100   100   001    Pre-fail  Always       -       0
175 Program_Fail_Count_Chip 0x0033   100   100   010    Pre-fail  Always       -       188978498111
180 Unused_Rsvd_Blk_Cnt_Tot 0x003b   130   130   039    Pre-fail  Always       -       98040659
194 Temperature_Celsius     0x0022   100   100   000    Old_age   Always       -       21
196 Reallocated_Event_Count 0x0033   100   100   010    Pre-fail  Always       -       0

Flashing new firmware

Fortunately, HP provides firmware updates for these drives, and a newer version notes that SMART attributes are fixed:

HPG6 introduces bug fixes, reliability enhancement and modification in SMART Attributes.

Unfortunately, updates are provided for Red Hat in RPM format. The specific file I used was firmware-hdd-c566d63ca0-HPG7-4.1.x86_64.rpm, which can be extracted using the rpm2cpio utility as described in this Stack Overflow post.

Assuming the RPM is in /tmp, the following steps will extract the flash utilities:

$ sudo apt install rpm2cpio
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Suggested packages:
  rpm-i18n
The following NEW packages will be installed:
  rpm2cpio
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 1,547 kB of archives.
After this operation, 1,586 kB of additional disk space will be used.
Get:1 http://ftp.uk.debian.org/debian bookworm/main amd64 rpm2cpio amd64 4.18.0+dfsg-1+deb12u1 [1,547 kB]
Fetched 1,547 kB in 0s (8,393 kB/s)
Selecting previously unselected package rpm2cpio.
(Reading database ... 67605 files and directories currently installed.)
Preparing to unpack .../rpm2cpio_4.18.0+dfsg-1+deb12u1_amd64.deb ...
Unpacking rpm2cpio (4.18.0+dfsg-1+deb12u1) ...
Setting up rpm2cpio (4.18.0+dfsg-1+deb12u1) ...
Processing triggers for man-db (2.11.2-2) ...

$ rpm2cpio firmware-hdd-c566d63ca0-HPG7-4.1.x86_64.rpm | cpio -idmv
./usr/lib/x86_64-linux-gnu/firmware-hdd-c566d63ca0-HPG7-4.1
./usr/lib/x86_64-linux-gnu/firmware-hdd-c566d63ca0-HPG7-4.1/.cpq_package.inc
./usr/lib/x86_64-linux-gnu/firmware-hdd-c566d63ca0-HPG7-4.1/.setup
./usr/lib/x86_64-linux-gnu/firmware-hdd-c566d63ca0-HPG7-4.1/4IYRHPG7.bin
./usr/lib/x86_64-linux-gnu/firmware-hdd-c566d63ca0-HPG7-4.1/CP063860.xml
./usr/lib/x86_64-linux-gnu/firmware-hdd-c566d63ca0-HPG7-4.1/hpsetup
./usr/lib/x86_64-linux-gnu/firmware-hdd-c566d63ca0-HPG7-4.1/libsetup.so
./usr/lib/x86_64-linux-gnu/firmware-hdd-c566d63ca0-HPG7-4.1/mnv_cli
./usr/lib/x86_64-linux-gnu/firmware-hdd-c566d63ca0-HPG7-4.1/payload.json
./usr/lib/x86_64-linux-gnu/firmware-hdd-c566d63ca0-HPG7-4.1/setup
./usr/lib/x86_64-linux-gnu/hp-scexe-compat
./usr/lib/x86_64-linux-gnu/hp-scexe-compat/CP063860.scexe
./usr/lib/x86_64-linux-gnu/scexe-compat
./usr/lib/x86_64-linux-gnu/scexe-compat/CP063860.scexe
32127 blocks

# Files are now in /tmp/usr/lib/x86_64-linux-gnu/firmware-hdd-c566d63ca0-HPG7-4.1

Drive updating can now be achieved by running the ./setup script, which interactively prompts for the drive(s) to flash:

$ ./setup
Online HDD/SSD Flash Component for Linux (x64) - VK000240GWTSV, VK000480GWTTA, VK000960GWTTB, VK001920GWTTC, VK003840GWTTD, MK000480GWTTH, MK000960GWTTK, MK001920GWTTL and MK003840GWTTN Drives (HPG7), searching...
1) VK000480GWTTA Drive PHYF0040004E480BGN (Generic HBA 8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode] in Slot ATTR_VALUE_SLOT_UNKNOWN) (HPG7)
2) VK000480GWTTA Drive PHYF004001W9480BGN (Generic HBA 8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode] in Slot ATTR_VALUE_SLOT_UNKNOWN) (HPG7)
Select which devices to flash [#,#-#,(A)ll,(N)one]>

This worked fine on Debian Bookwork, despite the executables mnv_cli and libsetup.so being dynamically linked for Red Hat.

SMART attributes - after

This provided additional SMART data from smartctl, but a number of attributes are still unknown or have unusual raw values.

SMART Attributes Data Structure revision number: 1
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0032   100   100   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       7500
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       34
170 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       0
171 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
172 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
174 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       30
175 Program_Fail_Count_Chip 0x0033   100   100   010    Pre-fail  Always       -       150323792381
183 Runtime_Bad_Block       0x0032   100   100   000    Old_age   Always       -       0
184 End-to-End_Error        0x0033   100   100   090    Pre-fail  Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   079   079   000    Old_age   Always       -       21 (Min/Max 20/22)
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       30
194 Temperature_Celsius     0x0022   100   100   000    Old_age   Always       -       21
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
199 UDMA_CRC_Error_Count    0x003e   100   100   000    Old_age   Always       -       0
225 Unknown_SSD_Attribute   0x0032   100   100   000    Old_age   Always       -       30272
226 Unknown_SSD_Attribute   0x0032   100   100   000    Old_age   Always       -       153
227 Unknown_SSD_Attribute   0x0032   100   100   000    Old_age   Always       -       86
228 Power-off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       449624
232 Available_Reservd_Space 0x0033   100   100   010    Pre-fail  Always       -       0
233 Media_Wearout_Indicator 0x0032   100   100   000    Old_age   Always       -       0
234 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
235 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       150323792381
241 Total_LBAs_Written      0x0032   100   100   000    Old_age   Always       -       30272
242 Total_LBAs_Read         0x0032   100   100   000    Old_age   Always       -       215961
243 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       97537

Astute readers will notice from Power_On_Hours that I mixed up drives here, it did not take 2,081 hours to flash! One of the used SSDs I bought had slightly higher usage than the other, but both had been powered on for less than a year.

Note that some reputable hardware companies will recertify drives and reset these values, and other unscrupulous sellers will reset them without recertifying. Buyer beware for second hand storage.

SMART attributes - fixed

Fortunately it was trivial to make smartctl recognise the drive as an Intel SSDSC2KB480G8P, which is the part that HP rebranded. A quick patch to the drive database is below, and has been submitted to smartmontools bug tracker.

--- /var/lib/smartmontools/drivedb/drivedb.h    2025-02-03 16:40:07.826619214 +0000
+++ /var/lib/smartmontools/drivedb/drivedb.h    2025-02-03 16:43:12.087840636 +0000
@@ -1741,7 +1741,8 @@
       // INTEL SSDSC2KB038T7/SCV10121, INTEL SSDSC2KG240G7/SCV10100,
       // INTEL SSDSC2KB480GZ/7CV10100, INTEL SSDSC2KB076T8/XCV10132,
       // SOLIDIGM SSDSC2KB960GZ/7CV10130
-    "(INTEL|SOLIDIGM) SSDSC(2K|KK)(B|G)(240G|480G|960G|019T|038T|076T)[78Z].?",
+    "(INTEL|SOLIDIGM) SSDSC(2K|KK)(B|G)(240G|480G|960G|019T|038T|076T)[78Z].?|"
+    "VK000(240G|480G|960G|019T|038T|076T)WTTA", // HP OEM Certified Intel drive
     "", "",
   //"-v 5,raw16(raw16),Reallocated_Sector_Ct "
   //"-v 9,raw24(raw8),Power_On_Hours "

Full SMART attributes are now correctly decoded:

SMART Attributes Data Structure revision number: 1
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0032   100   100   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       7500
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       34
170 Available_Reservd_Space 0x0033   100   100   010    Pre-fail  Always       -       0
171 Program_Fail_Count      0x0032   100   100   000    Old_age   Always       -       0
172 Erase_Fail_Count        0x0032   100   100   000    Old_age   Always       -       0
174 Unsafe_Shutdown_Count   0x0032   100   100   000    Old_age   Always       -       30
175 Power_Loss_Cap_Test     0x0033   100   100   010    Pre-fail  Always       -       2557 (34 65535)
183 SATA_Downshift_Count    0x0032   100   100   000    Old_age   Always       -       0
184 End-to-End_Error_Count  0x0033   100   100   090    Pre-fail  Always       -       0
187 Uncorrectable_Error_Cnt 0x0032   100   100   000    Old_age   Always       -       0
190 Drive_Temperature       0x0022   079   079   000    Old_age   Always       -       21 (Min/Max 20/22)
192 Unsafe_Shutdown_Count   0x0032   100   100   000    Old_age   Always       -       30
194 Temperature_Celsius     0x0022   100   100   000    Old_age   Always       -       21
197 Pending_Sector_Count    0x0012   100   100   000    Old_age   Always       -       0
199 CRC_Error_Count         0x003e   100   100   000    Old_age   Always       -       0
225 Host_Writes_32MiB       0x0032   100   100   000    Old_age   Always       -       30272
226 Workld_Media_Wear_Indic 0x0032   100   100   000    Old_age   Always       -       153
227 Workld_Host_Reads_Perc  0x0032   100   100   000    Old_age   Always       -       86
228 Workload_Minutes        0x0032   100   100   000    Old_age   Always       -       449624
232 Available_Reservd_Space 0x0033   100   100   010    Pre-fail  Always       -       0
233 Media_Wearout_Indicator 0x0032   100   100   000    Old_age   Always       -       0
234 Thermal_Throttle_Status 0x0032   100   100   000    Old_age   Always       -       0/0
235 Power_Loss_Cap_Test     0x0033   100   100   010    Pre-fail  Always       -       2557 (34 65535)
241 Host_Writes_32MiB       0x0032   100   100   000    Old_age   Always       -       30272
242 Host_Reads_32MiB        0x0032   100   100   000    Old_age   Always       -       215961
243 NAND_Writes_32MiB       0x0032   100   100   000    Old_age   Always       -       97537

This shows that 968GiB has been written to the drive (32MiB * 30,272), or just under 1TiB. NAND writes are higher but still only 3TiB, a tiny amount in the lifetime of an enterprise drive.

Proxmox is now chugging away with 480GB of mirrored storage on these two drives using ZFS, which should provide plenty of warning if one starts to fail.

David Cannings
David Cannings
Cyber Security

My interests include computer security, digital electronics and writing tools to help analysis of cyber attacks.