於 Linux / GRUB2 環境下升級 Crucial SSD firmware

GitHub: crucial-ssd-firmware-grub

0. 前言

本身有台 Thinkpad X220,內裝有 Micron Crucial SSD 兩顆,分別是 Crucial M4 mSata SSD 128G (CT128M4SSD3) 以及 Crucial MX200 256G (CT250MX200SSD1)。前者在 2012  年購買,後者在 2015 年購買。

這次想要升級的原因,是因為在 windows 下發現作為系統碟的 M4 mSata 出現多磁區錯誤以及重新分配的狀況,查看其韌體後發現是最老的版本 (01MH),目前網路上可以查到的版本為 07MH。為了 SSD 的健康,決定升級韌體。

在美光的網站下載相對應的韌體後,解壓縮開啟程式準備安裝。參照最新的 Guideline 後,可以得知目前 (2015後) 都會採用 bootable 的方式進行,因此不用再額外準備 USB 來製作開機碟。這是好事,但是一想到電腦上有 GRUB,就覺得有點問題。

果不其然,在安裝好韌體更新程式後,電腦自動重新開機,回到 GRUB2 的選單,選擇 windows 後轉入 repair mode。但是在這個環節出現無法開機 (not bootable) 的畫面,連續點選確認後,跳回 windows 7 運行選單,選擇後轉回正常 win7 開機畫面。

1. 找尋 Linux / GRUB 解決方案

在網路上翻找一番,在 guillaume 於 2016/2/28 發表的 Update any crucial ssd firmware from linux/grub 找到一份以 perl 寫成的 script,其作法非常簡潔。以 root 權限執行 script 後,會下載在 crucial-fw.cfg 設定相對應得 firmware zip file,解壓出裡面的 iso,放入 /boot 下同時產生 grub config file,使用者只要重新產生 grub.cfg,重新開機後就會看到相對應的選單。

原理是因為,這些 bootable iso 是以 syslinux 的 isolinux 與 memdisk 的格式包裝,因此只要在 GRUB 中做相對應的設定,就可以在開機的時候進入。作者在文章中有提到:

Since these isos are using isolinux … an unfair nonsense.
Why didn’t they add “and Linux and BSD and everything x86”? or simply put “for PC and Mac” (another possible nonsense since a Mac is a classic x86 hardware platform).

2. 分析 crucial-fw.pl

以下簡單分析 crucial-fw.pl 這個 script 在做什麼事情,使他可以做成 GRUB2 的 Crucial firmware update options.

可以看到,因為 script 會需要處理到需要 root 權限的東西 (mount, /boot/),因此會要求在執行的時候以 root 權限執行。

重要的部分是在 script 製作 grub config file 以及檢測 iso boot type  的部分。整個 grub config file 的 template 是這樣的格式:

在每個 iso file 中,script 會將他 mount 到前面設定的 mnt 資料夾中,接著檢查該 iso 中是否有存在 memdisk / boot2880.img 或是 vmlinuz / core.gz 檔案。如果有存在 memdisk  的話,在 menuentry 中會輸出 linux16 的部分。如果有存在 vmlinuz 的話,會輸出 initrd 的部分。

整個 script 最核心的部分就是這邊,透過這樣的方式便能夠輸出一份 GRUB config file,使用者只要在透過 update-gurb2 或 gurb-mkconfig 就能夠輸出含有 Crucial Firmware Update 的 GRUB.cfg。

3. 轉換為 Python (>3.3)

看不太懂 Perl,因此把整個 script 轉換為 Python,除了提升可讀性外,另一個好處是都使用 Python-builtin 的套件,不用像 Perl 需要額外安裝其他套件。

完整的 source code 放置於 GitHub: crucial-ssd-firmware-grub

原本 guillaume 的 code 是宣告為 public domain,在這邊也是以 unlicense 的方式發佈。

4. Syslinux Project

The SYSLINUX Project is a suite of lightweight master boot record (MBR) boot loaders for starting up IBM PC compatible computers with the Linux kernel. Primarily developed by H. Peter Anvin, the SYSLINUX bundle consists of several separate systems used for different purposes, including ISOLINUX, PXELINUX and EXTLINUX.  — wikipedia <Syslinux>

Crucial 在不同的 SSD firmware 中,用了不同的方式打包成 bootable iso,一種使用了 memdisk、一種是 isolinux,兩種格式都是 Syslinux Project 底下的格式。

4.1 Memdisk

MEMDISK is meant to allow booting legacy operating systems. MEMDISK can boot floppy images, hard disk images and some ISO images.

MEMDISK simulates a disk by claiming a chunk of high memory for the disk and a (very small – 2K typical) chunk of low (DOS) memory for the driver itself, then hooking the INT 13h (disk driver) and INT 15h (memory query) BIOS interrupts.

我們可以觀察 m4-msata iso 中的檔案,來了解一下 memdisk 的啟動方式。

在 mnt 底下,有 legal.txt 與 revision.txt,打開 legal.txt 後可以發現有使用到  freedos / Grub for DOS / SysLinux

進入 boot/isolinux 後可以觀察 isolinux.cfg

我們將會以 floppy 的方式導引開機,在 memdisk 的說明中,如果以 floppy 方式開機的話,其 img 大小會在 4MB 以下

觀察 boot2880.img 的檔案大小,可以發現是  2,949,120 bytes (2880K),符合上表的 c=80 h=2 s=36 的部份。確定是以 floppy 而不是 iso 的方式導引。

4.2 ISOLinux

ISOLINUX is a boot loader for Linux/i386 that operates off ISO 9660/El Torito CD-ROMs in “no emulation” mode. This avoids the need to create an “emulation disk image” with limited space (for “floppy emulation”) or compatibility problems (for “hard disk emulation”).

估計是因為 firmware 本身大於 floppy 的 4MB (core.gz 檔案大小為 8MB),因此使用 ISOLinux 的

可以看到 mnt 目錄下少了 legal.txt 跟 revision.txt,取而代之的是 cde 與 scratch 資料夾。boot 資料夾中除了 isolinux 也多了 core.gz 與 vmlinuz  (initrd ramdisk) 兩個檔案。

觀察 isolinux.cfg,可以發現多了 initrd 以及 boot params 的部份

5. 不是使用 GRUB2 的話怎麼辦?

不論是 guillaume 或是我的 script,都是採用 GRUB2 的 config file template,如果使用 syslinux 或是 legacy GRUB 的話,可能會有無法使用的狀況。請務必自行參照 Syslinux 的 wiki 來更改相關的設定。

Memdisk: http://www.syslinux.org/memdisk.php

6. Clean Up

我們總共動了以下的東西:

  • /etc/grub.d/45_crucial_fw
  • /boot/crucial-fw
  • update-grub2 / grub-mkconfig

因此軔體更新完成後,必須要手動刪除前兩個檔案 / 資料夾,並且重新產生 grub config。

Leave a reply:

Your email address will not be published.