Recently, I purchased a Samsung 980 SSD which had a firmware upgrade available. I would normally not upgrade firmware on SSD/HDD devices, or even bother looking for it, unless there was a problem I was trying to solve. Well, turns out this SSD model has some temperature problems1. (The second link is an Internet Archive one, because Samsung doesn’t like to keep forum posts up to help folks in the future?) Anyways, off to figure out how to update the firmware on this Samsung SSD using a Linux OS!

I want to credit this blog post as the basis for most everything I’m going to write here. It gave me the basics of what I needed to do, and could help anyone else perform these same steps. I am writing about my own experience, in case it can help anyone out.

A Problem with Samsung’s Instructions

Samsung does provide instructions for how to upgrade their firmware using a Linux ISO. Find it here.

But there’s a problem. It doesn’t work. It also asks us to use a really sketchy looking utility, UNetbootin, which is a hideous app when run on macOS that looks like it’s trying to deploy malware to my machine. So, nuts to that.

Instead, I’m going to use an Ubuntu Live USB drive to install the firmware. The reason for doing this is to be able to update the firmware without having a filesystem mounted from it. The drive I am updating is the boot-disk for my Proxmox VM host, and while it appears I can upgrade the firmware while a live system is running from it…better safe, than sorry!

Checking the Firmware Version

Before upgrading, you can validate which firmware version is running on your SSD using smartctl.

On the box with the SSD installed, run:

smartctl -a /dev/nvme1n1

If you don’t have the smartmontools package installed, this command will not work. You can install it using apt install smartmontools, then run the above command.

To explain:

  • The first command lsblk will list all block devices (SSD’s and hard drives) on your machine. You can add the -f flag to see which filesystems are mounted against each disk.
  • The second command will dump all SMART device details (the -a flag does this) for the given SSD device. Look specifically for the “Firmware Version:” line.

If the firmware version you see listed is different than what is posted on Samsung’s website, you may want to consider upgrading it to resolve any issues.

Download the Ubuntu ISO and Burn it to a USB Drive

For this step, we’ll need:

  1. A current Ubuntu ISO, found here.
  2. A USB stick that’s big enough to hold that ISO. I believe 8GB+ works.
  3. BalenaEtcher, or equivalent software to burn the ISO onto the USB drive.
  4. A machine which can run Balena Etcher and burn the Linux image to the USB drive. I use a Mac for day-to-day personal computing, and I am updating the SSD used as a boot disk inside my Proxmox VM machine. If you’re updating the SSD inside your only machine which also has the SSD, you can burn the image to the USB using that machine.

Burn the ISO to the USB drive. Here’s a handy guide for how to do that.

When that process completes, remove the USB drive and plug it into the machine which has the SSD, and reboot that machine. Ensure you have a monitor and keyboard hooked up to that machine, so you can get into the BIOS/boot menu and choose the Ubuntu USB to boot from. When booting from the USB, choose the option to “try out” Ubuntu by running it as a Live USB/CD. Don’t run the installer and install a fresh Ubuntu OS on top of your existing system by accident!

Grab the Firmware Update Image from Samsung’s Website

Once the Ubuntu USB boots up, you should be able to pop open a web browser (Firefox is installed by default) and navigate to Samsung’s website to download the firmware update ISO.

On that page, download the correct ISO for your model of SSD. I had the regular 980 series, so I downloaded the corresponding firmware image. There’s quite a few links on this page, so take your time and ensure you are grabbing the right file.

Run the Update Tool from that ISO

Pop open the Terminal app. We’re going to mount that ISO file we just downloaded and run the tool inside it to update the firmware for the SSD.

Note that the following tools are required, gzip unzip wget cpio, and should be installed by default on the Ubuntu live image. You can verify they exist with this command.

which gzip

If you get a result, the tool exists. If you don’t, you should be able to install them using the apt package manager.

Next, on the terminal run the following commands:

sudo mkdir /mnt/iso
sudo mount -o loop ./Samsung_SSD_980_PRO_3B2QGXA7.iso /mnt/iso/
sudo mkdir /tmp/fwupdate
cd /tmp/fwupdate
sudo gzip -dc /mnt/iso/initrd | sudo cpio -idv --no-absolute-filenames
sudo ./root/fumagician/fumagician

What’s going on here?

  1. We’re making a directory to mount the Samsung ISO at, /mnt/iso.
  2. Next, we’re mounting the Samsung ISO image there.
  3. Create a place to unzip the Samsung update tool to, inside the temp directory /tmp/fwupdate.
  4. Switch to that directory.
  5. Unzip the files, write them to standard out, and then pipe those files into cpio. -i runs in ‘Copy-in mode’ reading files from the standard in, -d creates leading directories as needed, and -v runs the command in verbose mode. Finally -no-absolute-filenames creates all files relative to the current directory (recall that we’re inside /tmp/fwupdate right now!).
  6. Finally, we run the Samsung Firmware Update Magician tool.

Follow the instructions which appear on the screen. It should identify the SSD’s installed on the box, you choose the one you want to update2.

When this process finishes - it should be fairly quick (several seconds for me against a 980 500GB device) - reboot the box. If you’re trying to get back into a system running the updated SSD, ensure you don’t boot back into the Ubuntu live image.

Validating our Changes

With the host box rebooted, let’s re-run the smartctl command to validate the firmware version.

smartctl -a /dev/nvme1n1

Checking the line which begins “Firmware Version:” you hopefully now see the updated version!

  1. As mentioned on page 4 of that Samsung support post, it’s possible to workaround this temp reporting problem by changing some kernel parameters. Seems like nvme_core.default_ps_max_latency_us=1500 does the trick. However, upgrading the firmware to version 3B4QFXO7 also resolved the temp spikes I observed. So, I’ll take the upgraded firmware and not adding kernel options. ↩︎

  2. It’s important to choose the correct SSD, particularly if you have multiple SSD’s installed on the box. Remember that the Samsung tool is specific to the SSD model. ↩︎