WindowsとUbuntuをデュアルブートしてるPC(SSD)で、Ubuntuの起動時に SBAT self-check failed:Security Policy Vioration のエラーが出てしまう際の解決策

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782462/3c87128d-4f4d-e205-80a6-de7eeb58e300.png)
###### 「Verifiying shim SBAT data failed: Security Policy Violation Something has gone seriously wrong: SBAT self-check failed; Security Policy Violation」
WindowsとUbuntuをデュアルブートしてるPC(SSD)で、Ubuntuの起動時にこの文章が出て、Ubuntuが起動できなくなった方は居ないだろうか？この現象の解決策の一つを発見したので、共有しておきたい。（自分含め３名は解決したのを確認したが、絶対解決するとは断言できないことをご理解いただきたい。）

:::note info
見出し
[この現象が起こる主な条件]()
[この現象が起こる原因]()
>[セキュアブートのモードが Windows とそれ以外で異なるためである。]()

>[8/13のWindows11のupdateの内容によってこの現象は起きたとみられる。]()

[この現象の解決方法]()
>[1. Disable Secure Boot（セキュアブートを非UEFIモードにする）]()

>[2. Log into your Ubuntu user and open a terminal（Ubuntuを起動し、ターミナルを開く）]()

>[3. Delete the SBAT policy with code（下記のコードを入力して、SBAT policyを削除する。）]()

>[4. Reboot your PC and log back into Ubuntu to update the SBAT policy（Ubuntuを再起動して、SBAT Policyの設定の上書き保存）]()

>[5. Reboot and then re-enable secure boot in your BIOS.（UEFIモードに戻してUbuntuが起動するか確認）]()

:::

### この現象が起こる主な条件
①Windowsとubuntuをデュアルブートしている
②8/13のWindows11のupdateを実行している（つまり１３日以降にWindows Updateをした）
③PCのセキュアブートのUEFIモードがオンになってる(殆どのPCはデフォルトはオンだが稀にオフになっていることがあり回避できる)
### この現象が起こる原因
##### セキュアブートのモードが Windows とそれ以外で異なるためである。
Windows11は起動にセキュアブートが必要なので、最近はセキュアブートが設定されているBIOS環境が多い。
実はセキュアブートは基本
・UEFIモード
・非UEFIモード
の2種類が用意されている。
このうち、Windowsが対応しているのはUEFIモードのみで、
逆にUbuntu (同様の事例をLinux Mintのフォーラムで見たためDebian Linux全般の可能性がある) は非UEFIモードのみに対応している。
>（引用）
>>・https://zenn.dev/sushichaaaan/scraps/b4d5857b980d45
>>・https://forums.linuxmint.com/viewtopic.php?t=427297
（Linux Mintのフォーラム）
##### 8/13のWindows11のupdateの内容によってこの現象は起きたとみられる。
「2024 年 8 月 13 日 — KB5041585 (OS ビルド 22621.4037 および 22631.4037)」（8/13のWindows11のupdate）によると、
[Secure Boot Advanced Targeting (SBAT) と Linux Extensible Firmware Interface (EFI)] この更新プログラムは、Windows を実行するシステムに SBAT を適用します。 これにより、脆弱な Linux EFI (Shim ブートローダー) の実行が停止されます。 この SBAT 更新プログラムは、Windows と Linux をデュアルブートするシステムには適用されません。 SBAT 更新プログラムが適用されると、古い Linux ISO イメージが起動しない可能性があります。 これが発生した場合は、Linux ベンダーと協力して更新された ISO イメージを取得します。
>（引用）
>>・https://support.microsoft.com/ja-jp/topic/august-13-2024-kb5041585-os-builds-22621-4037-and-22631-4037-76655cde-e2ee-49d4-a415-cf9a4d3c3a04

### この現象の解決方法
##### 1. Disable Secure Boot（セキュアブートを非UEFIモードにする）
前述したようにこのエラーが出ている場合、UEFIモードになっているのでWindowsは起動できるがUbuntuは起動できない状態になっていると思います。
そこで、まずはUbuntuを起動するために非UEFIモードにします。
（余談ですが、非UEFIモードのままでもWindowsは起動できますしUbuntuも起動できます。ただし、非UEFIモードのままの場合にセキュリティソフトやゲームのチート対策ソフトに引っかかり、アプリがエラーを出して起動できないことがあります。自分も試しましたが、主なものだとFPSゲームのVALORANTなどが起動できません。）
非UEFIモードにする方法はBIOSを起動して色々するのですが、PCメーカーやPCによって方法が少し異なるので、「PC名（メーカー名）　非UEFIモードにする方法」などで検索して確認することをお勧めします。
<details><summary>ここでは、自分のマシンのMSI GF63 Thin 11UでのBIOS起動方法+非UEFIモードへの変更方法を記載します。（関係ない方は飛ばしていただいて結構です。）</summary>

:::note info
まずはBIOSの起動方法です。状態によってスムーズなやり方が二つに分けられます。
このページ（https://www.chessinu.com/msi-motherboard-bios-uefi/#BIOSUEFI%E7%94%BB%E9%9D%A2%E3%81%AE%E8%B5%B7%E5%8B%95%E6%96%B9%E6%B3%95）
を見ながらでも下記の内容の通りにやっていただいてもどちらでも構いません。
対象のPCでWindowsを起動している状態の場合
①スタートボタン(窓)を右クリックし、「設定」を選択し、「Windowsの設定」から「更新とセキュリティ」を選択します。
②「更新とセキュリティ」から「回復」→「今すぐ再起動」を選択します。
③「オプションの選択」画面から「トラブルシューティング」→「詳細オプション」→「UEFIファームウェアの設定」→「再起動」の順に選択し目的の「BIOS画面」へと行きます。
PCがシャットダウンして今から起動できる状態の場合
「Deleteキー」を(再)起動中のロゴ画面表示中に連打する。そうすると目的の「BIOS画面」へと行きます。
:::
:::note info
次は非UEFIモードへの変更方法です。
基本的にBIOS画面(UEFI画面とも言います)ではマウス操作は出来ず、キー操作だけになります。注意してください。ある程度は横にキーの説明があります。
①Securityのタブに移動してください。
②このタブの一番下のSecure bootを選択して、Enterキー入力で次の画面に遷移してください。
③この画面のSecure boot Supportが現在Enabledになっていると思いますが、そのEnabledを選択してDisabledにしてください。
④最後にキーの説明にある通り、F10入力で設定をセーブしてください。
これでUEFIモードが非UEFIモードに変更できました。
:::
</details>

非UEFIモードに変更できて、再起動してUbuntuが起動できれば、そのまま次に進んでください。

##### 2. Log into your Ubuntu user and open a terminal（Ubuntuを起動し、ターミナルを開く）
ここは読んで字のごとく、Ubuntuを起動して、ターミナルを開いてください。（簡単ですし、各々の方法があると思うので任せます。）
これで終わりです。次に進んでください。

##### 3. Delete the SBAT policy with code（下記のコードを入力して、SBAT policyを削除する。）
```
sudo mokutil --set-sbat-policy delete
```
↑このコードをターミナルに入力し、（パスワード認証があれば認証し、）実行してください。
<details><summary>mokutil unrecognized とエラーが出た。</summary>

:::note warn
（※Ubuntuを初めてセットアップしている際にこのSBATの現象が起きていて、この解決方法を試すと、mokutilがunrecognizedと出てくる可能性があります。この場合、mokutilパッケージのインストールが必要です。説明しきれないので、調べることをお勧めします。）
:::
</details>
実行処理が終了すれば、次に進んでください。

##### 4. Reboot your PC and log back into Ubuntu to update the SBAT policy（Ubuntuを再起動して、SBAT Policyの設定の上書き保存）
実は、さきほどのコードを入力しただけではSBAT Policyの設定が上書き保存されていないらしく、Ubuntuを再起動して、ログインすることで設定が上書き保存されるとのことです。

:::note info
（なぜ、そうなのか理由は分からないので、そういうもんだと思って言われた通りにやってください。）
（理由が分かれば教えていただきたいです。）
:::
特に、何が起こるとかは無いですが、次に進んで貰って大丈夫です。次の手順で成功しているか失敗しているかが分かります。

##### 5. Reboot and then re-enable secure boot in your BIOS.（UEFIモードに戻してUbuntuが起動するか確認）
Ubuntuを再起動したあとは、UEFIモードに戻してUbuntuが起動するか確認します。
UEFIモードにする方法は[1. Disable Secure Boot]()の反対をするだけです。各々の方法でBIOSから非UEFIモード→UEFIモードに戻してください。
UEFIモードに戻せていることが確認出来れば、Ubuntuを起動してください。
先ほどまではUbuntuが起動できなかったと思いますが、起動できるようになっていると思います。
ここで、変わらずSBAT self-check failed:Security Policy Vioration のエラーが出てしまう場合は、何か失敗しています。
もう一度１からやってみて、それでもダメな場合はこの記事ではお手伝いしきれないかもしれません。ごめんなさい。


:::note info
これでUEFIモードにしたまま、WindowsもUbuntuもデュアルブートで問題なく起動すると思います。お読みいただきありがとうございました。
（解決法全体は前述引用のhttps://forums.linuxmint.com/viewtopic.php?t=427297
（Linux Mintのフォーラム）の７つ目の返信を参考にしました。）
:::

(2024/08/30 追記更新)
MicroSoft社が公式に解決方法を提示してくださっていましたが、
（https://learn.microsoft.com/ja-jp/windows/release-health/status-windows-11-22h2#3377msgdesc ）
このURLでその解決法のページを２６日時点では確認出来ていたのに、消えていたので、色々調べたところ、「窓の社」さんがYahooに公式の解決法と同内容の記事を要約して投稿してくださっていたので、それを確認しましょう。（https://news.yahoo.co.jp/articles/e90dfb8782a248373f41e9ca02d392f22462a917 ）
ほとんどはこの投稿と同じ内容ですが、「管理者権限で、Windowsで今後のSBAT更新を防止する。」ことのできるコードが提供されていました。
```
reg add HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Control¥SecureBoot¥SBAT /v OptOut /d 1 /t REG_DWORD
```
ということで、コレを適用しましょう！ってアレ？
```
C:\Users> reg add HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Control¥SecureBoot¥SBAT /v OptOut /d 1 /t REG_DWORD
エラー: キー名が無効です。
"REG ADD /?" と入力すると使用法が表示されます。
```
自分のPCではエラーが出てしまいました！（ここで成功した方はブラウザバックでOKです。）
<details><summary>エラーを読んでみると、"REG ADD /?"と入力してあって、入力してみると（長いので閉じています）</summary>

```
PS C:\Users\myhom> REG ADD /?

REG ADD キー名 [/v 値名 | /ve] [/t 種類] [/s セパレーター] [/d データ] [/f]
        [/reg:32 | /reg:64]

  キー名 …
```
とコードの文法の順番を教えてくれました！これを読む限り、「/d /t」となっているのを「/t /d」の順番にすべきらしいですね。
</details>
かくかくしかじかあって、ということで、

```
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecureBoot\SBAT /v OptOut /t REG_DWORD /d 1
```
「/d /t」となっているのを「/t /d」の順番に変更することで、上手く実行できました！

これでも出来ない人は管理者権限でターミナルを開くの忘れてないかなど自分で色々確認して、それでも分からなければ、やらない方が良いかもしれません！
以上です！お読みいただきありがとうございました。