Updating Crucial SSD Firmware From Linux
March 17th 2015 @ 9:08 am Tech

Some Crucial SSDs have a bug that causes them to be unstable. Fortunately there’s a firmware upgrade available. Even more fortunately, in addition to the usual Windows updaters, Crucual kindly makes a version available that’s an ISO image so it’s OS independent.

Great, right? Except the ISO doesn’t actually work when you dd it to a drive. Ugh. I spent a few hours on this and finally figured out how to make this work.

First, write the ISO to your USB drive as normal (I’ll assume your USB drive is /dev/sde):
$ sudo dd bs=512k if=/tmp/crucial-m4-070h-07-00.iso of=/dev/sde
$ sudo sync

A filesystem and the data is now on your USB drive, but there’s no valid partition table and a corrupt MBR. You can see this by using fdisk:

$ sudo fdisk -l /dev/sde
Disk /dev/sde: 4048 MB, 4048551936 bytes
125 heads, 62 sectors/track, 1020 cylinders, total 7907328 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sde doesn't contain a valid partition table

Ooops! However, on the ISO is a copy of the MBR that should be on the drive. Mount the drive and grab that:
$ sudo mount /dev/sde /mnt
$ cp /mnt/boot/isolinux/boot2880.img /tmp
$ sudo umount /mnt

Now, write that boot sector to your USB drive:

$ sudo dd if=/tmp/boot2880.img of=/dev/sde
Almost done. Now you can see there’s a mostly-valid partition table:
$ sudo fdisk -l /dev/sde

Disk /dev/sde: 4048 MB, 4048551936 bytes
125 heads, 62 sectors/track, 1020 cylinders, total 7907328 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xc9d0c9d0

This doesn't look like a partition table
Probably you selected the wrong device.

Device Boot Start End Blocks Id System
/dev/sde1 ? 28886110 638537311 304825601 c4 DRDOS/sec (FAT-16 < 32M)
/dev/sde2 ? 1183556331 4412578037 1614510853+ 30 Unknown
/dev/sde3 ? 1325451862 2509223114 591885626+ 46 Unknown
/dev/sde4 ? 1394614348 1394635684 10668+ 45 Unknown

Better, but not quite right. The only change we need to make is to set that first partition to be bootable. Modify the disk by running fdisk without -l:

$ sudo fdisk /dev/sde
Command (m for help):

You want the a command, then when it asks for a partition, type 1:

Command (m for help): a
Partition number (1-4): 1

But that will have set it to non-bootable, so do that again:

Command (m for help): a
Partition number (1-4): 1

Then print the table to be sure:


Command (m for help): p

Disk /dev/sde: 4048 MB, 4048551936 bytes
125 heads, 62 sectors/track, 1020 cylinders, total 7907328 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xc9d0c9d0

This doesn't look like a partition table
Probably you selected the wrong device.

Device Boot Start End Blocks Id System
/dev/sde1 * 28886110 638537311 304825601 c4 DRDOS/sec (FAT-16 < 32M)
/dev/sde2 ? 1183556331 4412578037 1614510853+ 30 Unknown
/dev/sde3 ? 1325451862 2509223114 591885626+ 46 Unknown
/dev/sde4 ? 1394614348 1394635684 10668+ 45 Unknown

You’re looking for that * under Boot for the first partition. Now write your changes:

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
$

And now your drive is ready – it should boot.

-phil
rss no comments
comment on this article

Notice: All comments are moderated. Your comment will appear once approved.