fredag 9 maj 2014

Hard disk Firmware update on the Linux command line

Sometimes you will find that your hard disk is slow, or there are some other issues with disk performance. If you are lucky, the disk is not broken. It could have some firmware bugs, and if you are even more lucky, the manufacturer could have issued a firmware update. I've updated several hard disk firmwares in the past. Usually you have to use a boot disk with DOS or something to update the firmware.

Why updating firmware?


One of my hard disks in the past needed a new firmware because it was dropping out from a RAID controller. It began working fine after the firmware update.

The latest hard disk that needed firmware update was Seagate 15k.7 ST3450857SS SAS. I noticed that the disks sometimes slowed down during writes and even stalled. I use two 450GB disks in software RAID 1.

By googling I found that there were other people having similar problems with the same disk and that there were actually a firmware update available from Seagate. Also Dell, HP and IBM seems to have this firmware update available for their particular server systems. If you have a drive coming from Dell or some other server manufacturer, your disk has probably a custom firmware. You should not mix firmware. Also the firmware update tools will not allow updating disks with different firmware used by a different manufacturer, despite that it is actually the same hard disk.

You can check if there are any firmware updates for your Seagate disk at https://apps1.seagate.com/downloads/request.html. You need to enter the serial number of your disk.

Seagate's firmware update for linux for the ST3450857SS disk was named Cheetah15K7-Eagle-SAS-StdOEM-000B.zip.

Seagate command line tool


The nice thing with this firmware update is that it contains a linux tool, dl_sea_fw, for flashing the firmware on a live system. No need for rebooting or FreeDOS USB sticks.

As a side note, it is possible to flash SCSI and SAS disks with the free linux command line tool  sg_write_buffer (from the package sg3_utils), but as I don't have experience with this tool, I can't comment on it.

The zip file contained a pdf with instructions and two folders, "firmware" and "linux cli tools". Read the instructions!

Copy the correct firmware from the firmware folder into the "linux cli tools" folder. Open a terminal in the "linux cli tools" folder. Make the command line tools executable by issuing:

chmod +x  dl_sea_fw-0.2.0_64

(or dl_sea_fw-0.2.0_32 for the 32-bit binary on a 32-bit OS)

Make sure to have the sg generic SCSI module loaded in linux to be able to access SCSI or SAS devices behind for instance LSI controllers. See the previous blog post on LSI RAID cards.

Issue the following command to list your hard disks. The output is seen below:

./dl_sea_fw-0.2.0_64 -i
================================================================================
 Seagate Firmware Download Utility v0.2.0 Build Date: Dec 18 2012
 Copyright (c) 2012 Seagate Technology LLC, All Rights Reserved
 Fri May  9 16:29:34 2014
================================================================================
Optiarc   /dev/sg0 MN: DVD                  SN:          FW: 1.01
LSI       /dev/sg1 MN: Logical              SN: 16733438 FW: 3000
ATA       /dev/sg2 MN: WDC WD10EAVS-00D7B0  SN: WD-WCAU4 FW: 1A01
ATA       /dev/sg3 MN: ST31000528AS         SN: 6VP2B44D FW: CC49
SEAGATE   /dev/sg4 MN: ST3450857SS          SN: 3SK1JPXS FW: 0006
SEAGATE   /dev/sg5 MN: ST3450857SS          SN: 6SK00JF9 FW: 0006
ATA       /dev/sg6 MN: SAMSUNG HD502IJ      SN: S1PZJ90Q FW: 1113

The disks that need firmware update are /dev/sg4 and /dev/sg5. Note the last column, FW:. It states that the firmware revision is 0006. The three first digits "000" indicates that the disk has standard Seagate firmware. The new firmware has version 000B and is obviously higher than the installed firmware (B is a hexadecimal digit).

It should be safe to update the disks in a live system, also with software RAID. It is not recommended to run any large IO operations or background disk scans at the same time, however.

Updating the firmware


To update the firmware, issue

./dl_sea_fw-0.2.0_64 -m ST3450857SS -f Cheetah15K7-Eagle-StdOEM-SAS-000B-450GB.lod -d /dev/sg4

where -m is the disk model, -f is the firmware file and -d is the specific device. You can leave out -d to update all devices, but I prefer to do one disk at a time and check that everything went right. The output should say:

Downloading file Cheetah15K7-Eagle-StdOEM-SAS-000B-450GB.lod to /dev/sg4 .  !
Download SUCCESSFUL

Check that the disk firmware is updated with

./dl_sea_fw-0.2.0_64 -i
================================================================================
 Seagate Firmware Download Utility v0.2.0 Build Date: Dec 18 2012
 Copyright (c) 2012 Seagate Technology LLC, All Rights Reserved
 Fri May  9 17:00:11 2014
================================================================================
Optiarc   /dev/sg0 MN: DVD                  SN:          FW: 1.01
LSI       /dev/sg1 MN: Logical              SN: 16733438 FW: 3000
ATA       /dev/sg2 MN: WDC WD10EAVS-00D7B0  SN: WD-WCAU4 FW: 1A01
ATA       /dev/sg3 MN: ST31000528AS         SN: 6VP2B44D FW: CC49
SEAGATE   /dev/sg4 MN: ST3450857SS          SN: 3SK1JPXS FW: 000B
SEAGATE   /dev/sg5 MN: ST3450857SS          SN: 6SK00JF9 FW: 000B
ATA       /dev/sg6 MN: SAMSUNG HD502IJ      SN: S1PZJ90Q FW: 1113

You can tell that the firmware update was successful by checking the Firmware revision. Now it says 000B.

The smartctl command also allows you to check the firmware:

smartctl -i /dev/sg4

=== START OF INFORMATION SECTION ===
Vendor:               SEAGATE
Product:              ST3450857SS
Revision:             000B

Now I only have to monitor the disk performance and see if the firmware update helped.

Disclaimer! I don't take responsibility for what you do with the information provided in this blog post. The information is provided as is. I don't have any connection with the trademarks mentioned in this blog post.