web-dev-qa-db-fra.com

Vérifiez si VT-D/IOMMU a été activé dans le BIOS/UEFI

Pour vérifier si le processeur Intel VT-X ou AMD-V d'AMD est activé dans le BIOS/UEFI, j'utilise:

if systool -m kvm_AMD -v &> /dev/null || systool -m kvm_intel -v &> /dev/null ; then
    echo "AMD-V / VT-X is enabled in the BIOS/UEFI."
else
    echo "AMD-V / VT-X is not enabled in the BIOS/UEFI"
fi

Je n'ai pas pu trouver un moyen de vérifier si le VT-D d'Intel ou l'IOMMU d'AMD sont activés dans le BIOS/UEFI.

J'ai besoin d'un moyen de détecter s'il est activé ou non sans avoir défini les paramètres du noyau iommu (iommu=1, AMD_iommu=on, intel_iommu=on).

Une des idées que j’avais était d’utiliser rdmsr, mais je ne sais pas si cela fonctionnerait. Au lieu de systool, j'ai d'abord voulu utiliser Sudo rdmsr 0x3A, mais cela ne fonctionnait pas pour moi. Il rapporte toujours:

rdmsr: CPU 0 cannot read MSR 0x0000003a

rdmsr fait partie de msr-tools btw. Et pour être utilisé, le module msr kenel doit être chargé (Sudo modprobe msr) en premier.

Sudo rdmsr 0x3A aurait dû renvoyer 3 ou 5 pour indiquer que VT-X/AMD-V est activé ...

2
Forivin

Si VT-d est activé, Linux configurera DMA Remappage au démarrage. Le moyen le plus simple de trouver ceci consiste à rechercher dans dmesg les entrées DMAR. Si vous ne voyez pas d'erreur, alors VT-d est activé.

Par exemple:

[root@localhost ~]# dmesg | grep DMAR
[    0.000000] ACPI: DMAR 0x00000000BBECB000 0000A8 (v01 LENOVO TP-R0D   00000930 PTEC 00000002)
[    0.001000] DMAR: Host address width 39
[    0.001000] DMAR: DRHD base: 0x000000fed90000 flags: 0x0
[    0.001000] DMAR: dmar0: reg_base_addr fed90000 ver 1:0 cap 1c0000c40660462 ecap 19e2ff0505e
[    0.001000] DMAR: DRHD base: 0x000000fed91000 flags: 0x1
[    0.001000] DMAR: dmar1: reg_base_addr fed91000 ver 1:0 cap d2008c40660462 ecap f050da
[    0.001000] DMAR: RMRR base: 0x000000bbdd8000 end: 0x000000bbdf7fff
[    0.001000] DMAR: RMRR base: 0x000000bd000000 end: 0x000000bf7fffff
[    0.001000] DMAR-IR: IOAPIC id 2 under DRHD base  0xfed91000 IOMMU 1
[    0.001000] DMAR-IR: HPET id 0 under DRHD base 0xfed91000
[    0.001000] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[    0.002000] DMAR-IR: Enabled IRQ remapping in x2apic mode

Un autre exemple avec x2apic opt out:

[root@localhost ~]# dmesg | grep DMAR
[    0.000000] ACPI: DMAR 0000000079a20300 000C4 (v01 SUPERM SMCI--MB 00000001 INTL 20091013)
[    0.106389] DMAR: Host address width 46
[    0.106392] DMAR: DRHD base: 0x000000fbffc000 flags: 0x1
[    0.106400] DMAR: dmar0: reg_base_addr fbffc000 ver 1:0 cap 8d2078c106f0466 ecap f020de
[    0.106402] DMAR: RMRR base: 0x0000007bb24000 end: 0x0000007bb32fff
[    0.106404] DMAR: ATSR flags: 0x0
[    0.106407] DMAR: RHSA base: 0x000000fbffc000 proximity domain: 0x0
[    0.106409] DMAR-IR: IOAPIC id 8 under DRHD base  0xfbffc000 IOMMU 0
[    0.106411] DMAR-IR: HPET id 0 under DRHD base 0xfbffc000
[    0.106413] DMAR-IR: x2apic is disabled because BIOS sets x2apic opt out bit.
[    0.106414] DMAR-IR: Use 'intremap=no_x2apic_optout' to override the BIOS setting.
[    0.106591] DMAR-IR: Enabled IRQ remapping in xapic mode

Quoi qu'il en soit, vous recherchez la dernière ligne, DMAR-IR: Enabled IRQ remapping in <whichever> mode.

Sur un système avec VT-d désactivé, vous verrez soit un message d'erreur, soit rien du tout.

[root@localhost ~]# dmesg | grep DMAR
[root@localhost ~]#
3
Michael Hampton

S'appuyant sur la réponse de Jo-Erlend Schinstad:

Installer cpu-checker

$ Sudo apt-get update
$ Sudo apt-get install cpu-checker

Puis vérifier:

$ kvm-ok

Si le processeur est activé, vous devriez voir quelque chose comme:

INFO: /dev/kvm exists
KVM acceleration can be used

Sinon, vous pourriez voir quelque chose comme:

INFO: /dev/kvm does not exist
HINT:   Sudo modprobe kvm_intel
INFO: Your CPU supports KVM extensions
INFO: KVM (vmx) is disabled by your BIOS
HINT: Enter your BIOS setup and enable Virtualization Technology (VT),
      and then hard poweroff/poweron your system
KVM acceleration can NOT be used
1
Ehsan Tadayon

Je viens de trouver une autre méthode qui semble fonctionner même si les paramètres du noyau iommu n'ont pas été définis:

if compgen -G "/sys/kernel/iommu_groups/*/devices/*" > /dev/null; then
    echo "AMD's IOMMU / Intel's VT-D is enabled in the BIOS/UEFI."
else
    echo "AMD's IOMMU / Intel's VT-D is not enabled in the BIOS/UEFI"
fi
0
Forivin