From 1fc5ac83789e8f27bb8f41ac445250b36ecb08b4 Mon Sep 17 00:00:00 2001 From: Oscar Krause Date: Wed, 22 Mar 2023 07:10:18 +0100 Subject: [PATCH] added setup_vgpu_license.sh script --- .UNRAID/setup_vgpu_license.sh | 197 ++++++++++++++++++++++++++++++++++ README.md | 15 +++ 2 files changed, 212 insertions(+) create mode 100644 .UNRAID/setup_vgpu_license.sh diff --git a/.UNRAID/setup_vgpu_license.sh b/.UNRAID/setup_vgpu_license.sh new file mode 100644 index 0000000..c3c93a0 --- /dev/null +++ b/.UNRAID/setup_vgpu_license.sh @@ -0,0 +1,197 @@ +#!/bin/bash + +# This script automates the licensing of the vGPU guest driver +# on Unraid boot. Set the Schedule to: "At Startup of Array". +# +# Relies on FastAPI-DLS for the licensing. +# It assumes FeatureType=1 (vGPU), change it as you see fit in line <114> +# +# Requires `eflutils` to be installed in the system for `nvidia-gridd` to run +# To Install it: +# 1) You might find it here: https://packages.slackware.com/ (choose the 64bit version of Slackware) +# 2) Download the package and put it in /boot/extra to be installed on boot +# 3) a. Reboot to install it, OR +# b. Run `upgradepkg --install-new /boot/extra/elfutils*` +# [i]: Make sure to have only one version of elfutils, otherwise you might run into issues + +# Sources and docs: +# https://docs.nvidia.com/grid/15.0/grid-vgpu-user-guide/index.html#configuring-nls-licensed-client-on-linux +# + +################################################ +# MAKE SURE YOU CHANGE THESE VARIABLES # +################################################ + +###### CHANGE ME! +# IP and PORT of FastAPI-DLS +DLS_IP=192.168.0.123 +DLS_PORT=443 +# Token folder, must be on a filesystem that supports +# linux filesystem permissions (eg: ext4,xfs,btrfs...) +TOKEN_PATH=/mnt/user/system/nvidia +PING=$(which ping) + +# Check if the License is applied +if [[ "$(nvidia-smi -q | grep "Expiry")" == *Expiry* ]]; then + echo " [i] Your vGPU Guest drivers are already licensed." + echo " [i] $(nvidia-smi -q | grep "Expiry")" + echo " [<] Exiting..." + exit 0 +fi + +# Check if the FastAPI-DLS server is reachable +# Check if the License is applied +MAX_RETRIES=30 +for i in $(seq 1 $MAX_RETRIES); do + echo -ne "\r [>] Attempt $i to connect to $DLS_IP." + if ping -c 1 $DLS_IP >/dev/null 2>&1; then + echo -e "\n [*] Connection successful." + break + fi + if [ $i -eq $MAX_RETRIES ]; then + echo -e "\n [!] Connection failed after $MAX_RETRIES attempts." + echo -e "\n [<] Exiting..." + exit 1 + fi + sleep 1 +done + +# Check if the token folder exists +if [ -d "${TOKEN_PATH}" ]; then + echo " [*] Token Folder exists. Proceeding..." +else + echo " [!] Token Folder does not exists or not ready yet. Exiting." + echo " [!] Token Folder Specified: ${TOKEN_PATH}" + exit 1 +fi + +# Check if elfutils are installed, otherwise nvidia-gridd service +# wont start +if [ "$(grep -R "elfutils" /var/log/packages/* | wc -l)" != 0 ]; then + echo " [*] Elfutils is installed, proceeding..." +else + echo " [!] Elfutils is not installed, downloading and installing..." + echo " [!] Downloading elfutils to /boot/extra" + echo " [i] This script will download elfutils from slackware64-15.0 repository." + echo " [i] If you have a different version of Unraid (6.11.5), you might want to" + echo " [i] download and install a suitable version manually from the slackware" + echo " [i] repository, and put it in /boot/extra to be install on boot." + echo " [i] You may also install it by running: " + echo " [i] upgradepkg --install-new /path/to/elfutils-*.txz" + echo "" + echo " [>] Downloading elfutils from slackware64-15.0 repository:" + wget -q -nc --show-progress --progress=bar:force:noscroll -P /boot/extra https://slackware.uk/slackware/slackware64-15.0/slackware64/l/elfutils-0.186-x86_64-1.txz 2>/dev/null \ + || { echo " [!] Error while downloading elfutils, please download it and install it manually."; exit 1; } + echo "" + if upgradepkg --install-new /boot/extra/elfutils-0.186-x86_64-1.txz + then + echo " [*] Elfutils installed and will be installed automatically on boot" + else + echo " [!] Error while installing, check logs..." + exit 1 + fi +fi + +echo " [~] Sleeping for 60 seconds before continuing..." +echo " [i] The script is waiting until the boot process settles down." + +for i in {60..1}; do + printf "\r [~] %d seconds remaining" "$i" + sleep 1 +done + +printf "\n" + +create_token () { + echo " [>] Creating new token..." + if ${PING} -c1 ${DLS_IP} > /dev/null 2>&1 + then + # curl --insecure -L -X GET https://${DLS_IP}:${DLS_PORT}/-/client-token -o ${TOKEN_PATH}/client_configuration_token_"$(date '+%d-%m-%Y-%H-%M-%S')".tok || { echo " [!] Could not get the token, please check the server."; exit 1;} + wget -q -nc -4c --no-check-certificate --show-progress --progress=bar:force:noscroll -O "${TOKEN_PATH}"/client_configuration_token_"$(date '+%d-%m-%Y-%H-%M-%S')".tok https://${DLS_IP}:${DLS_PORT}/-/client-token \ + || { echo " [!] Could not get the token, please check the server."; exit 1;} + chmod 744 "${TOKEN_PATH}"/*.tok || { echo " [!] Could not chmod the tokens."; exit 1; } + echo "" + echo " [*] Token downloaded and stored in ${TOKEN_PATH}." + else + echo " [!] Could not get token, DLS server unavailable ." + exit 1 + fi +} + +setup_run () { + echo " [>] Setting up gridd.conf" + cp /etc/nvidia/gridd.conf.template /etc/nvidia/gridd.conf || { echo " [!] Error configuring gridd.conf, did you install the drivers correctly?"; exit 1; } + sed -i 's/FeatureType=0/FeatureType=1/g' /etc/nvidia/gridd.conf + echo "ClientConfigTokenPath=${TOKEN_PATH}" >> /etc/nvidia/gridd.conf + echo " [>] Creating /var/lib/nvidia folder structure" + mkdir -p /var/lib/nvidia/GridLicensing + echo " [>] Starting nvidia-gridd" + if pgrep nvidia-gridd >/dev/null 2>&1; then + echo " [!] nvidia-gridd service is running. Closing." + sh /usr/lib/nvidia/sysv/nvidia-gridd stop + stop_exit_code=$? + if [ $stop_exit_code -eq 0 ]; then + echo " [*] nvidia-gridd service stopped successfully." + else + echo " [!] Error while stopping nvidia-gridd service." + exit 1 + fi + + # Kill the service if it does not close + if pgrep nvidia-gridd >/dev/null 2>&1; then + kill -9 "$(pgrep nvidia-gridd)" || { + echo " [!] Error while closing nvidia-gridd service" + exit 1 + } + fi + + echo " [*] Restarting nvidia-gridd service." + sh /usr/lib/nvidia/sysv/nvidia-gridd start + + if pgrep nvidia-gridd >/dev/null 2>&1; then + echo " [*] Service started, PID: $(pgrep nvidia-gridd)" + else + echo -e " [!] Error while starting nvidia-gridd service. Use strace -f nvidia-gridd to debug.\n [i] Check if elfutils is installed.\n [i] strace is not installed by default." + exit 1 + fi + else + sh /usr/lib/nvidia/sysv/nvidia-gridd start + + if pgrep nvidia-gridd >/dev/null 2>&1; then + echo " [*] Service started, PID: $(pgrep nvidia-gridd)" + else + echo -e " [!] Error while starting nvidia-gridd service. Use strace -f nvidia-gridd to debug.\n [i] Check if elfutils is installed.\n [i] strace is not installed by default." + exit 1 + fi + fi +} + +for token in "${TOKEN_PATH}"/*; do + if [ "${token: -4}" == ".tok" ] + then + echo " [*] Tokens found..." + setup_run + else + echo " [!] No Tokens found..." + create_token + setup_run + fi +done + +while true; do + if nvidia-smi -q | grep "Expiry" >/dev/null 2>&1; then + echo " [>] vGPU licensed!" + echo " [i] $(nvidia-smi -q | grep "Expiry")" + break + else + echo -ne " [>] vGPU not licensed yet... Checking again in 5 seconds\c" + for i in {1..5}; do + sleep 1 + echo -ne ".\c" + done + echo -ne "\r\c" + fi +done + +echo " [>] Done..." +exit 0 diff --git a/README.md b/README.md index fe8fae4..d12f5ff 100644 --- a/README.md +++ b/README.md @@ -363,6 +363,8 @@ Start with `systemctl start fastapi-dls.service` and enable autostart with `syst *Unraid users must also make sure they have Host access to custom networks enabled if unraid is the vgpu guest*. +Continue [here](#unraid-guest) for docker guest setup. + ## Let's Encrypt Certificate (optional) If you're using installation via docker, you can use `traefik`. Please refer to their documentation. @@ -482,6 +484,19 @@ vGPU Software Licensed Product Done. For more information check [troubleshoot section](#troubleshoot). +## unRAID Guest + +1. Make sure you create a folder in a linux filesystem (BTRFS/XFS/EXT4...), I recommend `/mnt/user/system/nvidia` (this is where docker and libvirt preferences are saved, so it's a good place to have that) +2. Edit the script to put your `DLS_IP`, `DLS_PORT` and `TOKEN_PATH`, properly +3. Install `User Scripts` plugin from *Community Apps* (the Apps page, or google User Scripts Unraid if you're not using CA) +4. Go to `Settings > Users Scripts > Add New Script` +5. Give it a name (the name must not contain spaces preferably) +6. Click on the *gear icon* to the left of the script name then edit script +7. Paste the script and save +8. Set schedule to `At First Array Start Only` +9. Click on Apply + + # Endpoints ### `GET /`