PC Engines APU2/APU4のcoreboot firmwareを、VyOS上からv4.19.0.1へ更新する手順です。APU2/APU4とも実機作業で確認済みです。
VyOSではflashromをそのまま用意しにくく、新しいUbuntuでビルドしたバイナリもglibcのバージョン差で動作しませんでした。本記事では、Debian 11コンテナでflashrom 1.3.0をビルドし、データ用USBから実行する方法を紹介します。
注意
firmware書き込みに失敗すると起動できなくなる可能性があります。安定した電源とシリアルコンソールを用意し、必ず現在のROMをバックアップしてください。APU2で使う
boardmismatch=forceは、機種・ROM・SPIチップを実機で確認した場合だけ使用します。
実績環境
| 項目 | APU2 | APU4 |
|---|---|---|
| 更新先 | v4.19.0.1 | v4.19.0.1 |
| ROM | apu2_v4.19.0.1.rom |
apu4_v4.19.0.1.rom |
| SPIチップ刻印 | 25Q64FVSIG |
25Q64JVSIQ |
flashromの-c指定 |
W25Q64BV/W25Q64CV/W25Q64FV |
W25Q64JV-.Q |
| 結果 |
VERIFIED、起動確認済み |
VERIFIED、起動確認済み |
必要なもの
- PC Engines APU2またはAPU4
- 安定した電源
- シリアルコンソール用USBケーブル
- 端末ソフト(Tera Term、PuTTY、minicomなど)
- VyOSなど、x86_64 Linuxを起動できるUSB
- FAT32でフォーマットしたデータ用USB
- Dockerを実行できる環境(flashromのビルド用。Windows+Docker DesktopやLinuxなど)
起動用USBに既にVyOSが入っていても問題ありません。今回はVyOS起動用USBと、firmware・flashrom・バックアップを保存するデータ用USBを分けました。
flashromを別の方法で用意できる場合、Docker環境は不要です。
VyOS以外の環境でも更新できる
今回は、手元にあった起動用USBをそのまま利用できるためVyOSを使用しました。firmware更新自体はVyOS固有の機能ではなく、APU上で動作し、内蔵SPIフラッシュへアクセスできるflashrom実行環境があれば行えます。
PC Engines公式手順では、次の環境や方法が案内されています。
- Debian系Linuxで
flashromパッケージを使用する - flashrom入りのTinyCore Linuxを使用する
- FreeBSDまたはNetBSDから実行する
- OPNsense向けfirmware updaterを使用する
また、通常起動できない場合の復旧方法として、外部SPI書き込み器やRaspberry Piなどを使用する方法もあります。
本記事では、手元のVyOSを起動環境として再利用し、互換性のあるflashromをデータ用USBから実行する方法を扱います。
1. firmware ROMを公式配布元から取得する
PC Engines firmware v4.19.0.1のリリースページから、実機に合うROMを取得します。APU2用とAPU4用を取り違えないでください。
ダウンロード後、SHA-256を確認します。
sha256sum apu2_v4.19.0.1.rom
確認した公式値は次のとおりです。
d0d7580e13873fc3f604c9be1bd9f7a99f4b8f66b6808ab136d9e7476f4c87d3 apu2_v4.19.0.1.rom
8acccb9c71f3298df9760b27cd483842aa6a11bd55e8df4f660bac147d9127d6 apu4_v4.19.0.1.rom
ROMは記事やGitリポジトリへ再収録せず、利用時に公式配布元から取得する運用にしました。
2. flashrom 1.3.0をDebian 11でビルドする
VyOS 1.3.3では、通常のAPT運用でgccなどのビルド環境を導入できませんでした。また、新しいUbuntuでビルドしたflashromは次のエラーで起動できませんでした。
GLIBC_2.33 not found
GLIBC_2.34 not found
そこでDebian 11(bullseye)のDockerコンテナでビルドします。
curl -LO https://download.flashrom.org/releases/flashrom-v1.3.0.tar.bz2
tar xjf flashrom-v1.3.0.tar.bz2
同じディレクトリにdocker-compose.ymlを作ります。
services:
flashrom-build:
image: debian:11
working_dir: /work/flashrom-v1.3.0
tty: true
stdin_open: true
volumes:
- ./:/work
command: >
bash -lc "
apt update &&
apt install -y build-essential pkg-config libpci-dev libusb-1.0-0-dev &&
make clean || true &&
make &&
ldd ./flashrom &&
strings ./flashrom | grep GLIBC_ || true
"
ビルドします。
docker compose up --abort-on-container-exit
生成されたflashrom-v1.3.0/flashrom、対象機種用ROM、flashromのソースアーカイブをデータ用USBへコピーします。実機で使用したバイナリは、要求するGLIBCバージョンが最大GLIBC_2.17であることを確認しました。
3. シリアルコンソールからVyOSを起動する
シリアルコンソールは115200 bps、8 data bits、parity none、1 stop bit、flow control noneです。起動時にF10を押してVyOSのUSBを選択します。
USBを取り違えないよう、最初は起動用USBだけを挿し、VyOS起動後にデータ用USBを挿す方法が安全です。
4. データ用USBをマウントする
lsblk -o NAME,SIZE,FSTYPE,LABEL,MOUNTPOINTS,MODEL
以下はデータ用USBが/dev/sdb1だった例です。必ず表示結果に合わせて読み替えます。
sudo mkdir -p /mnt/fwusb
sudo mount /dev/sdb1 /mnt/fwusb
cd /mnt/fwusb/flashrom-v1.3.0
sudo ./flashrom --version
5. 機種とSPIチップを目視確認する
書き込み前に、筐体・基板のモデルとSPIフラッシュの刻印を確認します。実機で確認した組み合わせは次のとおりです。
| 機種 | SPI刻印 | flashromの-c指定 |
|---|---|---|
| APU2 | 25Q64FVSIG |
W25Q64BV/W25Q64CV/W25Q64FV |
| APU4 | 25Q64JVSIQ |
W25Q64JV-.Q |
SPIフラッシュの接写です。基板上の部品番号はU23、刻印は25Q64FVSIGと読めます。
APU2の25Q64FVSIGに対応する定義はW25Q64BV/W25Q64CV/W25Q64FV、APU4の25Q64JVSIQに対応する定義はW25Q64JV-.Qです。基板リビジョンなどで異なるチップが搭載されている可能性があるため、記事の値をそのまま使わず実物を確認します。
6. flashromで認識を確認する
次のコマンドは認識確認だけで、読み書きは行いません。
sudo ./flashrom -p internal -c "W25Q64BV/W25Q64CV/W25Q64FV"
実機では次のように認識されました。
coreboot table found at 0x77fae000.
Found chipset "AMD FCH".
Enabling flash write... OK.
Found Winbond flash chip "W25Q64BV/W25Q64CV/W25Q64FV" (8192 kB, SPI) mapped at physical address 0x00000000ff800000.
No operations were specified.
No operations were specified.は、操作を指定していないため終了したという意味です。
APU4で25Q64JVSIQを確認した場合は、次のように指定します。
sudo ./flashrom -p internal -c "W25Q64JV-.Q"
7. 現在のROMを2回バックアップする
sudo ./flashrom -p internal -c "W25Q64BV/W25Q64CV/W25Q64FV" -r ../apu2-backup-before-update-a.rom
sudo ./flashrom -p internal -c "W25Q64BV/W25Q64CV/W25Q64FV" -r ../apu2-backup-before-update-b.rom
cmp ../apu2-backup-before-update-a.rom ../apu2-backup-before-update-b.rom && echo "BACKUP MATCH"
ls -lh ../apu2-backup-before-update-*.rom
実機ではBACKUP MATCHとなり、両方とも8.0 MiBでした。一致しない場合は書き込みを中止します。
APU4ではバックアップ名をapu4-backup-before-update-a.rom、apu4-backup-before-update-b.romとし、すべての-c指定をW25Q64JV-.Qへ変更します。
8. firmwareを書き込む
APU2(W25Q64FV)
APU2の実機情報とROM内のボード名には表記差がありました。
ROM: PC Engines:apu2
実機検出: PC Engines:PCEngines apu2
本機がAPU2であること、ROMがAPU2用であること、SHA-256、SPIチップをすべて確認したうえで、boardmismatch=forceを指定しました。
sudo ./flashrom -p internal:boardmismatch=force -c "W25Q64BV/W25Q64CV/W25Q64FV" -w ../apu2_v4.19.0.1.rom
APU4(W25Q64JV)
APU4ではboard mismatchは発生せず、次のコマンドで更新できました。
sudo ./flashrom -p internal -c "W25Q64JV-.Q" -w ../apu4_v4.19.0.1.rom
書き込み中は電源やUSBへ触れません。成功時は最後に次の表示になります。
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.
VERIFIEDにならなかった場合は、再起動や電源断をせずに原因を確認します。
9. 完全電源断して更新を確認する
sync
sudo poweroff
停止後、次の順番で完全電源断します。
- ACアダプターを抜く
- 起動用・データ用USBを外す
- 10秒程度待つ
- ACアダプターを接続する
シリアルコンソールでv4.19.0.1への更新を確認できました。
PC Engines apu2
coreboot build 20230131
BIOS version v4.19.0.1
上の画面はAPU2です。APU4でも更新後のBIOS画面にBIOS version v4.19.0.1と表示されることを確認しました。
OS起動後はsudo dmidecode -s bios-versionでも確認できます。全体書き込み後は起動順などのfirmware設定が初期化される可能性があります。
補足:部分更新を使わなかった理由
PC Engines公式手順には--fmap -i COREBOOTで実行時設定を保持する方法がありますが、移行元がv4.14.0.1以降の場合に限られます。今回はそれより古いfirmwareからの更新だったため、ROM全体を書き込みました。
まとめ
- VyOS上で直接ビルドせず、Debian 11コンテナで古いglibcに対応するflashromを用意する
- APU2/APU4とSPIチップの組み合わせを目視し、現在のROMを2回読み出して一致を確認する
- APU2の
boardmismatch=forceは表記差の原因を確認したうえで使用する - APU4では
25Q64JVSIQに合わせてW25Q64JV-.Qを指定する - 最後に
VERIFIEDと電源断後のバージョンを確認する


