Thinkpad X220のBIOSをUSBフラッシュメモリからブートしてアップデートする

 Thinkpad X220のストレージを入れ替えたので、Windows 10 Pro 1909をクリーンインストールしました。
 内蔵のRicoh製SDカードリーダを除いて*1、自動で適切なドライバが導入されるので、特に面倒なことはありません。
 ついでにBIOS/UEFIが最新版か確認したところ、少し古いことが判ったので、アップデートしようと思いました。
 

Windows10から更新できない

 Lenovoのサポートサイトからダウンロードできるアップデータhttps://download.lenovo.com/mobilesjp/8duj31jp.exeは、「BIOS アップデート ユーティリティ (Windows 8 32bit, 64bit/ 7 32bit, 64bit/ Vista 32bit, 64bit/ XP) - ThinkPad X220, X220i, X220 Tablet」と表記されている通り、Windows10での動作については明示されていません。
 以前のバージョンのBIOSは以前のバージョンのWindows10からでも更新できていたのですが、現時点で最新のBIOS/UEFI Version 1.46 (8DET76WW)のアップデータは、現時点で最新のWindows 10 Pro 1909では正常に動作しないようです。アップデータの更新処理の最後のステップと思われるマージ処理に達すると、(Windows10では珍しい)ブルースクリーンになってしまいます。Windows8互換モードや、明示的に管理者で実行してみたり、英語版アップデータを使ってみても、症状は変化しませんでしたので、この環境下では動かないものだと判断しました。
 とは言え、私のX220のBIOSバージョンと比較すると、Version 1.46までにはSpectre/Meltdownに端を発するサイドチャネル攻撃やIntelMEの脆弱性対応が含まれているため、アップデート自体は諦めたくないのでWindows10以外からのアップデートを試みることにしました。
 

USBフラッシュメモリからブートして更新したい

 Lenovoのサポートサイトには、Windows上で実行するアップデータ以外に、CDから起動するアップデータhttps://download.lenovo.com/mobilesjp/8duj31jp.isoも公開されています。こちらも、「BIOS アップデート ユーティリティ (起動CD用) (Windows 8 32bit, 64bit/ 7 32bit, 64bit/ Vista 32bit, 64bit/ XP) - ThinkPad X220, X220i, X220 Tablet」と表記されておりWindows10の表記はありませんが、BIOS更新処理自体にWindowsを使用するわけではないので、特に問題は無いと考えられます。
 通常なら、このダウンロードしたISOイメージをCD-Rに焼いて、USB接続した光学ドライブから起動することになりますが、(ブランクメディアを用意したり外付け光学ドライブを引っ張り出すのが)面倒なので、USBフラッシュメモリで代替したいと思いました。
 Windows環境でディスクイメージをフラッシュメモリに書き込む場合、私はRufusを常用しており、今回もRufusにX220のアップデータのCDイメージを放り込んでみたのですが、Rufusが対応していない形式のようで、エラー表示となります。
 で、少し調べてみたところ、Arch Linuxを使用した以下の記事を発見しました。
LinuxでThinkPad X220のBIOSをアップデートする - paz3のおもいつき
 こちらの記事によれば、geteltrorito.plというPerlスクリプトでディスクイメージの形式を変換できるようです。

 以下、Ubuntu server 18.04を使用して変換作業を行っています。なお、変換に使うUbuntuは実機に限らずWSLのUbuntu 18.04でもどちらでも大丈夫です*2(変換後のイメージファイルをDDコマンドを使ってUSBフラッシュメモリに書き込む場合には実機が必要ですが、Rufusで書き込むなら同一マシンでWSLで作業した方が便利です)。
 

geteltorito?

 geteltoritoはデフォルトではUbuntu 18.04には導入されていません。
 何らかのパッケージに含まれているかと探してみたところ、以下のようにgenisoimageパッケージに含まれていることが判ります。

$ apt search geteltorito
Sorting... Done
Full Text Search... Done
genisoimage/bionic 9:1.1.11-3ubuntu2 amd64
  Creates ISO-9660 CD-ROM filesystem images

 Ubuntuのマニュアルからもgeteltoritoはgenisoimageに含まれていることが判ります。El Toritoブートイメージを展開して標準出力に書き出すツールのようです。
Ubuntu Manpage: geteltorito - an El Torito boot image extractor
 
 蛇足ながら、geteltoritoというコマンド名が何を表しているのか解らなかったのですが、マニュアルから"El Torito boot image extractor"ということが判りますので、"Get El Torito"の略称に由来するのでしょう。なお、"El Torito"はISO 9660 CD-ROM仕様を拡張してコンピュータを起動できるように設計された規格を指しているようです。
El Torito (CD-ROM standard) - Wikipedia
 

geteltoritoのインストール

 前述の通りgenisoimageパッケージに含まれているので、これをインストールします。

$ sudo apt install genisoimage

 

geteltoritoの実行

実行体?

 とりあえず、前掲のArch Linuxの場合の記事で紹介されているように、叩いてみました。

$ geteltorito.pl
geteltorito.pl: command not found

 あれ?インストールしたのに無い?というわけで探してみたところ、

$ whereis geteltorito
geteltorito: /usr/bin/geteltorito /usr/share/man/man1/geteltorito.1.gz
$ file /usr/bin/geteltorito
/usr/bin/geteltorito: Perl script text executable
$ head /usr/bin/geteltorito
#!/usr/bin/perl

use Getopt::Std;

#
# geteltorito.pl: a bootimage extractor
# Script that will extract the first El Torito bootimage from a
# bootable CD image
# R. Krienke 08/2001
# krienke@uni-koblenz.de

 以上より、Ubuntuでgenisoimageパッケージをインストールした場合、geteltorito.plではなく拡張子無しのgeteltoritoとして/usr/bin/にデプロイされていますが、中身はPerlスクリプトであることが判ります。

実行

 改めて、geteltoritoを何もオプション付けずに実行してみます。

$ geteltorito

/usr/bin/geteltorito [-hv] [-o outputfilename] cd-image
Script will try to extract an El Torito image from a
bootable CD (or cd-image) given by <cd-image> and write
the data extracted to STDOUT or to a file.
   -h:        This help.
   -v:        Print version of script and exit.
   -o <file>: Write extracted data to file <file> instead of STDOUT.

 標準出力ではなくファイルに出力したければ-oオプションでファイル名を指定せよということなので、Lenovoのサポートサイトからダウンロードした8duj31jp.isoを展開して8duj31jp.imgに出力してみます。

$ geteltorito -o ./8duj31jp.img ./8duj31jp.iso
Booting catalog starts at sector: 20
Manufacturer of CD: NERO BURNING ROM
Image architecture: x86
Boot media type is: harddisk
El Torito image starts at sector 27 and has 63488 sector(s) of 512 Bytes

Image has been written to file "./8duj31jp.img".

 これで、El Torito形式のISOイメージファイルを変換して普通の(DDと同じ)形式のイメージファイルが出来ました。
 

RufusUSBフラッシュメモリに書き込む

 変換後のイメージファイルはRufusで扱えますので、(メディアが異常でなければ)正常に書き込みができるはずです。
 なお、RufusUSBフラッシュメモリに限らず、SDカードにもイメージを書き込むことができます。イメージを書き込んだSDカードをX220の内蔵SDカードリーダー(内部PCI Express接続)に入れてもブートできませんが、USB接続のSDカードリーダーならブートできるものもあります(Transcend TS-RDF5で実際に確認)。

 

USBブートでBIOSアップデート

 Rufusで変換後のイメージファイルを書き込んだUSBフラッシュメモリをX220に接続してブートします。ThinkVantageボタンやF12キーでブートデバイスUSBフラッシュメモリを選択すれば、BIOSアップデータが起動しますので、表示内容に従って作業すればBIOS更新が行えます!
f:id:kachine:20200215232222g:plain
 



以上。

*1:Lenovoのサポートサイトからダウンロードできます。

*2:念のため実機で変換したイメージファイルと、WSL環境で変換したイメージファイルの差分を比較してみましたが、完全一致しました。