UbuntuでSurface Go 3のファームウェアを更新する

Ubuntuだけ入っているSurface Go 3(以下、SGO3)でファームウェアを更新します。  
SGO3のドライバーとファームウェアのサービス期間は2027年10月5日なので、今後も偶に更新する機会があるはずです。私が前回更新したのは2024年1月で、当時はUbuntu 23.10でした。

## 環境

- Surface Go 3
- Ubuntu 24.04

## 必要なもの

### surface-uefi-firmware

ファームウェアアップデートのフォーマットを変換するツールです。

https://github.com/linux-surface/surface-uefi-firmware

### fwupd

ファームウェアを更新するツールです。

https://github.com/fwupd/fwupd

サインなしのファイルでも使用できるように、/etc/fwupd/fwupd.confにOnlyTrusted=falseを追加します。
```toml
[fwupd]
# use `man 5 fwupd.conf` for documentation
OnlyTrusted=false
```

## 手順

### 1. ファームウェアファイルのダウンロード  

マイクロソフトのDownload CenterからSurface 用のドライバーとファームウェアをダウンロードします。LinuxでSurfaceアプリを開くことはできませんから、Webページを下にスクロールし、Surface のドライバーとファームウェアの手動更新のところでモデルを選択するとダウンロードリンクが表示されます。  
リンク先ではWindows11用とWindows10用の2つのファイルのリンクがあり、そのリンクからファイルがダウンロードできます。  
今回はWindows 11用の SurfaceGo3_Win11_22621_24.050.2873.0.msi をダウンロードしました。



### 2. surface-uefi-firmware を使いフォーマットを変換する

```shell
cd surface-uefi-firmware
./repack.sh ../SurfaceGo3_Win11_22621_24.050.2873.0.msi -o fwupdates
```

ファイルを展開して再構成してくれます。
```plane
==> Extracting ../SurfaceGo3_Win11_22621_24.050.2873.0.msi
==> Repacking ./tmp.UaHs55OdNc/SurfaceUpdate/surfacesmf/SurfaceSMF.inf
==> Repacking ./tmp.UaHs55OdNc/SurfaceUpdate/surfacepd/SurfacePD.inf
==> Repacking ./tmp.UaHs55OdNc/SurfaceUpdate/surfacetpm_ntz/SurfaceTPM.inf
==> Repacking ./tmp.UaHs55OdNc/SurfaceUpdate/surfacetouch/SurfaceTouch.inf
==> Repacking ./tmp.UaHs55OdNc/SurfaceUpdate/surfaceec/SurfaceEC.inf
==> Repacking ./tmp.UaHs55OdNc/SurfaceUpdate/ish/SurfaceISH.inf
==> Repacking ./tmp.UaHs55OdNc/SurfaceUpdate/surfaceme/SurfaceME.inf
==> Repacking ./tmp.UaHs55OdNc/SurfaceUpdate/surfacetpm_ntc/surfacetpm.inf
==> Repacking ./tmp.UaHs55OdNc/SurfaceUpdate/uefi/SurfaceUEFI.inf
Success!
If you wish, you may now install the firmware like so:

  sudo fwupdmgr install --allow-older --allow-reinstall --no-reboot-check --force 'fwupdates/surfacesmf_74.0.35_928e813f-a355-451d-a0ec-f917970c72f9.cab'
  sudo fwupdmgr install --allow-older --allow-reinstall --no-reboot-check --force 'fwupdates/surfacepd_2.6.0_a439deea-8139-49f2-bdce-c1d0dbf6cd15.cab'
  sudo fwupdmgr install --allow-older --allow-reinstall --no-reboot-check --force 'fwupdates/surfacetpm_ntz_55.33.1536_f13104af-7099-42d8-92ba-156735f8ee95.cab'
  sudo fwupdmgr install --allow-older --allow-reinstall --no-reboot-check --force 'fwupdates/surfacetouch_6.4.9728_cba990ca-3d8d-4dfd-8e34-94eeed1971a7.cab'
  sudo fwupdmgr install --allow-older --allow-reinstall --no-reboot-check --force 'fwupdates/surfaceec_4.26.32768_c117fbce-cff3-44b5-ad72-da56b4fccda5.cab'
  sudo fwupdmgr install --allow-older --allow-reinstall --no-reboot-check --force 'fwupdates/ish_49.1.13_d4250c93-1e5b-4b54-8aeb-ea297f1404c0.cab'
  sudo fwupdmgr install --allow-older --allow-reinstall --no-reboot-check --force 'fwupdates/surfaceme_184.94.4494_1430fb8a-9eeb-4259-8d12-0677b91bfe3f.cab'
  sudo fwupdmgr install --allow-older --allow-reinstall --no-reboot-check --force 'fwupdates/surfacetpm_ntc_7.2.512_1c472044-934f-4b0f-8c91-813ef436809d.cab'
  sudo fwupdmgr install --allow-older --allow-reinstall --no-reboot-check --force 'fwupdates/uefi_13.0.27791_28d35383-b6c2-44be-897c-aa9f24f15342.cab'
```

### 3. fwupdmgrでファームウェアを更新する

個別に更新できますが、面倒なので全て更新します。未対応なファイルは無視してくれます。

```shell
for f in fwupdates/*; do 
    sudo fwupdmgr install --allow-older --allow-reinstall --no-reboot-check "$f"
  done
```

ファームウェアを更新してくれました。ファームウェアの対象のデバイスが見つからないところはスキップしてくれています。

```plane
Waiting…                 [***************************************]
Successfully installed firmware
Waiting…                 [***************************************]
Successfully installed firmware
Waiting…                 [***************************************]
Successfully installed firmware
Waiting…                 [***************************************]
Successfully installed firmware
Waiting…                 [***************************************]
Successfully installed firmware
Waiting…                 [***************************************]
Successfully installed firmware
Decompressing…           [  -                                    ]
No supported devices found
Decompressing…           [  -                                    ]
No supported devices found
Waiting…                 [***************************************]
Successfully installed firmware
```

### 4. 再起動して新しいファームウェアを適用する

マシンを再起動するとファームウェアが適用されます。Windowsのロゴの下にプログレスバーが表示され、進捗状況が表示されます。適用するファームウェアの分だけプログレスバーはリフレッシュされるので、その表示は何回か繰り返されます。