Claude Media
Claude CodeがProxmox VMで固まる — Ubuntuで出力ゼロになるときの切り分け

Claude CodeがProxmox VMで固まる — Ubuntuで出力ゼロになるときの切り分け

ProxmoxのUbuntu VMで--versionだけ通り、claudeが無出力で固まる報告があります。CPUタイプをhostにして直った例と、手元で試せる切り分け手順をまとめます。

ProxmoxのUbuntu VMでClaude Codeを動かすと、claude --versionは返るのに、claudeもclaude -pもclaude setup-tokenも、何も表示しないまま固まることがあります。エラーもスピナーも出ません。GitHubのissue #95691に同じ症状の報告が2件あり、2件目はVMのCPUタイプをkvm64からhostに変えて解消したと書いています。

この記事では、報告された構成、CPUタイプを変える手順、手元で試せる切り分けを順に説明します。原因はスレッド上で特定されていないので、分かっていることと分かっていないことを分けて書きます。

症状: --versionだけが通り、あとは無出力

報告されている症状は次のとおりです。

  • claude --versionとclaude --helpは即座に正しく返る(1件目の報告では約16ms)
  • 対話モードのclaudeは、画面に何も描かれないまま止まる
  • claude setup-tokenは、ログインURLを出さずに止まる
  • claude -p "<prompt>"は、stdinを/dev/nullから読ませても、CLAUDE_CODE_OAUTH_TOKENを設定済みでも止まる

最後の2点が重要です。非対話モードでもトークンを渡しても止まるので、ログイン画面や端末描画の問題とは切り分けられます。

止まる位置もstraceで絞られています。1件目の報告では、プロセスはNode/V8の初期化を終え、PKCE用と見られる48バイトと32バイトのgetrandom()を呼んだあと、標準出力へのwriteもconnect()・socket()・getaddrinfo()も一度も現れません。残りはV8とlibuvのワーカースレッドがfutexで待つだけでした。つまりネットワークに出る前、アプリケーションコードの内側で止まっています。

報告された2つの構成

項目1件目の報告2件目の報告
仮想化1件目の報告Proxmox(KVM)上のUbuntu VM2件目の報告Proxmox VE 9.1.1上のUbuntu 24.04.5
カーネル1件目の報告5.15.0-191-generic2件目の報告6.8.0-142-generic
Node.js1件目の報告20.20.2と22.23.22件目の報告22.23.3
Claude Code1件目の報告2.1.2782件目の報告2.1.281
CPUタイプ1件目の報告記載なし2件目の報告kvm64(Proxmoxの既定)、1ソケット4コア
結果1件目の報告未解決2件目の報告CPUタイプをhostに変えて解消

1件目はCPUタイプを書いていません。そのため、1件目の環境でもkvm64だったのかは分かりません。2件目の解消例が1件目に当てはまるとは、スレッドからは言えません。

1件目は「このVMでは最初から動いたことがない」と書いており、バージョンを上げ下げする回避は報告されていません。

解消した例: CPUタイプをhostに変える

2件目の報告者は、Proxmoxの画面でVMのハードウェア設定を開き、プロセッサのタイプをhostに変えました。操作の道筋は次のとおりです。

手順

CPUタイプを変える手順(2件目の報告に沿った形)

  1. 1

    VMを完全に停止する

    ゲストOSの再起動ではなく、VMを停止します。報告者は、CPUモデルの変更はVMを一度完全に停止してから起動し直したときにだけ反映されると書いています。

  2. 2

    タイプを host にする

    Proxmoxの画面で、VMの「Hardware」から「Processors」を開いて「Edit」を押し、「Type」をhostにします。

  3. 3

    VMを起動して試す

    起動後にclaudeを実行します。報告者の環境では、ログインURLがすぐ出るようになりました。

注意点が1つあります。2件目の報告者自身が「根本的な修正ではなく、ホストのCPUを使っただけ」と書いていることです。Claude Code側で直ったわけではありません。

CPUタイプの違いと、hostにする代償

Proxmox VEのドキュメントでは、バックエンドの既定がkvm64、新規VMを作るときの画面の既定がx86-64-v2-AESです。kvm64はx86-64-v1の水準で、Pentium 4相当のCPUフラグまでしか有効にしません。

x86-64-v2はsse4.1やsse4.2などを足した水準で、x86-64-v2-AESはそこにaesを足したものです。avxが加わるのはx86-64-v3からで、画面の既定であるx86-64-v2-AESにも含まれません。hostにすると、VMはホストと同じCPUフラグを持ちます。

hostには代償があります。ライブマイグレーションでCPUの種類やマイクロコードが違うホストへ移すと、渡されていたCPUフラグが移動先に無く、QEMUのプロセスが止まることがあります。同ドキュメントは、ライブマイグレーションを使わないか、全ノードのCPUとマイクロコードが同じクラスターならhostでよいとしています。クラスターのCPUがIntelだけ、またはAMDだけなら、クラスター内で最も古い世代のモデルを選ぶ案内です。

hostにせずx86-64-v3を選ぶ手もありますが、Proxmoxの資料にあるのはCPUフラグの定義までで、それでClaude Codeが動くという報告はスレッドにありません。

公式のAVXの案内は別症状だが、同じ確認で足りる

Claude Codeの公式トラブルシューティングには、Illegal instructionの節があります。ネイティブバイナリがCPUの命令セットに対応していないときの症状で、原因の1つに「AVXが無いCPU」が挙げられています。2013年より前のIntelやAMDのCPUと、ハイパーバイザーがAVXをゲストに渡さない仮想マシンが対象です。

今回の報告はIllegal instructionではなく無出力で止まる症状なので、同じ原因とは言えません。ただし、確認は1行で済みます。

grep -m1 -ow avx /proc/cpuinfo
grep -m1 "model name" /proc/cpuinfo

2行目はCPUのモデル名で、issueに報告するときにも求められる情報です。1行目でAVXが見えているのに固まるなら、CPUタイプ以外の要因も疑う余地があります。

Proxmox VEのドキュメントの定義どおりなら、kvm64とx86-64-v2-AESにはAVXがありません。ただし、Claude Codeのネイティブバイナリが無出力で止まる原因がAVXの有無だと示した資料はありません。実際にどう見えているかは、上のコマンドで自分のVMを直接確かめられます。

手元で試せる切り分け

まず、上から順に確かめる流れです。

切り分け

無出力で固まるときの確かめ方

  1. Qgrep -m1 -ow avx /proc/cpuinfo は何か返しますか?
    答えが空だった

    AVXがゲストに見えていません。CPUタイプをhostにして違いが出るか試します。

    答えがはい
  2. Qldd の結果に not found は出ませんか?
    答えが出た

    足りない共有ライブラリを入れます。

    答えがはい
  3. Q固まったプロセスに ss -tnp で接続が無く、pstree -p で子プロセスも無いですか?
    答えがあった

    接続や子プロセスがあるなら、この記事の症状とは別です。

    答えがはい

報告と同じ状態です

straceでwrite・connect・socketが現れず、futexの待ちだけが続くなら、issue #95691の症状と一致します。CPUタイプの変更を試し、結果をissueに追記する流れになります。

各コマンドの中身は、以降の節で説明します。報告者が「すでに除外した」と書いた項目も多いので、同じ道をたどり直さずに済みます。

除外された要因試した内容
ネットワーク試した内容curl -vでapi.anthropic.comなどに即座に接続できた
IPv6試した内容NODE_OPTIONS="--dns-result-order=ipv4first"でも変わらず
Nodeのバージョン試した内容20.20.2と22.23.2で同じ
端末描画試した内容TERM=xterm-256color、幅261桁、script -cの中でも同じ
stdin試した内容/dev/nullから読ませても同じ
設定の残り試した内容新規作成したLinuxユーザーでも同じ
CPUの混雑試した内容vmstatでsteal 0%、アイドル約99%
乱数試した内容entropy_availは256

このうちNodeのバージョンは、公式のnpmインストール手順を読むと意味が変わります。npmパッケージはNodeを実行時に使わず、ネイティブバイナリを取得して配置するだけだと書かれています。つまりNodeを替えて試しても、固まるバイナリは同じです。インストール方法を替える場合も、公式は「同じネイティブバイナリを取得するので、これらの原因は解消しない」としています。詳しくはClaude Codeのインストールガイドにまとめています。

2件目の報告者が行った確認も参考になります。固まったプロセスに対して、次の3つを見ています。

ss -tnp          # プロセスのTCP接続の有無
pstree -p <pid>  # 子プロセスの有無
strace -p <pid> -f   # システムコールの流れ

ssでTCP接続が1本も無く、pstreeで子プロセスも無ければ、ブラウザを開こうとして詰まっているわけでも、通信待ちでもありません。

公式にも、--versionは返るのに起動時に止まる場合の確認が1つあります。

ls -la "$(command -v claude)"
ldd "$(command -v claude)" | grep "not found"
claude --version

今回の報告では、この確認の結果は書かれていません。

止まったプロセスの扱い

2件目の報告者は、Ctrl+Cで必ず終わるとは限らなかったと書いています。効くこともあれば、別のセッションからpkill -9 -f claudeで落とす必要がありました。1件目はCtrl+Cで終了できています。

端末が固まったままになる別の事情もあります。出力が詰まって端末が凍る場合は、CLAUDE_CODE_NONBLOCKING_STDOUTの記事が扱う症状で、画面に何か出ていた点が異なります。今回は最初から何も出ていません。

LXCに替えるという選択肢

ProxmoxのLXCコンテナはホストのカーネルを共有し、CPUをエミュレートしません。VMのCPUタイプの影響を受けないので、VMで固まる場合の代替になる可能性はあります。ただし、issueのスレッドにはLXCで試した報告がありません。LXCでの構築手順はProxmoxのLXCコンテナで動かす手順にあり、VMの話はそちらの範囲外です。

また、ログイン自体の仕組みを確かめたい場合は、Claude Codeのログイン方法が役立ちます。ヘッドレス環境ではclaude setup-tokenで長期トークンを作る方法がありますが、今回の報告ではそのコマンド自体が固まっているため、別のマシンでトークンを作って持ち込む形になります。

報告するときに添える情報

このissueには、原因の特定も修正バージョンの記載もありません。同じ症状に当たったら、次の情報を添えると他の人が再現しやすくなります。

  • Claude Codeのバージョン(claude --version)
  • Proxmoxのバージョンと、VMのCPUタイプ・ソケット数・コア数
  • grep -m1 "model name" /proc/cpuinfoの出力
  • grep -m1 -ow avx /proc/cpuinfoが空かどうか
  • straceでwriteやconnectが現れるか

まとめ

--versionが通るのに無出力で固まるなら、Claude Codeの設定やネットワークより先に、VMが見せているCPUを疑う価値があります。報告されている唯一の解消例は、CPUタイプをkvm64からhostにしてVMを完全に停止してから起動し直す方法です。ただし、これは回避策であり、原因は特定されていません。

先にgrep -m1 -ow avx /proc/cpuinfoを実行し、AVXが見えているかを確かめてください。見えていないなら、CPUタイプの変更を試す価値が高いと言えます。見えているのに固まるなら、straceの結果を添えてissueに追記するのが、次の一歩になります。

この記事を共有:XはてブLinkedIn