diff --git a/overlay/etc/cont-init.d/60-configure_gpu_driver.sh b/overlay/etc/cont-init.d/60-configure_gpu_driver.sh index 709417d..82273cf 100644 --- a/overlay/etc/cont-init.d/60-configure_gpu_driver.sh +++ b/overlay/etc/cont-init.d/60-configure_gpu_driver.sh @@ -1,19 +1,19 @@ # Fech NVIDIA GPU device (if one exists) -if [ "${NVIDIA_VISIBLE_DEVICES:-}" == "all" ]; then +if [ "${NVIDIA_VISIBLE_DEVICES:-}" = "all" ]; then export gpu_select=$(nvidia-smi --format=csv --query-gpu=uuid 2> /dev/null | sed -n 2p) -elif [ -z "${NVIDIA_VISIBLE_DEVICES:-}" ]; then +elif [ "${NVIDIA_VISIBLE_DEVICES:-}X" = "X" ]; then export gpu_select=$(nvidia-smi --format=csv --query-gpu=uuid 2> /dev/null | sed -n 2p) else export gpu_select=$(nvidia-smi --format=csv --id=$(echo "$NVIDIA_VISIBLE_DEVICES" | cut -d ',' -f1) --query-gpu=uuid | sed -n 2p) - if [ -z "$gpu_select" ]; then + if [ "${gpu_select:-}X" = "X" ]; then export gpu_select=$(nvidia-smi --format=csv --query-gpu=uuid 2> /dev/null | sed -n 2p) fi fi # NVIDIA Params -export nvidia_pci_address="$(nvidia-smi --format=csv --query-gpu=pci.bus_id --id="${gpu_select}" 2> /dev/null | sed -n 2p | cut -d ':' -f2,3)" -export nvidia_gpu_name=$(nvidia-smi --format=csv --query-gpu=name --id="${gpu_select}" 2> /dev/null | sed -n 2p) +export nvidia_pci_address="$(nvidia-smi --format=csv --query-gpu=pci.bus_id --id="${gpu_select:?}" 2> /dev/null | sed -n 2p | cut -d ':' -f2,3)" +export nvidia_gpu_name=$(nvidia-smi --format=csv --query-gpu=name --id="${gpu_select:?}" 2> /dev/null | sed -n 2p) export nvidia_host_driver_version="$(nvidia-smi 2> /dev/null | grep NVIDIA-SMI | cut -d ' ' -f3)" # Intel params @@ -27,24 +27,24 @@ export amd_cpu_model="$(lscpu | grep 'Model name:' | grep -i amd | cut -d':' -f2 export amd_gpu_model="$(lspci | grep -i vga | grep -i amd)" function download_driver { - mkdir -p ${USER_HOME}/Downloads - chown -R ${USER} ${USER_HOME}/Downloads + mkdir -p "${USER_HOME:?}/Downloads" + chown -R ${USER:?} "${USER_HOME:?}/Downloads" - if [[ ! -f "${USER_HOME}/Downloads/NVIDIA_${nvidia_host_driver_version}.run" ]]; then - echo "Downloading driver v${nvidia_host_driver_version}" + if [[ ! -f "${USER_HOME:?}/Downloads/NVIDIA_${nvidia_host_driver_version:?}.run" ]]; then + echo "Downloading driver v${nvidia_host_driver_version:?}" wget -q --show-progress --progress=bar:force:noscroll \ -O /tmp/NVIDIA.run \ - http://download.nvidia.com/XFree86/Linux-x86_64/${nvidia_host_driver_version}/NVIDIA-Linux-x86_64-${nvidia_host_driver_version}.run + "http://download.nvidia.com/XFree86/Linux-x86_64/${nvidia_host_driver_version:?}/NVIDIA-Linux-x86_64-${nvidia_host_driver_version:?}.run" [[ $? -gt 0 ]] && echo "Error downloading driver. Exit!" && return 1 - mv /tmp/NVIDIA.run ${USER_HOME}/Downloads/NVIDIA_${nvidia_host_driver_version}.run + mv /tmp/NVIDIA.run "${USER_HOME:?}/Downloads/NVIDIA_${nvidia_host_driver_version:?}.run" fi } function install_nvidia_driver { # Check here if the currently installed version matches using nvidia-settings nvidia_settings_version=$(nvidia-settings --version 2> /dev/null | grep version | cut -d ' ' -f 4) - [[ "${nvidia_settings_version}x" == "${nvidia_host_driver_version}x" ]] && return 0; + [ "${nvidia_settings_version:-}X" == "${nvidia_host_driver_version:-}X" ] && return 0; # Download the driver (if it does not yet exist locally) download_driver @@ -60,9 +60,9 @@ function install_nvidia_driver { # fi if (($(echo $nvidia_host_driver_version | cut -d '.' -f 1) > 500)); then - echo "Installing NVIDIA driver v${nvidia_host_driver_version} to match what is running on the host" - chmod +x ${USER_HOME}/Downloads/NVIDIA_${nvidia_host_driver_version}.run - ${USER_HOME}/Downloads/NVIDIA_${nvidia_host_driver_version}.run \ + echo "Installing NVIDIA driver v${nvidia_host_driver_version:?} to match what is running on the host" + chmod +x "${USER_HOME:?}/Downloads/NVIDIA_${nvidia_host_driver_version:?}.run" + "${USER_HOME:?}/Downloads/NVIDIA_${nvidia_host_driver_version:?}.run" \ --silent \ --accept-license \ --skip-depmod \ @@ -79,11 +79,11 @@ function install_nvidia_driver { --no-check-for-alternate-installs \ --no-libglx-indirect \ --no-install-libglvnd \ - > ${USER_HOME}/Downloads/nvidia_gpu_install.log 2>&1 + > "${USER_HOME:?}/Downloads/nvidia_gpu_install.log" 2>&1 else - echo "Installing Legacy NVIDIA driver v${nvidia_host_driver_version} to match what is running on the host" - chmod +x ${USER_HOME}/Downloads/NVIDIA_${nvidia_host_driver_version}.run - ${USER_HOME}/Downloads/NVIDIA_${nvidia_host_driver_version}.run \ + echo "Installing Legacy NVIDIA driver v${nvidia_host_driver_version:?} to match what is running on the host" + chmod +x "${USER_HOME:?}/Downloads/NVIDIA_${nvidia_host_driver_version:?}.run" + "${USER_HOME:?}/Downloads/NVIDIA_${nvidia_host_driver_version:?}.run" \ --silent \ --accept-license \ --skip-depmod \ @@ -100,7 +100,39 @@ function install_nvidia_driver { --no-check-for-alternate-installs \ --no-libglx-indirect \ --no-install-libglvnd \ - > ${USER_HOME}/Downloads/nvidia_gpu_install.log 2>&1 + > "${USER_HOME:?}/Downloads/nvidia_gpu_install.log" 2>&1 + fi + # REF: https://github.com/keylase/nvidia-patch#docker-support + if [ "${NVIDIA_PATCH_VERSION:-}X" != "X" ]; then + echo "Patch NVIDIA Driver" + + echo " - Fetch NVIDIA NVENC patch" + wget -q --show-progress --progress=bar:force:noscroll \ + -O /usr/local/bin/patch.sh \ + "https://raw.githubusercontent.com/keylase/nvidia-patch/${NVIDIA_PATCH_VERSION:?}/patch.sh" + echo " - Fetch NVIDIA NvFBC patch" + wget -q --show-progress --progress=bar:force:noscroll \ + -O /usr/local/bin/patch-fbc.sh \ + "https://raw.githubusercontent.com/keylase/nvidia-patch/${NVIDIA_PATCH_VERSION:?}/patch-fbc.sh" + chmod +x \ + /usr/local/bin/patch.sh \ + /usr/local/bin/patch-fbc.sh + + echo " - Install Patches" + echo "/patched-lib" > /etc/ld.so.conf.d/000-patched-lib.conf + mkdir -p "/patched-lib" + PATCH_OUTPUT_DIR="/patched-lib" /usr/local/bin/patch.sh + PATCH_OUTPUT_DIR="/patched-lib" /usr/local/bin/patch-fbc.sh + + pushd "/patched-lib" &> /dev/null || { echo "Error: Failed to push directory to /patched-lib"; exit 1; } + for f in * ; do + suffix="${f##*.so}" + name="$(basename "$f" "$suffix")" + [ -h "$name" ] || ln -sf "$f" "$name" + [ -h "$name" ] || ln -sf "$f" "$name.1" + done + ldconfig + popd &> /dev/null || { echo "Error: Failed to pop directory out of /patched-lib"; exit 1; } fi } @@ -143,28 +175,28 @@ function install_intel_gpu_driver { } # Intel Arc GPU or Intel CPU with possible iGPU -if [[ ! -z ${intel_gpu_model} ]]; then - echo "**** Found Intel device '${intel_gpu_model}' ****"; +if [ "${intel_gpu_model:-}X" != "X" ]; then + echo "**** Found Intel device '${intel_gpu_model:?}' ****" install_intel_gpu_driver -elif [[ ! -z ${intel_cpu_model} ]]; then - echo "**** Found Intel device '${intel_cpu_model}' ****"; +elif [ "${intel_cpu_model:-}X" != "X" ]; then + echo "**** Found Intel device '${intel_cpu_model:?}' ****" install_intel_gpu_driver else - echo "**** No Intel device found ****"; + echo "**** No Intel device found ****" fi # AMD GPU -if [[ ! -z ${amd_gpu_model} ]]; then - echo "**** Found AMD device '${amd_gpu_model}' ****"; +if [ "${amd_gpu_model:-}X" != "X" ]; then + echo "**** Found AMD device '${amd_gpu_model:?}' ****" install_amd_gpu_driver else - echo "**** No AMD device found ****"; + echo "**** No AMD device found ****" fi # NVIDIA GPU -if [[ ! -z ${nvidia_pci_address} ]]; then - echo "**** Found NVIDIA device '${nvidia_gpu_name}' ****"; +if [ "${nvidia_pci_address:-}X" != "X" ]; then + echo "**** Found NVIDIA device '${nvidia_gpu_name:?}' ****" install_nvidia_driver else - echo "**** No NVIDIA device found ****"; + echo "**** No NVIDIA device found ****" fi echo "DONE"