PV: 回 / All:

【Linux/備忘録】PCI (Express) デバイスを論理的に取り外す (PCIeデバイス削除)

PCIeデバイスを物理的に取り外すのが面倒なときってありますよね。
特にGPUを取り外したいとき、物理的に外すのはめちゃくちゃ面倒ですよね。
また、ノートパソコンとかで取り外しができないときに重宝しそう。

なお環境によっては再認識に再起動が必要になるためご注意ください。
また、dGPUはこの方法を利用しても10Watt〜20Wattは食い続けるのでご注意ください。

GPUデバイスを特定する

~$ lspci
00:00.0 Host bridge: Intel Corporation 8th Gen Core Processor Host Bridge/DRAM Registers (rev 07)
00:01.0 PCI bridge: Intel Corporation 6th-10th Gen Core Processor PCIe Controller (x16) (rev 07)
00:02.0 VGA compatible controller: Intel Corporation CoffeeLake-H GT2 [UHD Graphics 630]
...(中略)
00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (7) I219-V (rev 10)
01:00.0 VGA compatible controller: NVIDIA Corporation TU117GLM [Quadro T1000 Mobile] (rev a1)
01:00.1 Audio device: NVIDIA Corporation Device 10fa (rev a1)
02:00.0 Non-Volatile memory controller: SK hynix PC601 NVMe Solid State Drive
...(中略)
52:00.0 Network controller: Intel Corporation Wi-Fi 6 AX200 (rev 1a)
53:00.0 SD Host controller: Genesys Logic, Inc GL9755 SD Host Controller

lspci は、接続されているPCI (Express)デバイスの列挙を行うコマンドです。
ここで該当するものを探しましょう。
grep を併用すると一気に便利になります。
私の環境では以下のとおりでした。

~$ lspci | grep -i nvidia
01:00.0 VGA compatible controller: NVIDIA Corporation TU117GLM [Quadro T1000 Mobile] (rev a1)
01:00.1 Audio device: NVIDIA Corporation Device 10fa (rev a1)

このページでは、PCIeホストブリッジが1つだけ(アドレス 0000)であることが前提の環境です。

PCIeを論理的に取り外す(remove)

ここからが本題です。
今回は0000:01:00.0であるとしますね。まず存在を確認しましょう。

~# ls -l /sys/bus/pci/devices | grep 01:00
(前略) 0000:01:00.0 -> ../../../devices/pci0000:00/0000:00:01.0/0000:01:00.0
(前略) 0000:01:00.1 -> ../../../devices/pci0000:00/0000:00:01.0/0000:01:00.1

存在を確認したら取り外します。

~# echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove
~# echo 1 > /sys/bus/pci/devices/0000:01:00.1/remove

これでデバイスの論理的取り外し(削除)が完了しました。
ちなみに、これを再認識するために再起動が必要になることがあります。
Proxmox民特に注意するように。

P.S.

英語圏ではremoveだから削除だろとChatGPTに苦情を言われた裏話があります。
が、私は「リンク解除」のほうがいいと思っています。
削除ってなんやねんって思う人です。直訳すんな(#^ω^)