LinuxでLENOVO T430sのBIOSアップデートUSBメモリ作成

LENOVO T430s のBIOS更新ですが，バッテリーが弱ってアップデートできなくなっていました．中古のバッテリーを入手したので再度アップデートを試みました．光学ドライブは壊れているのでUSBメモリを使いました．環境はLinux(Debian sid amd64)です．

バッテリーの問題でアップデートが進まない

アップデートに失敗するバッテリーの状態

$ upower -i /org/freedesktop/UPower/devices/battery_BAT0|grep energy
energy: 638.42 Wh
energy-empty: 0 Wh
energy-full: 647.76 Wh
energy-full-design: 39 Wh
energy-rate: 0 W

現在のBIOSのバージョンを確認します． 2.75 のようです．

$ sudo lshw -sanitize | grep "*-firmware" -A 8
*-firmware
description: BIOS
vendor: LENOVO
physical id: c
version: G7ETB5WW (2.75 )
date: 06/10/2019
size: 128KiB
capacity: 16MiB
capabilities: pci pnp upgrade shadowing cdboot bootselect edd int13floppy720 int5printscreen int9keyboard int14serial int17printer int10video acpi usb biosbootspecification uefi

以下のページによると最新は 2.76 のようなので少し古いです．

BIOS アップデート (ユーティリティ および 起動CD用) (Windows 10 64bit/ 8.1 32bit, 64bit/ 8 32bit, 64bit/ 7 32bit, 64bit/ XP) – ThinkPad T430s – Lenovo Support JP

ニュースレターを見るとセキュリティ修正のようです．当てたいところ．

今回の変更内容
バージョン 2.76

[重要な変更]
－ セキュリティ上の脆弱性への対応。
－ LEN-27764 ThinkPad Embedded Controller Update Vulnerability (CVE-2019-6171)
のための対応。詳しくは、レノボ セキュリティ アドバイザリページを参照して
ください。 (https://support.lenovo.com/us/en/solutions/len-27764)

[新機能または機能の拡張]
ありません。

[問題の解決]
ありません。

「BIOS アップデートユーティリティ (起動CD用)」を入手します．
CHECKSUM の部分をクリックすると3つのチェックサムが表示されるのでダウンロード後確認します．

Checksum

Checksum Tips
SHA256: 0e019465b2c6db3288004f965fa19fb37d5378bde3b6f1e1f85ce2c2cb6ee281
SHA1: b34aae723bcf14adb835d06c03f7067b23f7ef30
MD5: 23df808e42734fc6dc76031defcdcb15

$ wget https://download.lenovo.com/mobilesjp/g7uj29jp.iso (1)
$ sha256sum ./g7uj29jp.iso (2)
0e019465b2c6db3288004f965fa19fb37d5378bde3b6f1e1f85ce2c2cb6ee281 ./g7uj29jp.iso
$ sha1sum ./g7uj29jp.iso (3)
b34aae723bcf14adb835d06c03f7067b23f7ef30 ./g7uj29jp.iso
$ md5sum ./g7uj29jp.iso (4)
23df808e42734fc6dc76031defcdcb15 ./g7uj29jp.iso

isoファイルダウンロード

sha256形式のチェックサム確認

sha1形式のチェックサム確認

md5形式のチェックサム確認

昔はこのisoファイルをUSBメモリに書きオムだけで良かったのですが今はUSBメモリで起動できるよう変換が必要です． genisoimage パッケージを導入して geteltorito コマンドでイメージの変換を行います．

$ sudo apt install genisoimage (1)
$ geteltorito -o ./g7uj29jp.img ./g7uj29jp.iso (2)
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

Image has been written to file "./g7uj29jp.img".

イメージ変換のために genisoimage パッケージを導入

geteltorito コマンドでイメージの変換

USBメモリを接続する前に dmesg コマンドを表示しておきます．子の状態でUSBメモリを接続してデバイス名を確認します．以下の例では sdc です．Ctrl+c で終了します．

$ sudo dmesg -Hw
:
[Aug20 17:53] usb 3-2: new high-speed USB device number 12 using xhci_hcd
[ +0.235059] usb 3-2: New USB device found, idVendor=058f, idProduct=6387, bcdDevice= 1.03
[ +0.000009] usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ +0.000005] usb 3-2: Product: Mass Storage
[ +0.000003] usb 3-2: Manufacturer: Generic
[ +0.000002] usb 3-2: SerialNumber: AD279FA8
[ +0.000567] usb-storage 3-2:1.0: USB Mass Storage device detected
[ +0.000200] scsi host7: usb-storage 3-2:1.0
[ +1.017758] scsi 7:0:0:0: Direct-Access Generic Flash Disk 8.07 PQ: 0 ANSI: 2
[ +0.000314] scsi 7:0:0:0: Attached scsi generic sg3 type 0
[ +0.000623] sd 7:0:0:0: [sdc] 3891200 512-byte logical blocks: (1.99 GB/1.86 GiB)
[ +0.000137] sd 7:0:0:0: [sdc] Write Protect is off
[ +0.000004] sd 7:0:0:0: [sdc] Mode Sense: 03 00 00 00
[ +0.000135] sd 7:0:0:0: [sdc] No Caching mode page found
[ +0.000003] sd 7:0:0:0: [sdc] Assuming drive cache: write through
[ +0.286090] sdc: sdc1
[ +0.019783] sd 7:0:0:0: [sdc] Attached SCSI removable disk
^C

usbメモリにイメージを書き込みます．書き込みが終わったら再起動してこのUSBメモリから起動します．

$ sudo dd if=./g7uj29jp.img of=/dev/sdc bs=1M oflag=sync status=progress
33554432 bytes (34 MB, 32 MiB) copied, 11 s, 3.0 MB/s
32+0 records in
32+0 records out
33554432 bytes (34 MB, 32 MiB) copied, 11.337 s, 3.0 MB/s
$ sync
$ sync
$ sync
$ sudo shutdown -h now 'bios update'

アップデートが終わったらバージョンが上がっているのを確認します． 2.76 になりました :)

$ sudo lshw -sanitize | grep "*-firmware" -A 8
*-firmware
description: BIOS
vendor: LENOVO
physical id: c
version: G7ETB6WW (2.76 )
date: 09/10/2019
size: 128KiB
capacity: 16MiB
capabilities: pci pnp upgrade shadowing cdboot bootselect edd int13floppy720 int5printscreen int9keyboard int14serial int17printer int10video acpi usb biosbootspecification uefi
$ sudo dmidecode | grep 'BIOS Information' -A 27
BIOS Information
Vendor: LENOVO
Version: G7ETB6WW (2.76 )
Release Date: 09/10/2019
Address: 0xE0000
Runtime Size: 128 kB
ROM Size: 16 MB
Characteristics:
PCI is supported
PNP is supported
BIOS is upgradeable
BIOS shadowing is allowed
Boot from CD is supported
Selectable boot is supported
EDD is supported
3.5"/720 kB floppy services are supported (int 13h)
Print screen service is supported (int 5h)
8042 keyboard services are supported (int 9h)
Serial services are supported (int 14h)
Printer services are supported (int 17h)
CGA/mono video services are supported (int 10h)
ACPI is supported
USB legacy is supported
BIOS boot specification is supported
Targeted content distribution is supported
UEFI is supported
BIOS Revision: 2.76
Firmware Revision: 1.16
$ hwinfo | grep MODALIAS=dmi:
E: MODALIAS=dmi:bvnLENOVO:bvrG7ETB6WW(2.76):bd09/10/2019:br2.76:efr1.16:svnLENOVO:pn23533KJ:pvrThinkPadT430s:skuLENOVO_MT_2353:rvnLENOVO:rn23533KJ:rvrNotDefined:cvnLENOVO:ct10:cvrNotAvailable:
$ sudo inxi -Fxxxz | grep Machine: -A1
Machine: Type: Laptop System: LENOVO product: 23533KJ v: ThinkPad T430s serial: <filter> Chassis: type: 10 serial: <filter>
Mobo: LENOVO model: 23533KJ serial: <filter> UEFI: LENOVO v: G7ETB6WW (2.76 ) date: 09/10/2019

同じ方法で LENOVO Thinkpad Yoga-260 でもBIOSアップデートできました．

環境

$ dpkg-query -W genisoimage coreutils
coreutils 8.32-4+b1
genisoimage 9:1.1.11-3.2
$ lsb_release -dr
Description: Debian GNU/Linux 11 (bullseye)
Release: 11
$ dpkg-query -W genisoimage coreutils lshw dmidecode hwinfo inxi
coreutils 8.32-4+b1
dmidecode 3.3-2
genisoimage 9:1.1.11-3.2
hwinfo 21.72-1
inxi 3.3.06-1-1
lshw 02.18.85-0.7