.. _update_samsung_pm9a1_firmware: ================================== 更新三星PM9A1 NVMe存储firmware ================================== 问题排查 ========== 我最初在2021年10月购买了3个 :ref:`samsung_pm9a1` 用于在 :ref:`hpe_dl360_gen9` :ref:`ceph_deploy` ,感觉还不错,所以2022年9月又购买了1个 :ref:`samsung_pm9a1` 用于 :ref:`mbp15_late_2013_update_nvme` ,也很顺利。但是,2024年11月,当我尝试在 :ref:`pi_5` 构建 :ref:`pi_soft_storage_cluster` 遇到了麻烦: - :ref:`pi_5_pcie_m.2_ssd` 我最初尝试利旧我的 :ref:`samsung_pm9a1` ,但是发现不能识别(使用了从 :ref:`hpe_dl360_gen9` 拆下的 :ref:`samsung_pm9a1` ,这一步骤埋下了问题;不得已又投资了3块 :ref:`kioxia_exceria_g2` ,现在想来都是泪), :ref:`pi_5` 启动时监测到 :ref:`samsung_pm9a1` 响应超时而无法识别: .. literalinclude:: update_samsung_pm9a1_firmware/pm9a1_err :caption: 树莓派启动时激活 :ref:`samsung_pm9a1` 失败 :emphasize-lines: 3,4 - 因为最近购买的 :ref:`4_nvme_usb_disk` 准备利旧4个 :ref:`samsung_pm9a1` (3个原先用于 :ref:`hpe_dl360_gen9` ,1个用于 :ref:`mbp15_late_2013_update_nvme` ),我惊奇地发现只能识别出1个 :ref:`samsung_pm9a1` (不管怎么安装槽顺序)。不可能3个NVMe存储同时损坏,我尝试用U盘转接盒,才发现原来当初2021年10月购买的3块 :ref:`samsung_pm9a1` 都无法用于U盘转接盒(不识别) - 我的 :ref:`mbp15_late_2013_update_nvme` 能够使用NVMe SSD,我把原先用于 :ref:`hpe_dl360_gen9` 的 :ref:`samsung_pm9a1` 替换到 :ref:`mbp15_late_2013_update_nvme` 中。正如所料,居然不能用于笔记本 -- 但是这3块 NVMe 是能够用于服务器 :ref:`hpe_dl360_gen9` - 我突然想到当初在 :ref:`pi_5` 的 :ref:`pi_5_pcie_m.2_ssd` 验证使用 :ref:`samsung_pm9a1` 失败,其实只测试了 :ref:`hpe_dl360_gen9` 服务器上的 :ref:`samsung_pm9a1` : 当时没有想到两批购买的NVMe存储还有区别。果然,我在 :ref:`pi_5` 上使用 :ref:`mbp15_late_2013_update_nvme` 验证过正常的 :ref:`samsung_pm9a1` ,就是能够正常使用的。 咨询了淘宝卖家,提到了NVMe的firmware升级,有道理! - 使用 :ref:`nvme-cli` 检查: .. literalinclude:: nvme-cli/nvme_list :caption: 列出系统安装NVMe 看出了差异 -- 以下是正常的 :ref:`samsung_pm9a1` : .. literalinclude:: update_samsung_pm9a1_firmware/nvme_list_output :caption: 工作正常的 :ref:`samsung_pm9a1` ,注意firmware版本 ``GXA7601Q`` 而翻看一下不能用于U盘的异常 :ref:`samsung_pm9a1` : .. literalinclude:: nvme-cli/nvme_list.txt :language: bash :caption: 不能用于U盘的异常 :ref:`samsung_pm9a1` ,注意firmware版本 ``GXA7401Q`` 所以基本可以推测出,至少需要升级 :ref:`samsung_pm9a1` 的firmware到版本 ``GXA7601Q`` 才能解决问题 升级firmware ================ 由于 :ref:`samsung_pm9a1` 是OEM版本,三星官方没有直接提供firmware下载,所以我是通过搜索对比发现以下两个方案可能性较高: - `联想 Critical Firmware Update for Samsung drives - ThinkStation `_ 这篇更新文档较为全面,不仅提供了Windows也提供了Linux更新方法。对比方法可以看到,实际上联想的Linux更新方法就是标准的Linux通过LVFS完成更新,考虑到淘宝上联想的OEM SSD很普遍,且更新方法是标准方式,所以我尝试用此方案 - `Samsung SSD PM9A1-00B00 Firmware Update `_ 获得升级firmware信息,下载 Linux提供了一个名为 ``fwupdmgr`` 的客户端工具来管理firmware升级,可以自动、安全、可靠地完成firmware升级,也可以用于Samsung SSD。 ``fwupd`` 服务可以工作在Linux和BSD系统上,是 `LVFS `_ 的组成部分。 - 检查 `LVFS设备列表 `_ 看看需要更新的SSD是否提供,例如使用 ``PM9A1`` 搜索,可以看到Dell,HP,Lenovo都提供了firmware - 使用 ``fwupd`` 更新SSD firmware: .. literalinclude:: update_samsung_pm9a1_firmware/fwupdmgr_get-devices :caption: 获取设备列表 - 执行以下命令从 `LVFS `_ 服务器下载和刷新 metadata (元数据): .. literalinclude:: update_samsung_pm9a1_firmware/fwupdmgr_refresh :caption: 从LVFS服务器下载刷新metadata - 最后执行升级: .. literalinclude:: update_samsung_pm9a1_firmware/fwupdmgr_update :caption: 执行firmware升级 更新firmware ============= 在arch linux文档中有关于如何升级Samsung firmware的方法,见 `archlinux wiki: Solid state drive >> Firmware >> Samsung `_ - 从 `三星官网下载bootable ISO image `_ ,需要按照设备型号下载: - 根据 ``lspci -nnk -d 144d:a80a`` 输出可以看到 ``NVMe SSD Controller PM9A1/PM9A3/980PRO`` 也就是这3种NVMe存储控制器采用同一种,所以我选择下载 ``980PRO`` 的启动iso - 从ISO镜像中获取 ``initrd`` Linux镜像: .. literalinclude:: update_samsung_pm9a1_firmware/initrd :caption: 从ISO镜像中获取 ``initrd`` Linux image .. note:: 按照archlinux wiki文档,这里使用了一个名为 ``bsdtar`` 的tar工具,在 :ref:`debian` 系统中,这个工具是通过 ``libarchive-tools`` 提供的,安装 ``libarchive-tools`` 就能使用 ``bsdtar`` 。但debian手册中似乎没有区分 ``bsdtar`` 和 ``tar`` 。这个 ``bsdtar`` 是一个为了实现linux可移植的工具,可能是为了兼容旧版本tar。 - 然后再从 ``initrd`` 中提取出 ``root/fumagician/`` ,这个目录就包含了firmware更新文件: .. literalinclude:: update_samsung_pm9a1_firmware/initrd_fumagician :caption: 从 ``initrd`` 镜像中再提取出 ``root/fumagician/`` 目录(包含firmware更新文件) 此时在 ``root/fumagician/`` 有以下4个文件:: 5B2QGXA7.enc DSRD.enc fumagician fumagician.sh - 运行 ``fumagician`` 来更新firmware .. literalinclude:: update_samsung_pm9a1_firmware/fumagician :caption: 运行 ``fumagician`` 来更新三星存储firmware 显示提示: .. literalinclude:: update_samsung_pm9a1_firmware/fumagician_output :caption: 运行 ``fumagician`` 提示更新 Samsung SSD Firmware :emphasize-lines: 35 很不幸,我没有更新成功,看起来扫描NVMe存储没有成功 参考 ======= - `How To Update Samsung SSD Firmware on Linux `_ 提供了完整指南,本文升级方法参考此文档 - `Samsung SSD PM9A1-00B00 Firmware Update `_ 提供了2023年3月1日的 7801 FW Version for PM9A1: 注意下载链接zip解压缩以后 ``GXA`` 开头bin文件是用于1T规格, ``GXB`` 开头bin文件是用于2T规格 (我理解是通过 :ref:`nvme-cli` 完成) - `三星存储官网firmware FAQ `_ 指出 可以从 `www.samsung.com/ssd `_ 或 `www.samsung.com/samsungssd `_ 下载firmware更新,但是三星官方网站提供的是直接从三星购买的终端用户产品系列,例如 SSD-850 EVO / SSD-850 PRO等;而我购买的 :ref:`samsung_pm9a1` 是OEM产品,需要从不同的厂商下载更新firmware - `Dell Samsung PM9A1 固态硬盘固件更新 `_ Dell的Samsung PM9A1,不过是Windows版本,发布日期是 2023年7月31日 - `联想 Samsung PM9A1 NVMe Solid State Drive Firmware Update Utility for Windows 10 (64-bit), Windows 11 (64-bit) - Desktops `_ 也是Windows版本,发布日期是 2023年5月16日 - `联想 Critical Firmware Update for Samsung drives - ThinkStation `_ 这篇更新文档较为全面,不仅提供了Windows也提供了Linux更新方法。对比方法可以看到,实际上联想的Linux更新方法就是标准的Linux通过LVFS完成更新,我理解联想其实就是采用三星官方方法