普通にUbuntuを使っていて、最新のLinuxカーネルを使おうなんて思う場面は少ないと思いますが、一応やっていきます。
以前この記事で実は触れたことがあるのですが、この時は「Intel ARC B580」が発売されたばかりの時で、Ubuntu22.04LTSでなんとか動作させようとしてチャレンジしたことがありました。
要は新しすぎるハードウェアはWindowsほど対応が速くないので、自力でなんとかするしかないということです。
ただ、カーネルのビルドがこの時とはちょっと状況が変わってきているようなので、改めて記事にします。
必要なライブラリ等のインストール
sudo apt install -y make gcc flex bison git gawk dwarves bc zstd pkg-config
sudo apt install -y libncurses-dev libssl-dev libelf-dev libdw-dev libdwarf-dev libzstd-dev
最新のカーネル
最新のLinuxカーネルのソースコードですが、https://www.kernel.org/からダウンロードできます。

cd ~
mkdir -p install
cd install
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.16.8.tar.xz
tar -xvf linux-6.16.8.tar.xz
cd linux-6.16.8
カーネルのコンフィグ
make menuconfig
でビルドのコンフィグを設定していきます。
以前も書きましたが、素人の私では必要不必要がわかりませんので
ビルドに必要な手順だけやっていきます。
ファイル容量の節約とか気にして、ドライバをいろいろ削っていくと
USBメモリすら認識しなくなることもありますので。
まずはこの画面になると思います。











これで、コンフィグの設定は終わりです。
ビルド実行
どうも、Ubuntu/Debian 系の libdwarf-dev
パッケージは /usr/include/libdwarf/dwarf.h
に配置されるのが正しい仕様らしいのですが、ビルドスクリプトでは/usr/include/dwarf.h
のようにinclude直下を参照するらしく、そのままではエラーが出てしまいます。
export CPATH=/usr/include/libdwarf
なので、ビルド前に上記コマンドを実行してから
time make -j$(nproc)
でビルド開始します。


ビルドしたカーネルのインストール
sudo make modules_install
sudo make install
このコマンドでインストールしていきます。
まあまあ時間が掛かります。
Linux Firmwareのインストール
sudo apt update
sudo apt install linux-firmware
sudo update-initramfs -u -k all
このコマンドで新しいLinux Firmwareのインストールをしておきます。
もし、最新のLinux Firmwareをインストールしたい場合は
cd ~
cd install
git clone https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
sudo cp -r linux-firmware/* /lib/firmware/
sudo update-initramfs -u -k all
このコマンドを使うと良いでしょう。
ここで、システムの再起動をします。
手動でもいいですが、
sudo reboot
でもOKです。
再起動後の確認
Firmwareでエラーが出ていないか
sudo dmesg | grep -i firmware
で確認します。
よくわからない場合はChatGPTに丸投げすると良いでしょう。
あとは、以下のコマンドで
uname -r
Linuxカーネルが更新されているか確認しましょう。

これで、OSからドライバソフトウェアに橋渡しする準備は整いましたが、肝心のドライバが無い場合はそのハードウェアの完全な性能は引き出せません。
一応Vulkanなどは動作すると思いますが。
今回は以上です。
追記
気が付かなかったのですが、今回の手順で「Intel ARC B570」のファン回転数やVRAMの温度がモニタリングできるようになったみたいです。


自作ソフトで負荷をかけ、自作スクリプトでモニタリング。
以下はモニタリングに使ったbashスクリプトです。
#!/bin/bash
gnome-terminal --geometry=20x6 -- bash -c '
prev_energy=$(cat /sys/class/hwmon/hwmon6/energy2_input) # GPUの初期エネルギーを取得
while true; do
# CPU温度の取得
temp=$(cat /sys/class/hwmon/hwmon3/temp1_input)
temp_c=$((temp / 1000)).$((temp % 1000)) # 温度を°Cに変換
# GPU温度の取得
gpu_temp=$(cat /sys/class/hwmon/hwmon6/temp2_input)
temp_g=$((gpu_temp / 1000)).$((gpu_temp % 1000)) # 温度を°Cに変換
# VRAM温度の取得
vram_temp=$(cat /sys/class/hwmon/hwmon6/temp3_input)
temp_vram=$((vram_temp / 1000)).$((vram_temp % 1000)) # 温度を°Cに変換
#fan1の取得
fan1=$(cat /sys/class/hwmon/hwmon6/fan1_input)
#fan2の取得
#fan2=$(cat /sys/class/hwmon/hwmon6/fan1_input)
#fan3の取得
#fan3=$(cat /sys/class/hwmon/hwmon6/fan1_input)
# GPU消費電力の計算
current_energy=$(cat /sys/class/hwmon/hwmon6/energy2_input)
power=$(echo "scale=2; ($current_energy - $prev_energy) / 1000000" | bc) # 消費電力を計算
prev_energy=$current_energy # 次のループのために現在のエネルギーを保存
# 表示のクリアと更新
tput cup 0 0 # カーソルを先頭に移動
tput ed # 画面をクリア
echo "CPU Temperature: ${temp_c}°C"
echo "GPU fan: ${fan1}"
#echo "fan2: ${fan2}"
#echo "fan3: ${fan3}"
echo "GPU Power: ${power} W"
echo "GPU Temp: ${temp_g} ℃"
echo "VRAM Temp: ${temp_vram} ℃"
sleep 1
done
exec bash'
コメント