この記事を作った動機

 最近GitHub - xCuri0/ReBarUEFI: Resizable BAR for (almost) any UEFI systemを使って、Intel Arc A770 を Windows 11 で運用していたが Linux 環境を使うようになって、新たに対応が必要なことが分かった。

 具体的には、Windows 利用時は、GitHub - xCuri0/ReBarUEFI: Resizable BAR for (almost) any UEFI systemで提供されている、ReBarState.exeを使うことで Bar サイズを自分で指定すれば勝手に UEFI 変数が必要な分設定されたが、Linux 環境にそのような専用ツールはないと思っていたので、自分で UEFI 変数を書こうとしていた。

 その過程で、UEFI 変数を書き込むことに苦戦したんのでその記録を取る。またあとから気づいた ReSizebleBar の UEFI ドライバが使う変数を書き込む専用ツールをソースコードからコンパイルすることについても記録する。基本的にGitHub - xCuri0/ReBarUEFI: Resizable BAR for (almost) any UEFI system関して UEFI 変数を設定する必要がある場合は、ツールを使う方法を推奨する。

環境

System Details Report

Report details

  • Date generated: 2026-03-01 13:39:42

Hardware Information:

  • Hardware Model: HP ProLiant ML150 Gen9
  • Memory: 80.0 GiB
  • Processor: Intel® Xeon® E5-2667 v4 × 32
  • Graphics: Intel® Arc™ A770 Graphics (DG2)
  • Disk Capacity: 1.5 TB

Software Information:

  • Firmware Version: P95
  • OS Name: Arch Linux
  • OS Build: (null)
  • OS Type: 64-bit
  • GNOME Version: 49
  • Windowing System: Wayland
  • Kernel Version: Linux 6.18.6-arch1-1

ツールを使う

 GitHub - xCuri0/ReBarUEFI: Resizable BAR for (almost) any UEFI systemでReSizebleBar のためにUEFIの設定が必要な場合について記録する。すでに作業ディレクトリを作成し、移動していることを前提として想定している。

必要なツールのインストール

sudo pacman -Sy base-devel cmake

GitHub - xCuri0/ReBarUEFI: Resizable BAR for (almost) any UEFI systemをクローン

git clone https://github.com/xCuri0/ReBarUEFI.git

コンパイルする

cd ReBarUEFI/ReBarState/
cmake -B ./
make

実行する

sudo ./ReBarState 

# ReBarState (c) 2023 xCuri0
# 
# Current ReBarState 1 / 2 MB
# 
# Verify that 4G Decoding is enabled and CSM is disabled otherwise system will not POST with GPU. If your ReBarState value keeps getting reset then check your system time.
# 
# It is recommended to first try smaller sizes above 256MB in case BIOS doesn't support large BARs.
# 
# Enter ReBarState Value
#       0: Disabled 
# Above 0: Maximum BAR size set to 2^x MB 
#      32: Unlimited BAR size
# 
# 12
# Writing value of 12 / 4096 MB to ReBarState
# 
# Successfully wrote ReBarState UEFI variable
# 
# Reboot for changes to take effect

UEFI 変数を直接書き込む

 Linux 環境においては、/sys/firmware/efi/efivars 配下に各 UEFI 変数がファイルとして独立してバイナリ形式で存在している。ここに所定の決まった[変数名]-[変数の識別子のUUID]という構成でバイナリファイルを書き込んだりすることで、UEFI 変数の設定が可能である。

 今回の問題であるGitHub - xCuri0/ReBarUEFI: Resizable BAR for (almost) any UEFI systemについて、設定する必要のある UEFI 変数名と UUID については、ReBarUEFI/ReBarState/ReBarState.cpp at master · xCuri0/ReBarUEFI · GitHub のソースコードをもとに以下ののようになっていることを確認した。

 ちなみに途中でツールを使う方法を見つけたため、この方法については、とりあえず動くというだけで実際に機能するか検証していない。ただ、このスクリプトを実行したあとに、ツールを使うところでコンパイルした、ReBarState 経由から設定した値によって Bar サイズが意図したとおりに設定で設定できていそうなことは確認した。

  • 変数名
    ReBarState
  • UUID
    a3c5b77a-c88f-4a93-bf1c-4a92a32c65ce

  • Unsigned INT 8

 そこで以下のようにして変数を書き込むスクリプトを作った。書き込み保護がかかっており、手動では機能してもスクリプトでは機能しないことがあったので、chattrコマンドを使って、一時的に書き込み保護を解除するようにした。-iが書き込み保護を外すオプションであり、+iが書き込み保護を復活させるオプションである。

#!/bin/bash
cd /sys/firmware/efi/efivars
# 2^12 -> 4 GB
sudo chattr -i /sys/firmware/efi/efivars/ReBarState-a3c5b77a-c88f-4a93-bf1c-4a92a32c65ce

# ReBar サイズの設定数値の例
# 4GB -> 2^12 -> 0x0c(12) を設定する
# printf "\x07\x00\x00\x00\x[ReBarサイズ16進数]" | sudo dd of="/sys/firmware/efi/efivars/[UEFI変数名]-[UEFI UUID]" bs=5 count=1

# 他の UEFI 変数を扱う場合は、bs= や count= などの引数を調整する必要があると思われる。
printf "\x07\x00\x00\x00\x0c" | sudo dd of="/sys/firmware/efi/efivars/ReBarState-a3c5b77a-c88f-4a93-bf1c-4a92a32c65ce" bs=5 count=1

sudo chattr +i /sys/firmware/efi/efivars/ReBarState-a3c5b77a-c88f-4a93-bf1c-4a92a32c65ce
sudo hexdump /sys/firmware/efi/efivars/ReBarState-a3c5b77a-c88f-4a93-bf1c-4a92a32c65ce

参考にしたサイトとか