オンプレミスAIサーバー(ローカルLLM + 社内文書RAG)の構築を始めました。機材はGMKtec EVO-X2、AMD Ryzen AI Max+ 395搭載のミニPCです。128GBのユニファイドメモリをGPUに大きく割り当てられるので、ローカルLLM用途では今いちばん面白いマシンだと思っています。
この記事は初日の作業ログです。結論から言うと「インストールUSBが起動しない」「有線LANが認識されない」という2つの罠を踏んだので、同じ構成を組む方のために記録しておきます。
最初に迷うのがここですが、サーバー用途ならUbuntu Server一択でした。
日常操作はすべてブラウザ(Open WebUI)経由なので、サーバーOSにGUIは不要です。管理画面が欲しければCockpitを入れれば、Webブラウザからメトリクス確認・サービス再起動・ターミナルまで使えます。「CUIのサーバー + Web管理画面」が現代の標準形だと思います。
電源ON直後にDel連打でBIOS(AMI)へ入ります。設定したのは3つです。
Advanced → GFX Configuration)。EVO-X2はメインメモリをGPU専用領域として切り出す方式で、デフォルトは数GBしかありません。ここを上げないと大きいモデルがGPUに載りません。gpt-oss-120bクラスを視野に入れるなら96GBです。OS側に残るのは32GBですが、サーバースタックには十分ですAdvanced 直下)。停電復帰後に自動起動する設定です。ヘッドレス運用では必須ですUbuntu Server 24.04のISOをMacから dd でUSBメモリに書き込み、いざブート……しません。Boot Overrideに出てくる「UEFI OS」を選んでもWindowsが立ち上がってしまいます。
切り分けの過程が学びでした。
UEFI OS (内蔵SSDの型番) ― つまり全部内蔵SSDのエントリで、USBはブート候補にすら出ていないAdvanced → USB Configuration を見ると、USBメモリ自体は認識されている原因はおそらく、dd の書き込みが完全に終わる前に抜いてしまったことです。dd は進捗表示が止まってからもバッファの書き出しが続くので、完了統計が表示されるまで待たなければいけません。パーティションテーブルはディスク先頭に書かれるため、途中で切れていても一見正常に見えるのが厄介なところです。
教訓: インストールUSB作成はbalenaEtcherを使いましょう。 書き込み後に自動でベリファイ(照合)まで走るので、「書けたつもり」が原理的に起きません。Etcherで書き直したら一発で起動しました。
https://github.com/<ユーザー名>.keys で公開されている鍵を取り込んでくれる……はずでしたが、ここでも伏線が。ネットワークに繋がらずインポート失敗。 この時点では「まあ後でssh-copy-idすればいいか」と流しましたcorrect-horse-battery-staple をそのまま使うのは最悪手です(あらゆる攻撃辞書に載っています)インストール完了、ログイン成功。しかし ip a を見ると有線LANにIPがありません。それどころか、よく見ると有線のインターフェース自体が存在しません。
カーネルログを見て原因が確定しました。
$ sudo dmesg | grep r8169
r8169 0000:xx:00.0: unknown chip XID 689, contact r8169 maintainers
EVO-X2の2.5GbEチップ(Realtek RTL8125D)が新しすぎて、Ubuntu 24.04の標準カーネル6.8のドライバが知らないチップだったのです。インストール中にネットに繋がらなかったのもこれが原因でした。ケーブルを何度挿し直しても無駄だったわけです。
教訓: 「繋がらない」時はケーブルを疑う前に dmesg を読みましょう。 カーネルログには大抵、答えがそのまま書いてあります。
新しいチップに対応するには、新しいカーネルを入れれば解決します。Ubuntuには**HWE(Hardware Enablement)**という仕組みがあり、LTSの安定性を保ったまま新しめのカーネルを公式に導入できます。
sudo apt update
sudo apt install -y linux-generic-hwe-24.04
sudo reboot
ただし鶏と卵で、これを入れるにはネットワークが必要です。一時しのぎとしてWi-Fiをnetplanで設定しました。
# /etc/netplan/50-wifi.yaml
network:
version: 2
wifis:
wlp99s0:
dhcp4: true
access-points:
"SSID":
password: "********"
YAMLはインデントが命で、ここで true を trye と打ったり、インターフェース名を間違えたり(実機は wlp99s0 でした。ls /sys/class/net で確認できます)、nanoの保存でCtrl+Oのつもりが O を挿入してしまったりと、タイポ地獄を一通り経験しました。エラーメッセージは行番号と列番号まで教えてくれるので、落ち着いて読めば必ず直せます。
HWEカーネル(7.0系)で再起動すると:
$ ip -br a
eno1 UP 192.168.0.47/24 ← 出現!
wlp99s0 UP 192.168.0.83/24
有線LANが eno1 として認識され、無事開通しました。metric は有線100・Wi-Fi600で、小さい方が優先されるため、両方繋がっていても通信は自動的に有線を通ります。
株式会社coiaiでは、オンプレミスAI導入・社内文書RAG構築・AI活用研修を提供しています。
coiai
この記事もおすすめ
株式会社coiaiは、「想像できることを美しく実現」を掲げ、XR・Web・アプリ・システム開発およびDX支援を行う会社です。 創業2022年、東京都練馬区に本社を置き、要件のヒアリングからPoC(概念実証)、本番運用まで一貫して伴走します。 まずはお気軽にご相談ください。
主なご相談内容
詳しい会社情報は会社概要ページでご覧いただけます。