Skip to content

Instantly share code, notes, and snippets.

@relvinhas
Created September 30, 2020 01:42
Show Gist options
  • Save relvinhas/80471ea965d292f9cb2ad02657adada4 to your computer and use it in GitHub Desktop.
Save relvinhas/80471ea965d292f9cb2ad02657adada4 to your computer and use it in GitHub Desktop.
Fedora Server - Virtualization Host - Nvidia passthrough
# Fedora 31 Server Edition - Virtualization Host
sudo dnf remove -y plymouth
# Upgrade packages
sudo dnf upgrade -y
# Install virtualization group
sudo dnf groupinstall "Virtualization" -y
sudo dnf install -y net-tools wget rsync git lsof
sudo dnf install -y \
kernel-tools \
virt-top \
atop \
iotop \
htop \
vim \
hdparm \
libguestfs-tools \
iperf \
tcpdump \
git \
lsof
# Allow non-root access to tcpdump[1]
sudo setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
# Add user to virtualization groups
sudo usermod -G libvirt -a $(whoami)
sudo usermod -G kvm -a $(whoami)
# Create proper hosts file
sudo sed -i '1s;^;192.168.122.1 virtualization-host.intra.example.net virtualization-host\n;' /etc/hosts
# How can i prevent chronyd to listen on IPv6 socket? [2]
sudo sed -i 's/OPTIONS=""/OPTIONS="-4"/' /etc/sysconfig/chronyd
# Setup bridge interface
sudo sed -i 's/BOOTPROTO=dhcp/BOOTPROTO=none\nBRIDGE=br0/' /etc/sysconfig/network-scripts/ifcfg-enp6s0
# Configure the bridge and use libvirt dnsmasq as primary DNS server (for the default network)
sudo tee /etc/sysconfig/network-scripts/ifcfg-br0 > /dev/null << 'EOF'
DEVICE="br0"
TYPE=BRIDGE
ONBOOT=yes
BOOTPROTO="static"
IPADDR=[IP ADDRESS]
NETMASK=[NETMASK]
BROADCAST=[BROADCAST ADDRESS]
NETWORK=[NETWORK]
GATEWAY=[GATEWAY]
PEERDNS=no
DNS1=192.168.122.1
DNS2=[SECONDARY DNS]
EOF
# Set default libvirt uri
echo "export LIBVIRT_DEFAULT_URI=\"qemu:///system\"" | tee -a ~/.bashrc > /dev/null
# Goodbye grub, remove resume, set proper kernel arguments
# pcie_acs_override=downstream for whoever needs it
# [WARNING] double check if you are using an INTEL or AMD CPU...
# Depending on the motherboard you may only need this: rd.driver.pre=vfio-pci
sudo sed -i 's/GRUB_TIMEOUT=5/GRUB_TIMEOUT=0/;s/resume=[^ ]* //;s/quiet/quiet intel_iommu=on rd.driver.pre=vfio-pci video=efifb:off/' /etc/default/grub
# Update grub
sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
# If you are not using EFI... Use this instead
# sudo grub2-mkconfig -o /boot/grub2/grub.cfg
# Disable IPv6
# echo "net.ipv6.conf.all.disable_ipv6 = 1" | sudo tee -a /etc/sysctl.conf > /dev/null
# Add vfio drivers to initramfs
sudo tee /etc/dracut.conf.d/vfio.conf > /dev/null << 'EOF'
add_drivers+="vfio vfio_iommu_type1 vfio_pci vfio_virqfd"
EOF
# Enable nested virtualization
# AMD
sudo sed -i 's/#options kvm_amd/options kvm_amd npt=1 avic=1 /' /etc/modprobe.d/kvm.conf
# INTEL
sudo sed -i 's/#options kvm_intel/options kvm_intel npt=1 avic=1 /' /etc/modprobe.d/kvm.conf
# Configure vfio to control devices
# 0b:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP102 [GeForce GTX 1080 Ti] [10de:1b06] (rev a1) (prog-if 00 [VGA controller])
# 0b:00.1 Audio device [0403]: NVIDIA Corporation GP102 HDMI Audio Controller [10de:10ef] (rev a1)
sudo tee /etc/modprobe.d/vfio.conf > /dev/null << 'EOF'
options vfio-pci ids=10de:1b06,10de:10ef
EOF
# Update initramfs
sudo dracut -f --regenerate-all
# Configure default network to automate DNS updates[3]
sudo systemctl start libvirtd
sudo virsh net-destroy default
sudo virsh net-undefine default
tee network-default.xml > /dev/null << 'EOF'
<network>
<name>default</name>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr0' stp='on' delay='0'/>
<domain name='virtualization-host.intra.example.net' localOnly='no'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
EOF
sudo virsh net-define network-default.xml
rm network-default.xml
sudo virsh net-start default
sudo virsh net-autostart default
# Fail2ban
sudo dnf install fail2ban -y
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
sudo tee /etc/fail2ban/jail.local > /dev/null << 'EOF'
[DEFAULT]
bantime = 3600
[sshd]
enabled = true
EOF
sudo dnf install -y rsync
# Troubleshoot
## SElinux <3[4]
## After changes in boot/ images
# sudo restorecon -R -v /var/lib/libvirt/boot/
# sudo restorecon -R -v /var/lib/libvirt/images/
#
## Check attributes
# ls -lasZ /var/lib/libvirt/boot/
# ls -lasZ /var/lib/libvirt/images/
sudo reboot
# References
# [1] https://access.redhat.com/solutions/131583
# [2] https://access.redhat.com/solutions/2026723
# [3] https://m0dlx.com/blog/Automatic_DNS_updates_from_libvirt_guests.html
# [4] https://docs-old.fedoraproject.org/en-US/Fedora/13/html/Virtualization_Guide/sect-Virtualization-Security_for_virtualization-SELinux_and_virtualization.html
@relvinhas
Copy link
Author

relvinhas commented Sep 30, 2020

X570 AORUS XTREME (rev. 1.0)

#!/bin/bash
shopt -s nullglob
for g in /sys/kernel/iommu_groups/*; do
    echo "IOMMU Group ${g##*/}:"
    for d in $g/devices/*; do
        echo -e "\t$(lspci -nns ${d##*/})"
    done;
done;
IOMMU Group 0:
	00:01.0 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Starship/Matisse PCIe Dummy Host Bridge [1022:1482]
IOMMU Group 1:
	00:01.1 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Starship/Matisse GPP Bridge [1022:1483]
IOMMU Group 10:
	00:07.1 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Starship/Matisse Internal PCIe GPP Bridge 0 to bus[E:B] [1022:1484]
IOMMU Group 11:
	00:08.0 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Starship/Matisse PCIe Dummy Host Bridge [1022:1482]
IOMMU Group 12:
	00:08.1 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Starship/Matisse Internal PCIe GPP Bridge 0 to bus[E:B] [1022:1484]
IOMMU Group 13:
	00:14.0 SMBus [0c05]: Advanced Micro Devices, Inc. [AMD] FCH SMBus Controller [1022:790b] (rev 61)
	00:14.3 ISA bridge [0601]: Advanced Micro Devices, Inc. [AMD] FCH LPC Bridge [1022:790e] (rev 51)
IOMMU Group 14:
	00:18.0 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Matisse Device 24: Function 0 [1022:1440]
	00:18.1 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Matisse Device 24: Function 1 [1022:1441]
	00:18.2 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Matisse Device 24: Function 2 [1022:1442]
	00:18.3 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Matisse Device 24: Function 3 [1022:1443]
	00:18.4 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Matisse Device 24: Function 4 [1022:1444]
	00:18.5 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Matisse Device 24: Function 5 [1022:1445]
	00:18.6 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Matisse Device 24: Function 6 [1022:1446]
	00:18.7 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Matisse Device 24: Function 7 [1022:1447]
IOMMU Group 15:
	01:00.0 Non-Volatile memory controller [0108]: Phison Electronics Corporation E16 PCIe4 NVMe Controller [1987:5016] (rev 01)
IOMMU Group 16:
	02:00.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Matisse Switch Upstream [1022:57ad]
IOMMU Group 17:
	03:01.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Matisse PCIe GPP Bridge [1022:57a3]
IOMMU Group 18:
	03:03.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Matisse PCIe GPP Bridge [1022:57a3]
IOMMU Group 19:
	03:04.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Matisse PCIe GPP Bridge [1022:57a3]
IOMMU Group 2:
	00:01.2 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Starship/Matisse GPP Bridge [1022:1483]
IOMMU Group 20:
	03:05.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Matisse PCIe GPP Bridge [1022:57a3]
IOMMU Group 21:
	03:08.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Matisse PCIe GPP Bridge [1022:57a4]
	08:00.0 Non-Essential Instrumentation [1300]: Advanced Micro Devices, Inc. [AMD] Starship/Matisse Reserved SPP [1022:1485]
	08:00.1 USB controller [0c03]: Advanced Micro Devices, Inc. [AMD] Matisse USB 3.0 Host Controller [1022:149c]
	08:00.3 USB controller [0c03]: Advanced Micro Devices, Inc. [AMD] Matisse USB 3.0 Host Controller [1022:149c]
IOMMU Group 22:
	03:09.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Matisse PCIe GPP Bridge [1022:57a4]
	09:00.0 SATA controller [0106]: Advanced Micro Devices, Inc. [AMD] FCH SATA Controller [AHCI mode] [1022:7901] (rev 51)
IOMMU Group 23:
	03:0a.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Matisse PCIe GPP Bridge [1022:57a4]
	0a:00.0 SATA controller [0106]: Advanced Micro Devices, Inc. [AMD] FCH SATA Controller [AHCI mode] [1022:7901] (rev 51)
IOMMU Group 24:
	04:00.0 Non-Volatile memory controller [0108]: Samsung Electronics Co Ltd NVMe SSD Controller SM951/PM951 [144d:a802] (rev 01)
IOMMU Group 25:
	05:00.0 Ethernet controller [0200]: Aquantia Corp. AQC107 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion] [1d6a:d107] (rev 02)
IOMMU Group 26:
	06:00.0 Ethernet controller [0200]: Intel Corporation I211 Gigabit Network Connection [8086:1539] (rev 03)
IOMMU Group 27:
	07:00.0 Network controller [0280]: Intel Corporation Wi-Fi 6 AX200 [8086:2723] (rev 1a)
IOMMU Group 28:
	0b:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP102 [GeForce GTX 1080 Ti] [10de:1b06] (rev a1)
	0b:00.1 Audio device [0403]: NVIDIA Corporation GP102 HDMI Audio Controller [10de:10ef] (rev a1)
IOMMU Group 29:
	0c:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP102 [GeForce GTX 1080 Ti] [10de:1b06] (rev a1)
	0c:00.1 Audio device [0403]: NVIDIA Corporation GP102 HDMI Audio Controller [10de:10ef] (rev a1)
IOMMU Group 3:
	00:02.0 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Starship/Matisse PCIe Dummy Host Bridge [1022:1482]
IOMMU Group 30:
	0d:00.0 Non-Essential Instrumentation [1300]: Advanced Micro Devices, Inc. [AMD] Starship/Matisse PCIe Dummy Function [1022:148a]
IOMMU Group 31:
	0e:00.0 Non-Essential Instrumentation [1300]: Advanced Micro Devices, Inc. [AMD] Starship/Matisse Reserved SPP [1022:1485]
IOMMU Group 32:
	0e:00.1 Encryption controller [1080]: Advanced Micro Devices, Inc. [AMD] Starship/Matisse Cryptographic Coprocessor PSPCPP [1022:1486]
IOMMU Group 33:
	0e:00.3 USB controller [0c03]: Advanced Micro Devices, Inc. [AMD] Matisse USB 3.0 Host Controller [1022:149c]
IOMMU Group 34:
	0e:00.4 Audio device [0403]: Advanced Micro Devices, Inc. [AMD] Starship/Matisse HD Audio Controller [1022:1487]
IOMMU Group 4:
	00:03.0 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Starship/Matisse PCIe Dummy Host Bridge [1022:1482]
IOMMU Group 5:
	00:03.1 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Starship/Matisse GPP Bridge [1022:1483]
IOMMU Group 6:
	00:03.2 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Starship/Matisse GPP Bridge [1022:1483]
IOMMU Group 7:
	00:04.0 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Starship/Matisse PCIe Dummy Host Bridge [1022:1482]
IOMMU Group 8:
	00:05.0 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Starship/Matisse PCIe Dummy Host Bridge [1022:1482]
IOMMU Group 9:
	00:07.0 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Starship/Matisse PCIe Dummy Host Bridge [1022:1482]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment