← Blog 一覧

HP ProLiant DL380p Gen8 の轟音ファンを iLO4 アンロックファームで PID 制御して自宅運用可能にした

HP ProLiant DL380p Gen8 iLO4 ilo4_unlock ホームラボ サーバ静音化 fan制御 PID Proxmox

要旨

フォロワーから譲ってもらった HP ProLiant DL380p Gen8 (要するに中古機) を自宅ラックに入れたら、アイドル時から常時 50% 近いファン回転で、夏場は掃除機が部屋で常に動いてるようなレベルでうるさい。

これを kendallgoto/ilo4_unlockiLO4 v2.77 をパッチして fan/pid SSH コマンドを露出させ、PWM 最低値と PID setpoint を調整することで、夜間でも気にならないレベル(体感ほぼ無音)まで静音化した。

  • 環境: HP ProLiant DL380p Gen8 / iLO4 v2.77 (パッチ済) / Proxmox VE ホスト / Mac から SSH
  • ポイント: 公式 iLO4 ファームには fan / fan pid SSH コマンドは存在しない(隠しデバッグ実装)。パッチファームを焼いて初めて使える
  • アンロック対象は v2.77 が事実上の最終(v2.78 以降は HP が制御ユーティリティ自体を削除したのでパッチしても無意味)
  • 設定は揮発するので reboot 後に自動再適用する仕組みが必須

背景: DL380p Gen8 を家のラックに入れた人類共通の悩み

DL380p Gen8 は 2012〜2015 年あたりに広く出回ったエンタープライズサーバ。中古市場で 2 万円台から手に入り、Xeon E5-26xx v2 × 2 + 大量メモリ + Smart Array P420i + SAS 10ベイで自宅サーバとしてのスペックは破格。仮想化基盤・NAS・録画機など何でも来い。

ただし音は地獄。エンタープライズ機は「冷えれば壊れない、うるさくてもいい」設計思想なので、デフォルトでファンが下がらない。HBA カード (P420i) が乗っていると iLO がそれを過剰に冷却しようとして、アイドル時でも全 8 ファンが PWM 100 前後 (≒40%) で常時回転する。

普通のオフィス・住居環境でこれを動かすのは無理。特に夏場は室温が上がるとファンが追従して回転を上げるので、さらに地獄になる。

既存策と限界

よく挙がる対策

  1. 物理的にファンを Noctua 等の静音モデルに換装 — DL380p Gen8 のファンコネクタは特殊なので変換ケーブル必須、しかも回転数フィードバック (tach) を偽装しないと iLO が「ファン異常」で全ファン全開になる
  2. 温度センサーを騙すパッチ済 iLO ファーム — 出所不明バイナリを焼くのでリスク大
  3. iLO4 の SSH 経由で fan / fan pid を叩く — 一番安全で柔軟

3 が本命なのだが、ここで詰まる。

公式 iLO4 には fan/pid コマンドが「存在しない」

iLO4 の SSH に入って help を叩いても、fan / fan pid といったファン制御系コマンドは表示されない。実機で fan ? を叩いても応答ナシ。公式ファームでは出てこない

これらは iLO4 ファーム内部にデバッグコマンドとして実装されてはいるが、外向きの CLI ハンドラには繋がっていない。HPE が意図的に非公開にしている、いわば「隠しコマンド」。

最初は素直に「iLO4 で fan 制御」「DL380p Gen8 静音化」あたりで Reddit (r/homelab, r/HomeServer) を漁っていて見つけたのが kendallgoto/ilo4_unlock — iLO4 ファームをパッチして隠しコマンドを CLI に露出させるツール。同じ DL380p Gen8 静音化スレッドで複数人が言及していたので「これだ」と当たりを付けて入った。

重要: パッチが効くのは iLO4 v2.77 (Dec 07 2020) まで。HP は v2.78 以降で fan / pid 等の制御ユーティリティ実装そのものを削除しているので、それより新しいバージョンにはパッチしても意味がない。v2.77 が事実上の最終解。

ハードルとブレークスルー

kendallgoto/ilo4_unlock のビルド

kendallgoto/ilo4_unlock は、Airbus SecLab の ilo4_toolbox によるリバースエンジニアリング成果をベースに、

  • HPE 公式の iLO4 v2.77 ファームを build スクリプトが自動でダウンロード
  • 内部の CLI ハンドラテーブルを書き換えて、隠しデバッグコマンド (fan / fan pid 含む) を露出させる
  • 整合性チェックを通るように再パックして書き戻し用 .bin を吐く

という Docker ベースのビルドツール。手元では Debian 13 (trixie) 上でビルドした:

git clone --recurse-submodules https://github.com/kendallgoto/ilo4_unlock.git
cd ilo4_unlock
sudo docker build --network=host -o build .

注意: --network=host を付けないと、Docker のブリッジネットワークから deb.debian.org の名前解決が失敗してビルドが落ちる。daemon.json に DNS を書いても効かなかった。--network=host が一番確実。

成功すると build/ 配下に以下が生成される:

  • ilo4_277.bin.patched — パッチ済ファーム (16MB)
  • flash_ilo4 — HPE 配布の ELF 書込ツール (i386 静的リンク)
  • CP027911.xml — HPE パッケージのメタデータ

なお生成された .binilo4_250.bin のような旧バージョン名にリネームして使う流れになっているのは、HPE 公式書込ツール (flash_ilo4) が CP027911.xml の宣言バージョン (v2.50) をチェックする実装になっているため。中身は v2.77 パッチ済。

書き込み: Web UI ではなく flash_ilo4 --direct

パッチ済ファームは iLO Web UI からはアップロードできない(署名検証で弾かれる)。HPE 配布の flash_ilo4 ELF を Linux ホスト上で直接実行する必要がある。

サーバ側で必要な物理手順:

  1. DIP スイッチ S1 を ON (iLO Security Override) — マザーボード上のスイッチ、フラッシュ時のみ必須
  2. AC ケーブルを完全に抜く — シャットダウンだけでは不十分。iLO は待機電源で動作しているので、AC 断しないと S1 の効果が反映されない。これを怠るとパッチコマンド自体が認識されない
  3. AC を戻して起動 → Linux (今回は Proxmox ホスト) にログイン

その上で:

# hpilo カーネルモジュールを外す (flash_ilo4 と排他)
sudo modprobe -r hpilo

chmod +x flash_ilo4
sudo ./flash_ilo4 --direct

実測:

  • ファームサイズ: 0x1000000 bytes (16MB)
  • 消去: 約 2 分
  • 書き込み: 約 1 分

書き込み終了後、iLO を再起動 → AC 断 → DIP スイッチ S1 を OFF に戻す → 再起動。iLO Web UI で iLO 4 Advanced 2.77 Dec 07 2020 (パッチ済) を確認。

一つ罠だったのは、フラッシュ後に iLO の IP が DHCP に変わること。固定 IP の設定が部分的にリセットされる。フラッシュ前に IP メモして、後で再設定が必要。

iLO への SSH 鍵登録

fan / pid コマンドの大量適用を SSH スクリプトで回したいので、SSH 鍵認証を有効にする。

注意点:

  • iLO は RSA 鍵のみ対応。ED25519 / ECDSA は使えない
  • 鍵は iLO Web UI の Administration > User Administration > Administrator > Authorized SSH Keys から登録
  • ペーストする鍵は OpenSSH 形式 (ssh-rsa AAAA... user@host) でそのまま貼れる

Mac から iLO4 に SSH するときの罠

iLO4 はかなり古い SSH 鍵交換 / ホストキーアルゴリズムしか喋らない。Apple Silicon Mac の標準 OpenSSH からはそのままでは接続できず、明示的に古い algo を許可する必要がある:

ssh \
  -oKexAlgorithms=+diffie-hellman-group14-sha1 \
  -oHostKeyAlgorithms=+ssh-rsa \
  -oPubkeyAcceptedKeyTypes=+ssh-rsa \
  -i ~/.ssh/id_rsa \
  Administrator@<iLO_IP>

毎回これを打つのは面倒なので ~/.ssh/config に書いておく:

Host ssh-ilo
  HostName 192.168.x.x
  User Administrator
  IdentityFile ~/.ssh/id_rsa
  KexAlgorithms +diffie-hellman-group14-sha1
  HostKeyAlgorithms +ssh-rsa
  PubkeyAcceptedKeyTypes +ssh-rsa

これで ssh ssh-ilo "fan info g" のように一発で叩ける。

fan / fan pid のコマンド体系

パッチ済 iLO4 の SSH で利用可能になる主要コマンド:

コマンド意味
fan p <fan_id> min <pwm>ファン PWM 最低値の固定 (0-255)
fan p <fan_id> lock <pwm>ファンを指定 PWM に固定 (位置確認用に便利)
fan pid <pid_id> lo <pwm>PID コントローラの下限 PWM
fan pid <pid_id> sp <value>PID setpoint (低いほど閾値が緩い = 静か、100 倍スケールで 5500 = 55.00 ℃)
fan info g現在の全ファン状態 (PWM、回転数)
fan info t全 PID コントローラの状態 (setpoint、出力)
fan g stop / fan g startファンコントローラの再初期化 (GPU 増設時の暴走対策に使う)

fan_id は物理ファン 0〜7、pid_id は温度センサーと結びついた仮想 PID で 50 以上の番号がある。

fan 系コマンドは「返事を返さない」のが仕様

パッチ済 iLO4 で fan p 0 min 25 のような設定コマンドを叩くと、応答が空のまま Enter キーが返ってくる。設定コマンドだけでなく fan info g / fan info t のような参照コマンドも同様に空 で返ってくる。「効いてないのでは?」と最初は思うが、これは ilo4_unlock の実装上の仕様:

  • 公式ファームの null_cmd ハンドラをバイナリパッチで fan 系に置換しているため、出力ストリームの繋ぎ込みが省略されている
  • コマンド自体は正常に実行されている
  • 出力が見える唯一の例外は iLO リセット (reset /map1) 直後の最初の SSH セッション。一度抜けて再ログインするとまた空になる

つまり fan info で日常的に状態確認するのは現実的でない。実運用ではこうする:

  • 設定が効いたかの確認は iLO Web UI の “Fans” / “Temperatures” 画面で見る (パッチ済でも Web UI のセンサー表示は正常)
  • 回転音と温度の経過観察で十分判断できる (PWM 100→25 は耳で明確にわかる)
  • どうしても CLI で詳細を見たい時だけ reset /map1 → 即 SSH ログイン → fan info g のワンショットで取る

「設定コマンドは打ちっぱなしで OK、確認は Web UI」が一番運用が楽。

段階的な調整の試行錯誤

最初は素直に fan p 0 min 25 から fan p 7 min 25 まで全部下げた:

for i in 0 1 2 3 4 5 6 7; do
  ssh ssh-ilo "fan p $i min 25"
done

結果: HD Controller (P420i) が 65℃ → 84℃ まで上昇。fan 6 が HBA / HD コントローラ冷却専用位置にあったため。

最終的に落ち着いたのが以下の設定:

# fan 0-5, 7: min 25 (静か)
for i in 0 1 2 3 4 5 7; do
  ssh ssh-ilo "fan p $i min 25"
done

# fan 6: min 80 (HDコントローラ冷却)
ssh ssh-ilo "fan p 6 min 80"

これで fan 6 だけは少し回り続けるが、他の 7 機は完全に下げきれる。

PID 50 が「下げ切れない」ボトルネックだった話

fan p min をすべて 25 / fan 6 だけ 80 にした状態でも、全ファンの PWM が 97 前後で下がらない 状況が続いた。

reset /map1 直後の SSH ワンショットで fan info t を取って全 PID の状態を眺めると、PID 50 の setpoint が 36℃ で、温度センサーが 35℃ → PID 50 出力が 97 PWM という挙動。この PID 50 が他全部のファンを底上げしていた (前述の通り通常セッションでは fan info も空で返ってくるので、リセット直後の 1 回で取り切るのがコツ)。

# PID 50 の setpoint を 55℃ まで引き上げる
ssh ssh-ilo "fan pid 50 sp 5500"

これで PWM が一気に底打ちした。原因がわかるまで時間がかかった部分。同様に過剰反応していた PID も上げる:

# PID 35: setpoint 40 → 52
ssh ssh-ilo "fan pid 35 sp 5200"
# PID 49, 46, 45: いずれも 55 まで引き上げ
ssh ssh-ilo "fan pid 49 sp 5500"
ssh ssh-ilo "fan pid 46 sp 5500"
ssh ssh-ilo "fan pid 45 sp 5500"

PID 番号と物理的に何を見ているかの公式対応表は無いので、reset /map1 直後のワンショット fan info t で各 PID の温度値・出力 PWM・名称ヒントを取って「PWM が高すぎる PID から潰す」のが現実的な手順。

fan_info t の出力例(抜粋):

PID 50: sp 36   in 35  out 97   ← これがボトルネック
PID 35: sp 40   in 32  out 65
PID 45: sp 49   in 40  out 50
...

PID コントローラ側の下限 PWM も全体に底上げ:

for i in 01 02 03 04 05 06 07 08 09 10 11 12 13 15 17 \
         20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 \
         36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52; do
  ssh ssh-ilo "fan pid $i lo 25"
done

Option Card センサー (PID 18-19) は status N にして無効化

リセット直後のワンショット fan info tOption card does not support OCSD というコメント付きで PID 18 / 19 が status N (無効) になっているケースがある。これらは PCIe 増設カードが OCSD (Out-of-Band Card Sensor Data) をサポートしていない場合の温度センサーで、status N のまま放置しておく のが正解。下手に有効化しようとすると温度未取得 → 「異常」扱い → 全ファン全開になる遠因になる。

設定が reboot で揮発する問題

これらの fan 設定は iLO 再起動 / iLO ファーム更新 / サーバ AC 断で全消し になる。永続化フラグはファーム側に無い。

そこで 常時稼働の Proxmox ホスト (iLO と同じネットワークセグメントにある) の crontab に再適用スクリプトを仕込んでいる:

@reboot sleep 60 && /root/ilo4_fan_control.sh

スクリプトは SSH 用ホスト名 (上記 ssh-ilo) を引いて、3 セット (fan p min、pid lo、pid sp) を一気に再適用する形にまとめている。Proxmox 自体が落ちる時はそもそも全部落ちている時なので、起動順は気にしなくて良い。

結果

状態体感 (主観)HD Controller 温度
パッチ前 (公式デフォルト)掃除機が常に部屋で動いてるレベル (夏場は特に酷い)65℃
fan p min のみ (fan 6 は 80)PC ファン程度84℃
fan pid sp も調整後ほぼ無音84〜85℃ (Caution 105℃ なので十分余裕)

CPU は CPU1 40℃ / CPU2 60℃ (VM 負荷の偏り、許容範囲)、Chipset 52℃、HD Cntlr Zone 48℃。深夜の長時間アイドル放置でも温度警告なし。

教訓

  • 公式 iLO4 に fan / fan pid SSH コマンドは無いkendallgoto/ilo4_unlock でパッチファームを焼くのが唯一の SSH ルート
  • パッチ可能な最終バージョンは v2.77。v2.78 以降は HP がコマンド実装ごと削除している
  • 書き込みは flash_ilo4 --direct のみ(Web UI 不可)。Linux ホスト + DIP S1 ON + AC 完全断 + modprobe -r hpilo が物理前提
  • fan 系コマンド (設定も fan info も) が応答返さないのは仕様。状態確認は Web UI の Fans/Temperatures 画面で行い、CLI で詳細を取りたい時だけ reset /map1 直後のワンショットで取る
  • PID 50 のような「過剰反応 PID」を最初に潰すfan p min だけでは下がらない
  • fan 6 (HBA 冷却) は下げすぎない。DL380p Gen8 の場合は最低 80
  • Option Card センサー (status N) はそのまま放置。下手に有効化しようとすると暴走
  • 設定は揮発するので reboot 後の自動再適用が必須。常時稼働の Linux 機 (今回は Proxmox 自体) の crontab で十分

よくある質問

公式 iLO4 のままで fan / fan pid SSH コマンドは使えない?

使えない。手元の v2.77 環境で確認しても、SSH の help には出ず、コマンドそのものを叩いても応答ナシ。一部のコミュニティで「古いバージョンでは出る」みたいな話を見かけるが、自分は試していない (パッチが安定動作したのでわざわざダウングレード検証する必要が無かった)。SSH 経由でファン制御したいなら ilo4_unlock 一択 と言って良い。

v2.78 / v2.79 / v3 系にパッチしたい

無理。HP は v2.78 以降で fan / pid 等の制御ユーティリティ実装そのものを削除している(コマンドハンドラだけ非公開だった v2.77 までと違って、コードが居ない)。v2.77 が事実上の最終解

kendallgoto/ilo4_unlock のビルドはどれくらい大変?

Docker さえあれば README どおりで 1 コマンド。HPE 公式 v2.77 ファームは build.sh が自動 DL するので、入力ファイルの準備も不要。Docker のブリッジネットワークだと apt 更新で DNS 失敗する ので --network=host を必ず付けること。

iLO のフラッシュ手順で必須の物理作業は?

最低でも以下:

  1. マザーボード上の DIP スイッチ S1 を ON (iLO Security Override)
  2. AC ケーブルを完全に抜く(シャットダウンだけでは不十分、iLO は待機電源で生きている)
  3. AC を戻して起動 → Linux からフラッシュ → 完了後にもう一度 AC 断 → DIP S1 OFF

物理アクセスできない遠隔サーバには不可能な手順なので、最初から自宅機 / 物理アクセス可能機限定の手段と思って良い。

Web UI からのアップロードはなぜダメ?

Web UI は HPE 公式署名の検証を通すため、パッチ済ファームを拒否する。flash_ilo4 --direct は低レベルで SPI Flash に直接書くので署名検証を回避する。Web UI 由来の安心感は無いが、書込手順自体は確立されているので失敗例は少ない。

DL360p / DL360 Gen9 / DL380 Gen9 でも同じ?

iLO4 (Gen8) と iLO5 (Gen9 以降) ではファーム構造もコマンド体系も全く別。本記事の手順 (および ilo4_unlock) がそのまま使えるのは iLO4 (= Gen8 系列) のみ。Gen9 以降の iLO5 は別途調査が必要

パッチファームのリスクは?

iLO4 は ASIC レベルで独立した管理プロセッサ (BMC) なので、書き換え失敗してもサーバ本体は普通に起動する。最悪ケースは iLO 管理機能が使えなくなるだけ。フラッシュ後の戻し (公式ファーム再書込) も flash_ilo4 --direct で同じ手順でできるので、「うまくいかなかったら戻す」運用は現実的。

ファン交換 (Noctua 化など) と比較してどっち?

比較軸iLO4 アンロック + PID 調整ファン物理交換
静音化レベル中〜強 (体感ほぼ無音まで可)
コストゼロ (ソフトのみ)1〜2 万円
文鎮化リスク低 (iLO 再書込で復旧可)中 (tach 信号偽装失敗で警告止まらず)
元に戻す難易度公式ファーム再書込のみ物理工程必要
必要技能Docker + SSH + 物理 DIP 操作電子工作 + 物理作業

まず PID 調整で試して、それでも気になるなら物理交換を追加、の二段戦略が無難。自分はパッチ + PID 調整だけで運用継続できている。

GPU (Tesla P4 等) を追加で挿したらどうなる?

iLO は標準で「HPE 認定外の PCIe カード」を温度センサー異常とみなしてファンを全開にすることがある。これに対しては fan g stopfan g start でファンコントローラを再初期化する手筋がコミュニティで知られている (GTX1080 等の非 HPE GPU 挿入時の暴走対策)。本格運用するなら GPU 挿入後に再キャリブレーションが必要。

制作プロセスについて

kendallgoto/ilo4_unlock のビルド手順整理、Docker DNS の --network=host 解決、PID 50 ボトルネック発見、fan コマンドの空応答仕様の特定、温度の経過観察など、調査と試行錯誤のサイクルには Anthropic の Claude Code を活用した。実機への書き込み・物理 DIP 操作・温度監視・体感判断は当然人間が担当している。

この記事をシェア