gpu unlock エラー -16:ドライバーが先にカードを掴んだ
モジュールは動き、デバイスを要求し、すでに取られていると返されました。これが gpu_unlock unlock failed -16 の意味です。ハードウェアではなく、タイミングの問題です。
ログに出る gpu unlock エラー -16 の形
3 行がこの順で出ます。よく引用されるのは 3 行目です。
NVRM: GPU 0000:01:00.0: RmInitAdapter failed!
NVRM: GPU 0000:01:00.0: rm_init_adapter failed, device minor number 0
nvidia: probe of 0000:01:00.0 failed with error -16-16 は EBUSY です。gpu_unlock unlock failed -16 は、モジュールはあったのに、デバイスの取り合いに負けたという意味です。カーネルはカードが壊れているとも未対応だとも言っていません。デバイスにはすでに持ち主がいる、と言っています。実際の持ち主は nvidia です。上の並びは、負けたあとにドライバー自身のプローブが失敗した記録です。 [issue #11]
0
このログに出るファームウェアの行
プローブはファームウェアの段階まで届いていません。だから診断を絞れます。
この -16 は診断の手がかりになります。ほかに何が問題であっても、ファームウェアの段階までは進んでいません。-16 を返すカードは電気的に正常で、システムからはきちんと見えています。
gpu unlock の取り合いを順番に見る
コールドブートでは 3 者が GPU を掴む機会を得ます。勝つのは最初の 1 つだけです。
gpu_unlock が入っていれば勝ち
initramfs が最初に動く
起動時に読み込まれる小さなファイルシステムです。ここに書かれたものは、起動直後のユーザー空間が読み込みます。ルートファイルシステムをマウントする前、通常のサービス層ができる前です。既定ではこれが勝つ
次に udev が動く
見えているデバイスを順に見て、ドライバーと照合し、合うものを読み込みます。nvidia はプローブ時にバインドするので、udev が差し出した瞬間にカードを取ります。手遅れ
残りをカーネルがプローブする
本当のルートが立ち上がったあとです。この時点で手で読み込んだ gpu_unlock は、EBUSY しか返せません。
インストール時に失敗が見えないのも同じ理由です。パッケージは入り、モジュールはビルドされ、ファームウェアも生成されます。どの手順も成功と報告します。間違いが出るのは次の起動時、カーネルログの 1 行です。
gpu unlock の原因 3 つ、出てくる順に
- 出てくる順の原因と、それぞれ何を変えるべきか。
モジュールが initramfs に入っていない
- 見える症状
- 動いているカーネル向けにだけビルドされた
- 対処
- drop-in を置き、イメージを再構築し、コールドブートする
drop-in を間違ったジェネレーターの場所に置いた
- 見える症状
- 起動時にエラーなし。lsinitramfs でも見つからない
- 対処
- 自分のジェネレーターが読む場所にファイルを置く
起動後に手で読み込んだ
- 見える症状
- modprobe gpu_unlock は成功したように見えた
- 対処
- シェルのセッションから外し、もっと早く読み込む
2 行目が、新規インストールで最もよくある形です。dracut のマシンに initramfs-tools 用のファイルを置いても、何も起きません。しかも無言で何も起きません。この形の gpu_unlock unlock failed -16 は、コールドブートでは消えません。ファイルが間違った順番ではなく、間違ったディレクトリにあるからです。Ubuntu 25.10 と 26.04 は dracut で起動します。一方、gpu_unlock の Debian パッケージは initramfs-tools のパスに書き込みます。 issue #54 に記録があります。
dracut がイメージを作るなら、initramfs-tools のパスを真似せず、dracut の initramfs インストール手順 に従ってください。
3 行目は再構築が要りません。シェルで modprobe gpu_unlock を打つのは、定義上もう遅いです。ドライバーがデバイスを持っており、モジュールには取り返せません。
gpu unlock エラーを原因別に直す
最初の 2 つは対処の形が同じです。drop-in をジェネレーターが読む場所に置き、イメージを再構築し、コールドブートします。gpu unlock の対応表 にないカードには、どちらの対処も効きません。載っていないカードは取り合いにならず、読み飛ばされるからです。
- Arch、CachyOS、EndeavourOS:
/etc/mkinitcpio.conf.d/ - Debian、Ubuntu 25.04 まで:
/usr/share/initramfs-tools/modules.d/ - Fedora、RHEL、Ubuntu 25.10 以降:
/usr/lib/dracut/dracut.conf.d/
再構築の前に、これから起動するイメージの中身を確かめてください。
lsinitramfs /boot/initrd.img-$(uname -r) | grep gpu_unlock何も出なければ、モジュールはイメージに入っていません。順番の話は意味がありません。何か出れば、モジュールは入っているのに負けています。そこでは 3 つ目の対処になります。
モジュールがあるのに遅いときは、issue #171 の init-top スクリプトを使います。最も早いユーザー空間で動く小さなフックで、udev が GPU のプローブを始める前に gpu_unlock を読み込みます。順番を決めるのは、スクリプトが initramfs のどこにあるかです。modprobe のオプションではありません。
softdep nvidia pre: は答えに見えますが、答えではありません。kmod が有効にするのは、ツリー内で最初の softdep nvidia 行だけです。多くのデスクトップでは、その行は nvidia-utils のものです。
Ubuntu 24.04 では、ここに至る道がさらに 2 つあります。
- パッケージの drop-in を使わず、
/etc/initramfs-tools/modulesを手で編集している場合です。initramfs-toolsはそのファイルとmodules.dの両方を読みます。順番を自分で決めるなら、gpu_unlockをnvidiaより前に自分で書く必要があります。 - 複数のカーネルがあるマシンで、いま起動していないカーネル向けにイメージを作り直した場合です。セッションの
uname -rと、実際に作り直したイメージが一致している必要があります。合っていなければ、誰も読まないファイルを直したことになります。
gpu unlock が今度は読み込まれたか確かめる
2 つのコマンドが、gpu_unlock unlock failed -16 について別々の問いに答えます。モジュールが動いたか、そのあとドライバーがバインドしたかです。
journalctl -k -b | grep gpu_unlock
lspci -nnk -s 0000:01:00.0journalctl
モジュールは動いたか、どこまで進んだか
正常な起動では gpu_unlock: unlocked と出て、そのあとに claim、layout、dma、gfw、fwsec、publish、pass、host、flr、handoff ret=0 と続きます。どこで止まったかが診断になります。lspci
そのあとドライバーはバインドしたか
lspci -nnk で同じアドレスに Kernel driver in use: nvidia と出れば成功です。デバイスが思った場所にあることも同時に確かめられます。
ログを読むときの注意が 1 つあります。アンロック済みでも、nvidia-smi の SM クロックが 210 MHz 付近で固まったままに見えることがあります。その間もベンチマークはフルスピードで動きます。これはテレメトリーのアーティファクトで、新しい gpu_unlock unlock failed -16 の事例ではありません。
これも issue #258 の内容です。 [issue #258]
gpu unlock がまだ -16 を返すとき
カーネルコマンドラインに gpu_unlock.targets が本当にあるか確かめる
モジュールを入れただけでは有効になりません。対象外のモジュールは読み込まれても、やることが見つからず静かに終了します。コードは分けて考える(対処がまったく違う)
-2 はイメージにファームウェアがないという意味です。モジュールは入ったのに、ファームウェア本体が入っていません。-110 はプローブがタイムアウトしたという意味です。多くはコールドブートでないことが原因で、電源を切るまでカードが使えないことがあります。3 つとも当てはまらなければ、次は Issue トラッカーです
上にリンクした 2 件の報告は、どちらもモジュールの動作ではなく、読み込みのタイミングが問題だった例です。
確認日 バージョン 2.0.0コミット 1fc6d62