The instructions were tested on a Lenovo X1 Carbon 5th Gen (X1C5) on Arch Linux but should be applicable to other Lenovo models and Linux distributions.
BACKUP YOUR DATA! I created a bootable Ubuntu Image like this:
$ sudo sh -c 'curl --location --silent --fail "http://releases.ubuntu.com/18.04/ubuntu-18.04.1-desktop-amd64.iso" | pv > /dev/<your-usb-drive>'
# note that pv is only there to show progress, it is perfectly fine to redirect curl to the usb drive directly.
then I booted from this drive by pressing F12 on reboot and dumped my NVMe disk to an external hard drive like this:
$ sudo sh -c 'cat /dev/nvme0n1 | pv --size 477G > /mnt/<external-harddrive>/something.img'
This took about an hour and trust me, if something fails you would be grateful having spend this hour instead of loosing your data.
Now we are ready to start.
- Install nvme-cli, they have instructions for all major distros and compiling it from source is also rather easy.
- Download the firmware update, in my case it was this one: https://download.lenovo.com/pccbbs/mobiles/fwnv25.zip
- Unzip it.
- Check you current firmware version:
$ sudo nvme id-ctrl /dev/nvme0 | grep fr
fr : 1.9.<something>
frmw : 0x2
- Download the extracted update to your nvme drive:
$ sudo nvme fw-download /dev/nvme0 --fw=/path/to/update.img
# in my case the update file was called NVME_End2End_Lenovo_512_dvt_OPAL_Encrypt_and_Signature.bin
- Commit the update
$ sudo nvme fw-commit /dev/nvme0 --slot=0 --action=2
if this fails, try action=1
, which succeeded on my drive (could take some seconds before the command returns).
- Reboot
- Check if the firmware upgrade was done:
sudo nvme id-ctrl /dev/nvme0 | grep fr
fr : 2.7.8341
frmw : 0x2
This guide is based on information from the following links:
- https://forums.lenovo.com/t5/ThinkPad-X-Series-Laptops/Upgrade-NVMe-SSD-firmware-to-FWNV15-X1-Carbon-5th-Gen-on-Linux/td-p/3741894/page/3
- https://github.com/linux-nvme/nvme-cli/blob/master/Documentation/nvme-fw-download.txt
- https://github.com/linux-nvme/nvme-cli/blob/master/Documentation/nvme-fw-commit.txt
I got a massive speed-up from this update, previously my boot-time took about 15-20 seconds, now I'm ready in 5s or something:
$ systemd-analyze blame
559ms dev-mapper-archgroup\x2droot.device
410ms lvm2-monitor.service
239ms swapfile.swap
236ms org.cups.cupsd.service
227ms ModemManager.service
226ms tlp.service
197ms upower.service
178ms systemd-timesyncd.service
159ms systemd-logind.service
129ms systemd-journal-flush.service
128ms polkit.service
110ms systemd-modules-load.service
101ms boot.mount
95ms systemd-udev-trigger.service
92ms NetworkManager.service
89ms thermald.service
60ms systemd-tmpfiles-clean.service
56ms systemd-udevd.service
53ms systemd-journald.service
51ms lvm2-pvscan@254:0.service
48ms avahi-daemon.service
43ms udisks2.service
42ms systemd-fsck@dev-disk-by\x2duuid-4902a621\x2d2995\x2d4df1\x2da2aa\x2d64c85223c6a5.service
41ms systemd-fsck@dev-disk-by\x2duuid-B364\x2d37C8.service
41ms [email protected]
41ms alsa-restore.service
41ms systemd-tmpfiles-setup.service
40ms systemd-binfmt.service
40ms unmount-webdrives-on-shutdown.service
40ms dev-hugepages.mount
38ms [email protected]
37ms systemd-random-seed.service
32ms systemd-tmpfiles-setup-dev.service
25ms bluetooth.service
25ms wpa_supplicant.service
21ms colord.service
20ms ntpd.service
18ms systemd-backlight@leds:tpacpi::kbd_backlight.service
...