efivarfs
efivarfs は、ユーザが (U)EFI 変数を作成、削除、および変更できるようにする、Linux カーネル内のファイルシステムです。efivarfs は、典型的に (そして自動的に) /sys/firmware/efi/efivars にマウントされます; もし手動でマウントする必要がある場合は、次のコマンドを使用できます:
root #
mount -t efivarfs none /sys/firmware/efi/efivars
はじめに
efivarfs は、EFI 変数を保守するために sysfs 内でエントリを使用する際の問題点に対処するために作成されました: 古い sysfs の EFI 変数のコードは 1024 バイト以下の変数のみをサポートしていました。これは元々 EFI 仕様のバージョン 0.99 にあった制限でしたが、完全版のリリース前に削除されたものです[1]。
非標準の UEFI 変数を削除するとシステムファームウェアが POST に失敗するというバグが多数存在するため、既知の標準化された変数以外の efivarfs ファイルは変更不可ファイルとして作成されます。これは削除を妨げるものではありません—
chattr -i
は動作します—が、偶発的な削除を防止します。/sys/firmware/efi/efivars 内の UEFI 変数の内容を確認するときには、出力の最初の 4 バイトに注目してください - UEFI 変数の属性を、リトルエンディアン形式で表現しています。実際問題としては、各 efivar は以下の形式になります:
4_bytes_of_attributes + efivar_data
。カーネル
CONFIG_EFIVAR_FS サポートを有効化する必要があります:
Device Drivers --->
Firmware Drivers --->
[ ] Disable EFI runtime services support by default
File systems --->
Pseudo filesystems --->
<*> EFI Variable filesystem
トラブルシューティング
EFI-CSM: BIOS モード
x86 では、UEFI がレガシーな BIOS を置き換えました。移行期間中の後方互換性を有効化するために、x86 上の UEFI には Compatibility Support Module (CSM) と呼ばれる BIOS エミュレーションが含まれています。EFI-CSM が有効化されて使用されている場合、OS からの UEFI の機能の隠蔽を含め、レガシー BIOS のように振る舞うでしょう。
UEFI 対応ハードウェアでこのファイルシステムが存在しない場合、それはおそらくそのハードウェアがレガシー (BIOS) モード、つまり EFI-CSM でブートされていることを意味するでしょう。
多くの場合、2020 年以降に製造されたコンピュータは、BIOS モードで起動できない純粋な UEFI システムであると見てよいでしょう; また別の重要な点として、セキュアブートが有効化されている場合、EFI-CSM は自動的に無効化されます。
EFI ランタイムが利用可能でない
すべての (U)EFI 関数は、カーネル引数 efi=noruntime
で無効化、または efi=runtime
で有効化することができます。EFI ランタイム関数を使用せずにブートされたカーネルは、ブート構成設定も含め、どんな EFI 設定および変数も変更することはできないでしょう。
関連項目
- Efibootmgr — UEFI ブートエントリを管理するためのツールです。