ThinkPad T430s の BIOS を USB メモリ経由でアップデートする

以前ジャンクで入手したThinkPad T430s ですが，外部キーボードを使ったり，壊れたX220 の部品を使ったりで現在メインマシンとして利用しています．
今NVIDIA Optimus が利用できないかと試していますが，うまく行っていません．BIOS Update で治ったという事例を見つけたのでUpdate しました．Update イメージはCD に書き込んでそこから起動しないといけませんが，USBメモリでもうまく行ったのでメモを残しておきます．

※失敗するとマシンが動かなくなる可能性があります．

まずはBIOS のversion を確認します．date が2012年とかなので古そう．

現在のBIOS version 確認

$ sudo dmidecode -t bios|grep -E "Version:|Release Date:"
Version: G7ET60WW (2.02 )
Release Date: 09/11/2012
$ sudo lshw | grep "\-firmware" -A10|grep -E "version|date"
version: G7ET60WW (2.02 )
date: 09/11/2012

Lenovo のページでBIOSを確認すると， 26 Jun 2019 の Version 2.75 というものが最新のようです．
Windows用の実行ファイルと，起動CD用のisoファイル，それとそれぞれのリリースレターが用意されています．Linux マシンなのでisoファイルの方を入手します．

BIOS Update (Utility & Bootable CD) for Windows 10, 8.1, 8, 7 (64-bit), 8.1, 8, 7 (32-bit), XP – ThinkPad T430s, T430si – JP

ダウンロードしたら，チェックサムを確認します．

webpage より

Checksum Tips

MD5:aa9846fb15114ef18770cc0812188418

SHA1:ace55c1a1fa87f3ca5140ef67d565ff9f863020a

SHA-256:623dc5d0442b3b0e105186901dc403c911717d4f7998223593b93e66afdbcd93

sha256sum で確認

$ sha256sum ~/Downloads/g7uj28us.iso
623dc5d0442b3b0e105186901dc403c911717d4f7998223593b93e66afdbcd93 /home/matoken/Downloads/g7uj28us.iso

isoinfo で少し中を覗く

$ isoinfo -d -i ./g7uj28us.iso
CD-ROM is in ISO 9660 format
System id:
Volume id: G7ETB5US
Volume set id:
Publisher id:
Data preparer id:
Application id: NERO BURNING ROM
Copyright File id:
Abstract File id:
Bibliographic File id:
Volume set size is: 1
Volume set sequence number is: 1
Logical block size is: 2048
Volume size is: 16566
El Torito VD version 1 found, boot catalog is in sector 20
Joliet with UCS level 3 found
NO Rock Ridge present
Eltorito validation header:
Hid 1
Arch 0 (x86)
ID 'NERO BURNING ROM'
Key 55 AA
Eltorito defaultboot header:
Bootid 88 (bootable)
Boot media 4 (Hard Disk Emulation)
Load segment 7C0
Sys type 6
Nsect 1
Bootoff 1B 27
$ isoinfo -l -i ./g7uj28us.iso

Directory listing of /
d--------- 0 0 0 2048 Jun 13 2019 [ 21 02] .
d--------- 0 0 0 2048 Jun 13 2019 [ 21 02] ..

この iso ファイルを CD に書き込んで起動すればいいはずですが，メディアが手元にありません．

iso ファイルによってはUSBメモリに書き込むだけで起動USBメディアになるものもあるので試してみましたが起動できませんでした．

どうにかならないかなーと探すと以下の記事を見つけました．

Lenovo Thinkpad BIOS Update with Linux and USB | Libre Things

geteltorito というPerl Script でイメージを変換した後，USBメモリに書き込むことで ThinkPad の BIOS Update ができるようです．
この記事中ではScript 開発者のページから入手していますが，Debian では genisoimage pkg に含まれているのでこれを使いました．

geteltorito の含まれている genisoimage pkg の導入

$ apt-file search geteltorito
genisoimage: /usr/bin/geteltorito
genisoimage: /usr/share/doc/genisoimage/README.geteltorito
genisoimage: /usr/share/man/man1/geteltorito.1.gz
$ sudo apt install genisoimage

usage

$ 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.

USBメモリを接続してデバイスをdmesg やfdisk で確認して，wipefs でパーティション情報をクリアしておく

$ sudo dmesg -He|tail
$ sudo fdisk -l /dev/sdb
$ sudo wipefs -a /dev/sdb

geteltorito でイメージ変換しながら USBメモリへの書き込み

$ geteltorito ./g7uj28us.iso | sudo dd of=/dev/sdb bs=1M oflag=dsync status=progress
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 65536 sector(s) of 512 Bytes
[sudo] password for matoken:
33218560 bytes (33 MB, 32 MiB) copied, 10 s, 3.2 MB/sImage has been written to stdout ....

9+178 records in
9+178 records out
33554432 bytes (34 MB, 32 MiB) copied, 10.3254 s, 3.2 MB/s

Debian pkg に含まれているScript のversion とsite で配布されているversion は0.5 と0.6 と少し違ったので念の為両方で変換を掛けて比較してみましたが結果は同じでした．

念の為siteで配布されているものでも変換してイメージを比較してみると同じものだった

$ wget http://userpages.uni-koblenz.de/~krienke/ftp/noarch/geteltorito/geteltorito/geteltorito
$ chmod u+x ./geteltorito
$ ./geteltorito -v
Version: 0.6
$ ./geteltorito -o ./g7uj28us.img ./g7uj28us.iso
$ geteltorito -o ./g7uj28us.img-pkg ./g7uj28us.iso
$ diff -s ./g7uj28us.img ./g7uj28us.img-pkg
Files ./g7uj28us.img and ./g7uj28us.img-pkg are identical

ということで，書き込んだUSBメモリで起動してBIOS update はうまく行きました．

Version が上がっているのを確認

$ sudo dmidecode -t bios|grep -E "Version:|Release Date:"
Version: G7ETB5WW (2.75 )
Release Date: 06/10/2019

忘れがちだけど結構脆弱性の修正やmicrocode のアップデートも入っていたのでちゃんと当てないといけないですね……．

環境

$ dpkg-query -W genisoimage coreutils util-linux dmidecode lshw
coreutils 8.30-3
dmidecode 3.2-1
genisoimage 9:1.1.11-3+b2
lshw 02.18.85-0.2
util-linux 2.33.1-0.1
$ hostnamectl | egrep 'Operating System|Architecture'
Operating System: Debian GNU/Linux 10 (buster)
Architecture: x86-64