XCP-ng
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    Bash script to work with pci passthrough on host

    Scheduled Pinned Locked Moved Compute
    1 Posts 1 Posters 16 Views 1 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • marcoiM Offline
      marcoi
      last edited by

      I wrote a simple script to help those of us who want to do pci passthrough and running into xe limits.
      Not responsible for issues/use/etc... use at own risk.
      Feel free to github/maintain it, i wont be planning on doing any more on it.
      I did this to work with pci passthrough and issues i been having while testing a new build. I found out that adding new devices while enabled pci for devices showing in xe can lead to issues and having to do pci hide reset. So i added that. I also added a enable pci device that is on xe so you can do it via app on host or still do it on gui using XO. Finally added a menu to add non xe pci device directly to vm.
      Vm list is my list so you need to update that with what you want to enable.

      Hope this helps someone else 😀

      So grab the code, save it to /root/pcishare.sh and chmod +x it to run it.
      This is on the host directly.

      #!/bin/bash
      
      # pcieDevices[x] is the name of the  device
      # pcieDevicesID[x] is the id of the device from lspci
      # pcieDevicesUUID[x] is uuid from xe list if available
      
      ######## Add Devices to check and make passthrough #########################
      #format pcieDevices[x]='' #make sure to use single quotes are special chars will mess up.
      ##############################################################################
      pcieDevices[0]='USB controller: ASMedia Technology Inc. ASM2142/ASM3142 USB 3.1 Host Controller'
      pcieDevices[1]='VGA compatible controller: NVIDIA Corporation GK208 [GeForce GT 720] (rev a1)'
      pcieDevices[2]='Audio device: NVIDIA Corporation GK208 HDMI/DP Audio Controller (rev a1)'
      pcieDevices[3]='SATA controller: JMicron Technology Corp. JMB58x AHCI SATA controller'
      ###############################################################################
      
      #Startup
      pcieCount=${#pcieDevices[@]}
      
      #load lspci into array lspciDevices#####
      mapfile -t lspciDevices < <(lspci)
      
      #####################################################################################
      #function to request a reboot
      function rebootPC
      {
        read -n 1 -p "Need to reboot host. Y/N to reboot?: " doReboot
        case $doReboot in
              y|Y ) reboot;;
              *|n|N ) clear; echo "please reboot"; exit;;
        esac
      }
      
      ######################################################################################
      # remove old hide list / request reboot
      function resetDOMPCIE 
      {
        echo ""  
        echo " Clearing out xen-pciback list "
      
        /opt/xensource/libexec/xen-cmdline --delete-dom0 xen-pciback.hide
        
        echo "Completed"
        rebootPC
      
      }
      ######################################################################################
      # List variables to confirm which pcie the script is working with
      function confirmPCIList
      {
        clear
        echo ""
        echo "***************************************"
        for (( j=0; j<${#pcieDevices[@]}; j++ )); do
          echo "*${pcieDevices[$j]}"
        done
        echo "***************************************"
      exit
      }
      ######################################################################################
      function enablePCI
      {
      clear
      echo "**************************************************"
      echo "* Please select Index to enable pci passthrough  *"
      echo "**************************************************"
      echo ""
      
      for (( j=0; j<${#pcieDevices[@]}; j++ )); do
        if [ -n "${pcieDevicesUUID[$j]}" ]; then
          echo "Index $j: ${pcieDevicesUUID[$j]}-${pcieDevicesID[$j]}:${pcieDevices[$j]}"
        fi
      done
      echo ""
      echo ""
      read -n 1 -p  "Please make a selection or (E)xit: " menuEnablePCIEchoice;
      
      case $menuEnablePCIEchoice in
       [0-99] ) 
           echo ""
           xe pci-disable-dom0-access uuid=${pcieDevicesUUID[$menuEnablePCIEchoice]}
           echo ""
           
           rebootPC
       ;; 
       e|E ) exit;;
       * )  exit ;;
      esac
      }
      #######################################################################################
      function addPCIEVM
      {
      clear
      echo "********************************************************"
      echo "* Please select Index to enable pci passthrough on VM  *"
      echo "********************************************************"
      echo ""
      
      for (( j=0; j<${#pcieDevices[@]}; j++ )); do
        if [ -z "${pcieDevicesUUID[$j]}" ]; then
          echo "Index $j: ${pcieDevicesUUID[$j]}-${pcieDevicesID[$j]}:${pcieDevices[$j]}"
        fi
      done
      echo ""
      echo ""
      read -n 1 -p  "Please make a selection or (E)xit: " menuAddPCIEchoice;
      
      case $menuAddPCIEchoice in
       [0-99] )
           echo ""
           read -p  "Please provide the VM UUID: " vmID;
           echo ""
           xe vm-param-set other-config:pci=0/0000:${pcieDevicesID[$menuAddPCIEchoice]} uuid=$vmID
           echo ""
       ;;
       e|E ) exit;;
       * )  exit ;;
      esac
      }
      ######################################################################################
      function setPCIE
      {
      #########################################
      # Fill in pci ID into pcieDevicesID/UUID
      # Offer to toggle devices and add non xe device to VM
      #########################################
      
      clear
      
      # build list
      for (( i=0; i<"${#lspciDevices[@]}"; i++ )); do
       for (( j=0; j<${#pcieDevices[@]}; j++ )); do
        if [[ ${lspciDevices[$i]} ==  *"${pcieDevices[$j]}"*  ]]; then
         pcieDevicesID[$j]="${lspciDevices[$i]%% *}"
         tempUUID=""
         tempUUID=$(xe pci-list |grep -B 3 ${pcieDevicesID[$j]} |head -n 1| cut -d ':' -f2 | tr -d ' ')
      
         if [ -z "$tempUUID" ]; then
             echo "Index $j UUID not found for Device: ${pcieDevicesID[$j]} - ${pcieDevices[$j]}"
         else
            pcieDevicesUUID[$j]="$tempUUID"
            echo "Index $j Device:${pcieDevicesUUID[$j]}: ${pcieDevicesID[$j]} - ${pcieDevices[$j]} "
         fi
        fi
       done
      done
      
      echo "**************************************************"
      echo "* Would you like to:                             *"
      echo "* (E)nable pcie device for passthrough           *"
      echo "* (A)dd pcie directly to VM for non UUID         *"
      echo "* (Q)uit                                         *"
      echo "**************************************************"
      
      read -n 1 -p  "Please make a selection: " menuPCIEchoice;
      
      case $menuPCIEchoice in
       e|E ) enablePCI;;
       a|A ) addPCIEVM;;
       q|Q ) exit ;;
       * )  exit ;;
      esac
      }
      ##################################################
      # Menu - App choices below
      #################################################
      clear
      echo "****************************************"
      echo "* Please make sure to add your devices *"
      echo "* to the varible list before running   *"
      echo "*                                      *"
      echo "*             Menu                     *"
      echo "* Select options below to continue     *"
      echo "* 1. Reset PCIE hide list and DOM      *"
      echo "* 2. Show PCIE variable list           *"
      echo "* 3. Set pci devices                   *"
      echo "* Any other key to exit                *"
      echo "****************************************"
      
      read -n 1 -p  "Please make a selection: " menuChoice;
      
      case $menuChoice in
       1 ) resetDOMPCIE;;
       2 ) confirmPCIList;;
       3 ) setPCIE ;;
       4 ) echo "" ;;
       * ) clear ; exit ;;
      esac
      
      
      1 Reply Last reply Reply Quote 0
      • First post
        Last post