├── test.sh ├── LXC_configure.sh ├── Nvidia-driver-setup.sh ├── README.md ├── 6.2-1.sh └── LXC_create.sh /test.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | #remove proxmox ui nag 4 | bash -c "$(wget -qLO - https://gist.githubusercontent.com/whiskerz007/53c6aa5d624154bacbbc54880e1e3b2a/raw/70b66d1852978cc457526df4a2913ca2974970a1/gistfile1.txt)" 5 | # Update Proxmox 6 | apt-get update && apt-get upgrade -qqy 7 | #Driver install NVidia 8 | bash -c "$(wget -qLO - https://raw.githubusercontent.com/Saberwolf64/Proxmox-Nvidia-LXC-/proxmox-6.2-1-ubunutu-contributor-Whiskerz007/Nvidia-driver-setup.sh)" 9 | #Create lxc download install plex and nvtop 10 | bash -c "$(wget -qLO - https://raw.githubusercontent.com/Saberwolf64/Proxmox-Nvidia-LXC-/proxmox-6.2-1-ubunutu-contributor-Whiskerz007/LXC_configure.sh)" -------------------------------------------------------------------------------- /LXC_configure.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | #create LXC 4 | export CTID=$(pvesh get /cluster/nextid) 5 | export PCT_OSTYPE=ubuntu 6 | export PCT_OSVERSION=20 7 | export PCT_DISK_SIZE=8 8 | export PCT_OPTIONS=" 9 | -cmode shell 10 | -hostname PLEX 11 | -memory 4096 12 | -features nesting=1 13 | -net0 name=eth0,bridge=vmbr0,ip=dhcp 14 | -unprivileged 1 15 | " 16 | bash -c "$(wget -qLO - https://raw.githubusercontent.com/Saberwolf64/Proxmox-Nvidia-LXC-/proxmox-6.2-1-ubunutu-contributor-Whiskerz007/LXC_create.sh)" 17 | 18 | #configure LXC 19 | LXC_CONFIG=/etc/pve/lxc/${CTID}.conf 20 | cat <> $LXC_CONFIG 21 | lxc.hook.pre-start: sh -c '[ ! -f /dev/nvidia-uvm ] && /usr/bin/nvidia-modprobe -c0 -u' 22 | lxc.environment: NVIDIA_VISIBLE_DEVICES=all 23 | lxc.environment: NVIDIA_DRIVER_CAPABILITIES=all 24 | lxc.hook.mount: /usr/share/lxc/hooks/nvidia 25 | lxc.hook.pre-start: sh -c 'chown :100000 /dev/nvidia*' 26 | EOF 27 | 28 | #Start LXC 29 | pct start $CTID 30 | 31 | #wait for lxc to report ip from DHCP 32 | until lxc-info $CTID | grep -q IP;do 33 | echo -ne "no ip found \033[0K\r" 34 | done 35 | 36 | #Update/upgrade and install plex,NVtop on LXC 37 | lxc-attach -n $CTID -- apt -y install gnupg2 38 | lxc-attach -n $CTID -- bash -c 'wget -q https://downloads.plex.tv/plex-keys/PlexSign.key -O - | apt-key add -' 39 | lxc-attach -n $CTID -- bash -c 'echo "deb https://downloads.plex.tv/repo/deb/ public main" > /etc/apt/sources.list.d/plexmediaserver.list' 40 | lxc-attach -n $CTID -- apt update 41 | lxc-attach -n $CTID -- apt -y upgrade 42 | lxc-attach -n $CTID -- apt -y install nvtop 43 | lxc-attach -n $CTID -- apt-get -y -o Dpkg::Options::="--force-confnew" install plexmediaserver 44 | -------------------------------------------------------------------------------- /Nvidia-driver-setup.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | #removal of Nouveau driver from system 4 | # cat < /etc/modprobe.d/nvidia-installer-disable-nouveau.conf 5 | # # generated by nvidia-installer 6 | # blacklist nouveau 7 | # options nouveau modeset=0 8 | # e 9 | # rmmod nouveau 10 | 11 | # Setup temporary environment 12 | trap cleanup EXIT 13 | function cleanup() { 14 | popd >/dev/null 15 | rm -rf $TMP_DIR 16 | } 17 | TMP_DIR=$(mktemp -d) 18 | pushd $TMP_DIR >/dev/null 19 | 20 | # Install NVidia drivers prerequisites 21 | apt-get install -qqy pve-headers-`uname -r` gcc make 22 | 23 | # Install NVidia drivers 24 | LATEST_DRIVER=$(wget -qLO - https://download.nvidia.com/XFree86/Linux-x86_64/latest.txt | awk '{print $2}') 25 | LATEST_DRIVER_URL="https://download.nvidia.com/XFree86/Linux-x86_64/${LATEST_DRIVER}" 26 | INSTALL_SCRIPT=$(basename $LATEST_DRIVER_URL) 27 | wget -qLO $INSTALL_SCRIPT $LATEST_DRIVER_URL 28 | bash $INSTALL_SCRIPT --silent 29 | 30 | # Install NVidia Persistenced 31 | #/usr/share/doc/NVIDIA_GLX-1.0/sample/nvidia-persistenced-init.tar.bz2 32 | if [ -f /usr/share/doc/NVIDIA_GLX-1.0/samples/nvidia-persistenced-init.tar.bz2 ]; then 33 | tar -jxvf /usr/share/doc/NVIDIA_GLX-1.0/samples/nvidia-persistenced-init.tar.bz2 34 | bash ./nvidia-persistenced-init/install.sh 35 | fi 36 | 37 | # Install NVidia Container Runtime 38 | wget -qLO - https://nvidia.github.io/nvidia-container-runtime/gpgkey | apt-key add - 39 | distribution=$(. /etc/os-release;echo $ID$VERSION_ID) 40 | wget -qLO - https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | tee /etc/apt/sources.list.d/nvidia-container-runtime.list 41 | apt-get update 42 | apt-get install -qqy nvidia-container-runtime 43 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Proxmox-Nvidia-LXC- 2 | how to create an Proxmox LXC in 6.2-1 nvidia driver 455.28 3 | 4 | install of Nvidia-container-runtime for Debian-based distributions 5 | 6 | curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | \ apt-key add - 7 | distribution=$(. /etc/os-release;echo $ID$VERSION_ID) 8 | curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | \ 9 | tee /etc/apt/sources.list.d/nvidia-container-runtime.list 10 | apt-get update 11 | 12 | updating repository keys 13 | 14 | This project is maintained by NVIDIA 15 | curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | \ 16 | apt-key add - 17 | 18 | you will need to modify your lxc config file /etc/pve/lxc/id#.conf and add the these line you must all so do this in an unprivileged CT 19 | it will not work in a privileged 20 | 21 | lxc.environment: NVIDIA_VISIBLE_DEVICES=all # forced environment var 22 | 23 | lxc.environment: NVIDIA_DRIVER_CAPABILITIES=all # forced enviornment var 24 | 25 | lxc.hook.mount: /usr/share/lxc/hooks/nvidia # hook script 26 | 27 | lxc.hook.pre-start: sh -c 'chown :100000 /dev/nvidia*' # was added due to permission issuse between host and client this will need to be done outside of config first 28 | 29 | #Now you must download the nvidia drivers from Nvidia.com 30 | 31 | wget http://us.download.nvidia.com/XFree86/Linux-x86_64/440.82/NVIDIA-Linux-x86_64-440.82.run # is the version i have tested to work with 32 | 33 | #run installer 34 | bash NVIDIA-Linux-x86_64-440.82.run # fallow the on screen promts 35 | 36 | run the command nvidia-smi # to see if driver are working 37 | 38 | pct enter lxc id# 39 | 40 | ls -l /dev/nvidia* 41 | 42 | crw-rw-rw- 1 nobody root 195, 254 May 19 11:44 /dev/nvidia-modeset 43 | 44 | crw-rw-rw- 1 nobody root 511, 0 May 19 11:44 /dev/nvidia-uvm 45 | 46 | crw-rw-rw- 1 nobody root 511, 1 May 19 11:44 /dev/nvidia-uvm-tools 47 | 48 | crw-rw-rw- 1 nobody nogroup 195, 0 May 19 11:44 /dev/nvidia0 49 | 50 | crw-rw-rw- 1 nobody nogroup 195, 255 May 19 11:44 /dev/nvidiactl 51 | 52 | 53 | wget https://downloads.plex.tv/plex-media-server-new/1.19.3.2831-181d9145d/debian/plexmediaserver_1.19.3.2831-181d9145d_amd64.deb 54 | 55 | dpkg -i plexmediaserver_1.19.3.2831-181d9145d_amd64.deb 56 | 57 | systemctl status plexmediaserver # to make shure plex is running properly 58 | 59 | dpkg -L plexmediaserver to install plex into your repo so it can be updated with the apt manager 60 | 61 | change plex setting 127.0.0.1:32400/web # you will need to change plex setting in the advance menus to enable Hw Accel 62 | 63 | 64 | 65 | REF websites 66 | https://www.plex.tv/media-server-downloads/ 67 | 68 | https://support.plex.tv/articles/200288586-installation/ 69 | 70 | https://github.com/NVIDIA/nvidia-container-runtime 71 | 72 | https://nvidia.github.io/nvidia-container-runtime/ 73 | -------------------------------------------------------------------------------- /6.2-1.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | #remove proxmox ui nag 4 | bash -c "$(wget -qLO - https://gist.githubusercontent.com/whiskerz007/53c6aa5d624154bacbbc54880e1e3b2a/raw/70b66d1852978cc457526df4a2913ca2974970a1/gistfile1.txt)" 5 | 6 | # Update Proxmox 7 | apt-get update && apt-get upgrade -qqy 8 | 9 | # Install NVidia drivers prerequisites 10 | apt-get install -qqy pve-headers-`uname -r` gcc make 11 | 12 | # Setup temporary environment 13 | trap cleanup EXIT 14 | function cleanup() { 15 | popd >/dev/null 16 | rm -rf $TMP_DIR 17 | } 18 | TMP_DIR=$(mktemp -d) 19 | pushd $TMP_DIR >/dev/null 20 | 21 | #removal of Nouveau driver from system 22 | cat < /etc/modprobe.d/nvidia-installer-disable-nouveau.conf 23 | # generated by nvidia-installer 24 | blacklist nouveau 25 | options nouveau modeset=0 26 | e 27 | rmmod nouveau 28 | 29 | # Install NVidia drivers 30 | LATEST_DRIVER=$(wget -qLO - https://download.nvidia.com/XFree86/Linux-x86_64/latest.txt | awk '{print $2}') 31 | LATEST_DRIVER_URL="https://download.nvidia.com/XFree86/Linux-x86_64/${LATEST_DRIVER}" 32 | INSTALL_SCRIPT=$(basename $LATEST_DRIVER_URL) 33 | wget -qLO $INSTALL_SCRIPT $LATEST_DRIVER_URL 34 | bash $INSTALL_SCRIPT --silent 35 | 36 | # Install NVidia Persistenced 37 | #/usr/share/doc/NVIDIA_GLX-1.0/sample/nvidia-persistenced-init.tar.bz2 38 | if [ -f /usr/share/doc/NVIDIA_GLX-1.0/samples/nvidia-persistenced-init.tar.bz2 ]; then 39 | tar -jxvf /usr/share/doc/NVIDIA_GLX-1.0/samples/nvidia-persistenced-init.tar.bz2 40 | bash ./nvidia-persistenced-init/install.sh 41 | fi 42 | 43 | # Install NVidia Container Runtime 44 | wget -qLO - https://nvidia.github.io/nvidia-container-runtime/gpgkey | apt-key add - 45 | distribution=$(. /etc/os-release;echo $ID$VERSION_ID) 46 | wget -qLO - https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | tee /etc/apt/sources.list.d/nvidia-container-runtime.list 47 | apt-get update 48 | apt-get install -qqy nvidia-container-runtime 49 | 50 | #create LXC 51 | export CTID=$(pvesh get /cluster/nextid) 52 | export PCT_OSTYPE=ubuntu 53 | export PCT_OSVERSION=20 54 | export PCT_DISK_SIZE=20 55 | export PCT_OPTIONS=" 56 | -cmode shell 57 | -hostname PLEX 58 | -memory 4096 59 | -features nesting=1 60 | -net0 name=eth0,bridge=vmbr0,ip=dhcp 61 | -unprivileged 1 62 | " 63 | bash -c "$(wget -qLO - https://raw.githubusercontent.com/Saberwolf64/Proxmox-Nvidia-LXC-/proxmox-6.2-1-ubunutu-contributor-Whiskerz007/LXC_create.sh)" 64 | 65 | #configure LXC 66 | LXC_CONFIG=/etc/pve/lxc/${CTID}.conf 67 | cat <> $LXC_CONFIG 68 | lxc.hook.pre-start: sh -c '[ ! -f /dev/nvidia-uvm ] && /usr/bin/nvidia-modprobe -c0 -u' 69 | lxc.environment: NVIDIA_VISIBLE_DEVICES=all 70 | lxc.environment: NVIDIA_DRIVER_CAPABILITIES=all 71 | lxc.hook.mount: /usr/share/lxc/hooks/nvidia 72 | lxc.hook.pre-start: sh -c 'chown :100000 /dev/nvidia*' 73 | EOF 74 | 75 | pct start $CTID 76 | 77 | #wait for lxc to report ip from DHCP 78 | until lxc-info $CTID | grep -q IP;do 79 | echo -ne "no ip found \033[0K\r" 80 | done 81 | 82 | #Update/upgrade and install plex,NVtop on LXC 83 | lxc-attach -n $CTID -- apt -y install gnupg2 84 | lxc-attach -n $CTID -- bash -c 'wget -q https://downloads.plex.tv/plex-keys/PlexSign.key -O - | apt-key add -' 85 | lxc-attach -n $CTID -- bash -c 'echo "deb https://downloads.plex.tv/repo/deb/ public main" > /etc/apt/sources.list.d/plexmediaserver.list' 86 | lxc-attach -n $CTID -- apt update 87 | lxc-attach -n $CTID -- apt -y upgrade 88 | lxc-attach -n $CTID -- apt -y install nvtop 89 | lxc-attach -n $CTID -- apt-get -y -o Dpkg::Options::="--force-confnew" install plexmediaserver 90 | -------------------------------------------------------------------------------- /LXC_create.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Setup script environment 4 | set -o errexit #Exit immediately if a pipeline returns a non-zero status 5 | set -o errtrace #Trap ERR from shell functions, command substitutions, and commands from subshell 6 | set -o nounset #Treat unset variables as an error 7 | set -o pipefail #Pipe will exit with last non-zero status if applicable 8 | shopt -s expand_aliases 9 | alias die='EXIT=$? LINE=$LINENO error_exit' 10 | trap die ERR 11 | 12 | function error_exit() { 13 | trap - ERR 14 | local DEFAULT='Unknown failure occured.' 15 | local REASON="\e[97m${1:-$DEFAULT}\e[39m" 16 | local FLAG="\e[91m[ERROR] \e[93m$EXIT@$LINE" 17 | msg "$FLAG $REASON" 1>&2 18 | [ ! -z ${CTID-} ] && cleanup_ctid 19 | exit $EXIT 20 | } 21 | function warn() { 22 | local REASON="\e[97m$1\e[39m" 23 | local FLAG="\e[93m[WARNING]\e[39m" 24 | msg "$FLAG $REASON" 25 | } 26 | function info() { 27 | local REASON="$1" 28 | local FLAG="\e[36m[INFO]\e[39m" 29 | msg "$FLAG $REASON" 30 | } 31 | function msg() { 32 | local TEXT="$1" 33 | echo -e "$TEXT" 34 | } 35 | function cleanup_ctid() { 36 | if pct status $CTID &>/dev/null; then 37 | if [ "$(pct status $CTID | awk '{print $2}')" == "running" ]; then 38 | pct stop $CTID 39 | fi 40 | pct destroy $CTID 41 | fi 42 | } 43 | function select_storage() { 44 | local CLASS=$1 45 | local CONTENT 46 | local CONTENT_LABEL 47 | case $CLASS in 48 | container) CONTENT='rootdir'; CONTENT_LABEL='Container';; 49 | template) CONTENT='vztmpl'; CONTENT_LABEL='Container template';; 50 | *) false || die "Invalid storage class.";; 51 | esac 52 | 53 | # Query all storage locations 54 | local -a MENU 55 | while read -r line; do 56 | local TAG=$(echo $line | awk '{print $1}') 57 | local TYPE=$(echo $line | awk '{printf "%-10s", $2}') 58 | local FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') 59 | local ITEM=" Type: $TYPE Free: $FREE " 60 | local OFFSET=2 61 | if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then 62 | local MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) 63 | fi 64 | MENU+=( "$TAG" "$ITEM" "OFF" ) 65 | done < <(pvesm status -content $CONTENT | awk 'NR>1') 66 | 67 | # Select storage location 68 | if [ $((${#MENU[@]}/3)) -eq 0 ]; then # No storage locations are detected 69 | warn "'$CONTENT_LABEL' needs to be selected for at least one storage location." 70 | die "Unable to detect valid storage location." 71 | elif [ $((${#MENU[@]}/3)) -eq 1 ]; then # Only one storage location is detected 72 | printf ${MENU[0]} 73 | else # More than one storage location is detected 74 | local STORAGE 75 | while [ -z "${STORAGE:+x}" ]; do # Generate graphical menu 76 | STORAGE=$(whiptail --title "Storage Pools" --radiolist \ 77 | "Which storage pool you would like to use for the ${CONTENT_LABEL,,}?\n\n" \ 78 | 16 $(($MSG_MAX_LENGTH + 23)) 6 \ 79 | "${MENU[@]}" 3>&1 1>&2 2>&3) || die "Menu aborted." 80 | done 81 | printf $STORAGE 82 | fi 83 | } 84 | 85 | # Test if required variables are set 86 | [[ "${CTID:-}" ]] || die "You need to set 'CTID' variable." 87 | [[ "${PCT_OSTYPE:-}" ]] || die "You need to set 'PCT_OSTYPE' variable." 88 | 89 | # Test if ID is valid 90 | [ "$CTID" -ge "100" ] || die "ID cannot be less than 100." 91 | 92 | # Test if ID is in use 93 | if pct status $CTID &>/dev/null; then 94 | warn "ID '$CTID' is already in use." 95 | unset CTID 96 | die "Cannot use ID that is already in use." 97 | fi 98 | 99 | # Get template storage 100 | TEMPLATE_STORAGE=$(select_storage template) || exit 101 | info "Using '$TEMPLATE_STORAGE' for template storage." 102 | 103 | # Get container storage 104 | CONTAINER_STORAGE=$(select_storage container) || exit 105 | info "Using '$CONTAINER_STORAGE' for container storage." 106 | 107 | # Update LXC template list 108 | msg "Updating LXC template list..." 109 | pveam update >/dev/null 110 | 111 | # Get LXC template string 112 | TEMPLATE_SEARCH=${PCT_OSTYPE}-${PCT_OSVERSION:-} 113 | mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($TEMPLATE_SEARCH.*\)/\1/p" | sort -t - -k 2 -V) 114 | [ ${#TEMPLATES[@]} -gt 0 ] || die "Unable to find a template when searching for '$TEMPLATE_SEARCH'." 115 | TEMPLATE="${TEMPLATES[-1]}" 116 | 117 | # Download LXC template 118 | if ! pveam list $TEMPLATE_STORAGE | grep -q $TEMPLATE; then 119 | msg "Downloading LXC template..." 120 | pveam download $TEMPLATE_STORAGE $TEMPLATE >/dev/null || 121 | die "A problem occured while downloading the LXC template." 122 | fi 123 | 124 | # Create variable for 'pct' options 125 | DEFAULT_PCT_OPTIONS=( 126 | -arch $(dpkg --print-architecture) 127 | -net0 name=eth0,bridge=vmbr0,ip=dhcp 128 | -unprivileged 1 129 | ) 130 | PCT_OPTIONS=( ${PCT_OPTIONS[@]:-${DEFAULT_PCT_OPTIONS[@]}} ) 131 | [[ " ${PCT_OPTIONS[@]} " =~ " -rootfs " ]] || PCT_OPTIONS+=( -rootfs $CONTAINER_STORAGE:${PCT_DISK_SIZE:-8} ) 132 | 133 | # Create LXC 134 | msg "Creating LXC container..." 135 | pct create $CTID ${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE} ${PCT_OPTIONS[@]} >/dev/null || 136 | die "A problem occured while trying to create container." 137 | 138 | # Success message 139 | info "LXC container '$CTID' was successfully created." 140 | --------------------------------------------------------------------------------