proxmoxVE9.11
ゲストos Oracle Linux10にRTX4080をパススルーする
環境
Intel Xeon E5 2696V3*2
DDR3 REG ECC
M/B:X99
Nvidia RTX4080
ホストOS: ProxmoxVE9.11
debian,KVNベースのハイパーバイザー
ゲストos: Oracle Linux10
RHELとバイナリ互換ありのRHEL互換os
使用するイメージ
OracleLinux-R10-U0-x86_64-dvd.iso
ISOダウンロード元
前提
BIOSレベル
IOMMU:Enabled
Intel VT-d/AMD-Vi:Enabled
Above 4G Decoding:Enabled
Resizable BAR:Disabled
Proxmoxホストでの設定に入る
proxmoxシェルで操作をする。
目的:IOMMU(仮想化支援機能)有効化とホストがGPUを掴まないように。
/etc/default/grubを開き編集-> "GRUB_CMDLINE_LINUX_DEFAULT="
#Intel_CPU
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb:off,vesafb:off initcall_blacklist=sysfb_init"
#IF:AMD intel_iommu=on -> amd_iommu=on
カーネルモジュールの追加
# /etc/modules
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
ホスト側NVIDIAドライバーのブラックリスト化
# /etc/modprobe.d/blacklist.conf
blacklist nouveau
blacklist nvidia
blacklist nvidiafb
下のコマンドの結果は環境によって変わる。
root@pve01:~# lspci -nn | grep -i nvidia
#VGA
02:00.0 VGA compatible controller [0300]: NVIDIA Corporation AD103 [GeForce RTX 4080] [10de:2704] (rev a1)
#Audio
02:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:22bb] (rev a1)
#xxxx:xxxxの部分をメモ
#ここでは[10de:2704と10de:22bbです
設定完了後電源を落とす。
update-grub
update-initramfs -u -k all
#NOTE
#私の環境ではZFSには触っていませんがZFS起動の場合:
#proxmox-boot-tool refresh#追加で実行
poweroff
#rebootより確実らしい。
確認する。目的:VfiO-PCi
root@pve01:~# cat /etc/default/grub | grep -i grub_cmdline_linux_default
#GRUB_CMDLINE_LINUX_DEFAULT="quiet"
#GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb:off,vesafb:off initcall_blacklist=sysfb_init"
root@pve01:~# lspci -nnk -s 02:00
02:00.0 VGA compatible controller [0300]: NVIDIA Corporation AD103 [GeForce RTX 4080] [10de:2704] (rev a1)
Subsystem: NVIDIA Corporation Device [10de:1795]
Kernel driver in use: vfio-pci
Kernel modules: nvidiafb, nouveau
02:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:22bb] (rev a1)
Subsystem: NVIDIA Corporation Device [10de:1795]
#Kernelのあとにnouveau や nvidia になっている場合、失敗している
#ブラックリストかVFIOへのバインドのコマンドを入力したか確認する
Kernel driver in use: vfio-pci
Kernel modules: snd_hda_intel
VM設定画面
OS
GuestOS:Linux 6.x-2.6 Kernel
System
Graphic card:VirtIO-GPU
Machine:q35
BIOS:OVMF(UEFI)
Pre-Enroll keysはチェックを外すのが吉
Qemu Agent:Enable
Disks
BUS/DeviceもVirtlO Blockにする
Discard:Enable
CPU
Type:host
Memory
Ballooning:Disabled
作成後
VMの「ハードウェア」設定で、PCIデバイス(RTX 4080)を追加
Raw Device: リストから(RTX 4080) を選択
All Functions: チェックを入れる
grubの画面でEキーを押す
linuxefi ... rd.live.check quiet と書かれている行の末尾に [半角スペース]+inst.textを追記
Ctrl + xで起動する
なぜこんなことをするのか
VMは「GUIでインストール画面を出そうとしてるがインストーラーがguiを出せずにエラーをだしてる。
テキストモードでインストールを続行する
RuntimeError: Gtk couldn't be initialized.
- graphical mode
- text mode
2を押す
Installationの画面になったら
5)を選択する。全問Cで続行
[!]が[x]になればいおけ
4)を選択.今回はGPUサーバー用途のため2 serverを選択
software選択画面
2,4,に[X]つける
c続行
NOTE
4ソフトウェア選択後に3)で[!]とでたりするが
その都度3)をC連打すれば治る。
#依存関係チェックの再走で一時的に状態が崩れて見えるだけらしい...
#詳しくはわからないが正常にインストールが完了したのでよしとする。
ssh
さすがにコンソールで手打ちはきついので、
クライアントからssh接続で操作する
gpuが認識されているか
user01@localhost:~$ lspci -nnk | grep -i nvidia -A 3
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation AD103 [GeForce RTX 4080] [10de:2704] (rev a1)
Subsystem: NVIDIA Corporation Device [10de:1795]
Kernel modules: nvidiafb
01:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:22bb] (rev a1)
Subsystem: NVIDIA Corporation Device [10de:1795]
Kernel driver in use: snd_hda_intel
Kernel modules: snd_hda_intel
05:01.0 PCI bridge [0604]: Red Hat, Inc. QEMU PCI-PCI bridge [1b36:0001]
ドライバーのインストール
sudo dnf install -y kernel-devel kernel-headers gcc make dkms
sudo dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel9/x86_64/cuda-rhel9.repo
sudo dnf install -y nvidia-driver nvidia-utils
sudo reboot
コンテナでGPUを使うための設定
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
#GPG署名のセキュリティポリシーでエラーになるため --nogpgcheckをつける
sudo dnf install -y nvidia-container-toolkit --nogpgcheck
DKMSでカーネルモジュールを強制ビルドする
sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm
sudo dnf makecache
#DKMSの最新版がないため。epel経由
sudo dnf install -y kernel-uek-devel-$(uname -r) gcc make dkms --nogpgcheck
#NVIDIAドライバーをDKMSで再構築
sudo dnf remove -y nvidia-driver
sudo dnf install -y nvidia-driver --nogpgcheck
sudo dkms autoinstall
ビルドしたドライバーの確認
#ドライバーのロード
user01@localhost:~$ find /lib/modules/$(uname -r) -name "nvidia.ko*"
/lib/modules/6.12.0-100.28.2.el10uek.x86_64/extra/nvidia.ko.xz
sudo modprobe nvidia
sudo modprobe nvidia-uvm
#ドライバーが認識されているか
user01@localhost:~$ lsmod | grep nvidia
nvidia_uvm 2514944 0
nvidia_drm 163840 0
nvidia_modeset 1929216 1 nvidia_drm
nvidia 17977344 2 nvidia_uvm,nvidia_modeset
video 81920 1 nvidia_modeset
drm_ttm_helper 16384 4 bochs,drm_vram_helper,nvidia_drm
#仕上げ
dnf provides */nvidia-smi
#NOTE:nvidia-smiがどこにもない
# -> y
sudo dnf reinstall -y nvidia-driver-cuda nvidia-driver-common nvidia-driver-libs --nogpgcheck
#sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml
#最後の一行にINFO[0000] Generated CDI spec with version 0.7.0 とでれればok
#nvidia-smiはあきらめる
#コンテナ内からGPUが認識されてCUDAを叩ければいいわけで...
user01@localhost:~$ nvidia-ctk cdi list
INFO[0000] Found 3 CDI devices
nvidia.com/gpu=0
nvidia.com/gpu=GPU-748f5346-2568-8e89-ead1-06789073396f
nvidia.com/gpu=all
#/dev/nvidia0がコンテナ内に見えていることを確認
user01@localhost:~$podman run --rm --device nvidia.com/gpu=all --security-opt=label=disable docker.io/nvidia/cuda:12.6.0-base-ubi9 ls -l /dev/nvidia0
crw-rw-rw-. 1 nobody nobody 195, 0 Jun 5 05:38 /dev/nvidia0
CUDA ライブラリがコンテナから正しくロードできるか確認
user01@localhost:~$ podman run --rm --device nvidia.com/gpu=all --security-opt=label=disable docker.io/nvidia/cuda:12.6.0-runtime-ubi9 nvidia-smi
Trying to pull docker.io/nvidia/cuda:12.6.0-runtime-ubi9...
Getting image source signatures
Copying blob d339273dfb7f skipped: already exists
Copying blob e2ed5631241b skipped: already exists
Copying blob 7cc3ecb669e0 skipped: already exists
Copying blob 49d0e9e0f4c3 skipped: already exists
Copying blob aba2f4670080 skipped: already exists
Copying blob e70571d6e499 done |
Copying blob 1ae92392313d done |
Copying blob 517c9b642bd1 done |
Copying blob cc296d75b612 skipped: already exists
Copying config 6f9a3c10e2 done |
Writing manifest to image destination
==========
== CUDA ==
==========
CUDA Version 12.6.0
Container image Copyright (c) 2016-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
This container image and its contents are governed by the NVIDIA Deep Learning Container License.
By pulling and using the container, you accept the terms and conditions of this license:
https://developer.nvidia.com/ngc/nvidia-deep-learning-container-license
A copy of this license is made available in this container at /NGC-DL-CONTAINER-LICENSE for your convenience.
WARNING: The NVIDIA Driver was not detected. GPU functionality will not be available.
Use the NVIDIA Container Toolkit to start this container with GPU support; see
https://docs.nvidia.com/datacenter/cloud-native/ .
/opt/nvidia/nvidia_entrypoint.sh: line 67: exec: nvidia-smi: not found
