LSI/Avago/Broadcom 系 SAS/MegaRAID コントローラに対する curses ベースの TUI フロントエンド。MegaCli64 / storcli64 / sas3ircu (sas2ircu) の 3 バックエンドを切り替え可能で、9261/9266 などレガシー MegaRAID、9300-8i/9460/9560 など最近の RAID/HBA、そして 9211/9207 等の旧 IT/IR モード HBA まで同じ UI で扱える。物理ドライブ・論理ドライブ・コントローラ・BBU・エンクロージャの状態を 4 タブで一覧でき、書き込み系操作 (ホットスペア指定、Locate LED、リビルド開始/中止、Patrol Read、構成削除など) も確認ダイアログ越しに発行できる。
┌─ MegaTUI · adapter 0 ── F1 Physical Drives F2 Logical Drives F3 Adapter+BBU F4 Enclosures ──┐
│ Slot Enc DevId Size State MediaErr OtherErr Temp Type Inquiry │
│ 0 252 0 1.818 TB ● Online, Spun Up 0 0 38C HDD HGST HUS… │
│ 1 252 1 1.818 TB ● Online, Spun Up 0 0 39C HDD HGST HUS… │
│ 2 252 2 1.818 TB ◐ Rebuild 12 4 42C HDD HGST HUS… │
│ 3 252 3 1.818 TB ✗ Failed 47 23 -- HDD HGST HUS… │
│ 4 252 4 1.818 TB ★ Hotspare 0 0 32C HDD HGST HUS… │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
↑↓ select Tab/Shift-Tab tab F1-F4 jump Enter detail a action r refresh q quit
- 4 タブ PD / LD / Adapter+BBU / Enclosure を
F1〜F4で切替 - 状態の色分け Online=緑、Rebuild=黄、Failed=赤、Hotspare=シアン、温度しきい値で警告
- 詳細モーダル
Enterでカーソル行の全フィールドをポップアップ表示 - 3 バックエンド MegaCli64 (テキスト) / storcli64 (JSON) / sas3ircu (sas2ircu) (テキスト) — 自動検出、
--backendで明示指定可 - 40 アクション (PD 15 / LD 14 / Adapter 11) を 4 段階の危険度でラベリング、各バックエンドが同一の論理アクションを別 CLI 構文に翻訳。バックエンドが実装してない操作はメニューから自動で隠れる (ircu は LOCATE / HOTSPARE / CREATE / STATUS / DELETE のみ)
- i18n 英語 (default) と日本語に対応。
--lang en|jaまたはLANG/LC_MESSAGES環境変数で切替safe… 状態問い合わせ系write… 設定変更 (キャッシュポリシー、ホットスペア指定、Patrol Read 起動 など)destructive… リビルド中止、PD オフラインなど冗長性が落ちる操作catastrophic…PD Clear、LD Delete、CfgClrなど破壊操作。正確な確認語句のタイプ入力を強制
- コマンドプレビュー 実行直前に組み立てた MegaCli64 引数をフル表示してから確認
- 監査ログ すべての書き込み操作を
~/.local/share/megatui/audit.logに追記 - dry-run モード
MEGATUI_FIXTURES=DIRまたは--fixtures DIRで MegaCli を呼ばずに UI 検証可 - 依存ゼロ Python 標準ライブラリ (
curses) のみ
- Linux (curses 動作環境)
- Python 3.10 以降
- 次のいずれかの CLI:
/opt/MegaRAID/MegaCli/MegaCli64(LSI 純正 MegaCli — レガシー MegaRAID 用)/opt/MegaRAID/storcli/storcli64(Broadcom storcli — 9300 系以降の SAS HBA / 新しめの MegaRAID 用)sas3ircuまたはsas2ircu(IT/IR モード HBA — 9300/9305/9311 系 = sas3ircu、9201/9207/9211/9217 系 = sas2ircu。PATH 上または/usr/sbin/、/opt/sas3ircu/等を自動検索)
sudo -nでバックエンドを呼べる権限 (パスワード無し)、または--no-sudo指定可能な環境
git clone <this-repo> megatui
cd megatui
# 依存パッケージは標準ライブラリのみ。インストール作業は不要。
./megatui.shmegatui.sh は python3 -m megatui を呼ぶラッパ。任意の場所からシンボリックリンクを張ってもよい:
sudo ln -s "$(pwd)/megatui.sh" /usr/local/bin/megatui# 通常 (バックエンド自動検出 — 両方あれば storcli を優先)
./megatui.sh
# バックエンド明示指定
./megatui.sh --backend storcli
./megatui.sh --backend megacli
./megatui.sh --backend ircu # sas3ircu / sas2ircu
# インストール確認
./megatui.sh --list-backends
# sudo なし (root で起動、または passwordless 不可な環境)
./megatui.sh --no-sudo
# dry-run / オフライン検証 (実機なしでも UI を試せる、fixtures の中身を見て backend を選ぶ)
./megatui.sh --fixtures fixtures # MegaCli テキスト fixtures
./megatui.sh --fixtures fixtures/storcli # storcli JSON fixtures
./megatui.sh --fixtures fixtures/ircu # sas3ircu テキスト fixtures
# 言語切替 (env LANG=ja_JP.UTF-8 でも自動)
./megatui.sh --lang ja
./megatui.sh --lang en| キー | 動作 |
|---|---|
F1〜F4 / 1〜4 |
タブ切替 (PD / LD / Adapter+BBU / Enclosure) |
Tab / Shift-Tab |
次/前タブ |
↑ ↓ / j k |
カーソル移動 |
Home / End |
先頭・末尾 |
PgUp / PgDn |
10 行ジャンプ |
Enter |
選択行の詳細モーダルを開く |
a |
選択対象に対するアクションメニュー |
r |
再取得 (PDList / LDInfo / AdpAllInfo / EncInfo / BBU を順に発行) |
q / Esc |
モーダル閉じる / 終了 |
| ラベル | 意味 | 確認方式 |
|---|---|---|
safe |
データ損失なし。Locate LED, ShowProg 等 | Y / Enter |
write |
状態変更 (キャッシュポリシー、HSP 指定、Patrol Read 開始 等) | Y / Enter |
DANGER |
冗長性が落ちる、I/O が中断する (PDOffline, Mark Missing, Init 開始, リビルド中止) | Y / Enter |
DESTROY |
データ消失または構成破壊 (PD Clear, LD Delete, CfgClr) | 指定キーワードを正確タイプ |
破壊操作の確認語句:
| アクション | 入力すべき語句 |
|---|---|
PD Clear (-PDClear -Start) |
WIPE |
LD Delete (-CfgLdDel -Lx) |
DELETE |
Delete ALL LDs (-CfgLdDel -LALL) |
DELETE-ALL |
Clear Config (-CfgClr) |
CLEAR-CONFIG |
書き込み系の試行はすべて 1 行 / 操作で追記される。tab 区切り。
2026-05-08T17:28:35+0900 DRYRUN:locate_on rc=0 /opt/MegaRAID/MegaCli/MegaCli64 -PdLocate -start -PhysDrv [0:0] -a0 -NoLog target=PD slot=- enc=- dev=0 state=-
2026-05-08T17:30:12+0900 hsp_set rc=0 sudo -n /opt/MegaRAID/MegaCli/MegaCli64 -PDHSP -Set -PhysDrv [252:4] -a0 -NoLog target=PD slot=4 ... | Adapter 0: Set Global Hotspare Succeeded.
- 場所:
${XDG_DATA_HOME:-~/.local/share}/megatui/audit.log - 上書き:
MEGATUI_AUDIT_LOG=/path/to/fileで任意指定 - フィクスチャモードのアクションは
DRYRUN:プリフィクス付きで記録
megatui/
├── megatui.sh # ./megatui.sh ランチャー
├── megatui/
│ ├── __main__.py # CLI エントリポイント (--backend / --fixtures)
│ ├── runner.py # 汎用サブプロセスラッパ (sudo / fixture replay)
│ ├── parsers.py # MegaCli テキスト出力パーサ
│ ├── actions.py # アクションメタデータ + 適用条件 (state predicates)
│ ├── audit.py # 監査ログ追記
│ ├── i18n.py # 言語ロケール対応 (en / ja, --lang フラグ + env 自動判定)
│ ├── tui.py # curses メインアプリ (App / 描画 / モーダル)
│ └── backends/
│ ├── base.py # Backend ABC
│ ├── megacli.py # MegaCli64 backend (テキスト → dataclass)
│ ├── storcli.py # storcli64 backend (JSON → dataclass + 引数翻訳)
│ └── ircu.py # sas3ircu / sas2ircu backend (テキスト → dataclass)
├── fixtures/
│ ├── *.txt # MegaCli64 サンプル
│ ├── storcli/*.json # storcli64 サンプル
│ └── ircu/*.txt # sas3ircu サンプル
└── tests/
├── test_parsers.py # MegaCli テキスト + state-based action gating
├── test_storcli.py # storcli JSON + 引数翻訳 + fixture replay
├── test_ircu.py # sas3ircu/2ircu テキスト + 引数翻訳 + fixture replay
└── test_i18n.py # 翻訳テーブル + 環境変数自動判定
設計メモ:
- パーサは「未知のキーは
rawdict にそのまま落とす」方針。アクセサ (pd.state,ld.size) は便利関数。詳細モーダルはrawをそのまま全表示するので、ファームウェア更新で新フィールドが増えても情報は失われない。 - PD ヘッダ行は
Enclosure Device ID:を境界とする (HDD)。テープのようにDevice Id:しか持たない疎なエントリも切り分けられるよう分岐済み。 - BBU は同名キー (
Voltage,Temperature) が外側ブロックとファーム内部ブロックの両方に出現するため、先勝ち (setdefault) で値を確定し、画面の見出し用には外側のものを使う。
fixtures/ には以下が同梱:
| ファイル | 内容 |
|---|---|
pdlist.txt |
実機 (LSI 9261-8i + テープ 2 台) の PDList |
ldinfo.txt |
同上 — VD なし |
adpinfo.txt |
同上 — AdpAllInfo |
encinfo.txt |
同上 — Enclosure (SGPIO) |
bbu.txt |
同上 — BBU 不在 |
pdlist_hdd.txt |
合成: 5 台 HDD (Online x2, Rebuild, Failed, Hotspare) |
ldinfo_raid5.txt |
合成: RAID5 + RAID1 Degraded |
bbu_present.txt |
合成: BBU 正常 (Optimal, 100%) |
回帰テスト:
python3 tests/test_parsers.py実機がない環境でも UI を触れる:
./megatui.sh --fixtures fixtures実機の出力が現状のパーサで欠落するフィールドを見つけたら:
MegaCli64 -PDList -aALL -NoLog > my.txtなどで生出力を取得fixtures/に追加tests/test_parsers.pyにケースを足すparsers.pyを更新
- MegaCli64 の 読み取り系コマンド (PDList 等) は数百ミリ秒〜数秒 かかる。リフレッシュは同期実行のため、その間 UI はブロックする。
- LD の 新規作成 (
-CfgLdAdd) は 単発 RAID0 のみ TUI から発行可 (PD タブでUnconfigured(good)ドライブを選択 →a→Create single-disk RAID0 VD)。RAID1/5/6 など複数ドライブのアレイ作成は MegaCli の引数仕様が複雑なため意図的に省略。コマンドラインからMegaCli64 -CfgLdAdd -r1 '[E:S,E:S]' ...を直接使うこと。なお 1 本 → RAID1 化したい場合は、単発 RAID0 作成後にMegaCli64 -LDRecon -Start -r1 -Add -PhysDrv '[E:S]' -L<N> -a0(RAID Level Migration) で 2 本目を追加できる。 storcli64ではなく MegaCli64 専用。新しめのコントローラ (12Gb 以降) では storcli を使うべき。
MIT License — LICENSE を参照。