Add a way to install Nvidia libraries offline

NVIDIA_HANDLER now has two installation modes. 

In the first (default) mode Conty downloads the driver from the official Nvidia website and installs it inside the container. In the new second mode Conty simply copies Nvidia libraries from the host system.

If the first mode fails for some reason (for example, there is no internet connection), Conty automatically tries the second mode. It is possible to force Conty to always use the second mode by using NVIDIA_HANDLER=2 variable.
This commit is contained in:
Kron4ek 2024-11-22 03:29:45 +03:00 committed by GitHub
parent 861fce5406
commit ee864e1ed8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -22,7 +22,7 @@ if (( EUID == 0 )) && [ -z "$ALLOW_ROOT" ]; then
fi fi
# Conty version # Conty version
script_version="1.26.3" script_version="1.27"
# Important variables to manually adjust after modification! # Important variables to manually adjust after modification!
# Needed to avoid problems with mounting due to an incorrect offset. # Needed to avoid problems with mounting due to an incorrect offset.
@ -188,11 +188,19 @@ Environment variables:
directory from there. directory from there.
NVIDIA_HANDLER Fixes issues with graphical applications on Nvidia NVIDIA_HANDLER Fixes issues with graphical applications on Nvidia
GPUs with the proprietary driver. Enable this only GPUs with the proprietary driver. At least 2 GB of
if you are using an Nvidia GPU, the proprietary free disk space is required for this function.
driver and encountering issues running graphical This function is enabled by default on systems with
applications. At least 2 GB of free disk space is an Nvidia GPU.
required. This function is enabled by default. Available modes:
1. In this mode Conty downloads the
driver from the official Nvidia website and
installs it inside the container.
2. In this mode Conty copies Nvidia libraries from
the host system into the container.
The default is 1 if there is an internet
connection and the Nvidia website is accessible,
otherwise the default is 2.
USE_SYS_UTILS Tells the script to use squashfuse/dwarfs and bwrap USE_SYS_UTILS Tells the script to use squashfuse/dwarfs and bwrap
installed on the system instead of the builtin ones. installed on the system instead of the builtin ones.
@ -227,9 +235,6 @@ arguments, to remove add a minus sign (-) before their names.
To remove: ${script_name} -u -pkgname1 -pkgname2 -pkgname3 ... To remove: ${script_name} -u -pkgname1 -pkgname2 -pkgname3 ...
In this case Conty will update all packages and additionally install In this case Conty will update all packages and additionally install
and/or remove specified packages. and/or remove specified packages.
If you are using an Nvidia GPU, please read the following:
https://github.com/Kron4ek/Conty#known-issues
" "
if [ -n "${CUSTOM_MNT}" ] && [ -d "${CUSTOM_MNT}" ]; then if [ -n "${CUSTOM_MNT}" ] && [ -d "${CUSTOM_MNT}" ]; then
@ -420,6 +425,7 @@ nvidia_driver_handler () {
cp /usr/lib32/tls/libnvidia-tls.so.* /usr/lib32 &>/dev/null cp /usr/lib32/tls/libnvidia-tls.so.* /usr/lib32 &>/dev/null
echo "${nvidia_driver_version}" > "${nvidia_drivers_dir}"/current-nvidia-version echo "${nvidia_driver_version}" > "${nvidia_drivers_dir}"/current-nvidia-version
echo "The driver installed successfully" echo "The driver installed successfully"
nvidia_install_success=1
else else
echo "Failed to install the driver" echo "Failed to install the driver"
fi fi
@ -430,6 +436,10 @@ nvidia_driver_handler () {
echo "Failed to download the driver" echo "Failed to download the driver"
fi fi
if [ "${nvidia_install_success}" != 1 ]; then
rm -f "${nvidia_drivers_dir}"/current-nvidia-version
fi
cd "${OLD_PWD}" cd "${OLD_PWD}"
} }
@ -772,7 +782,7 @@ run_bwrap () {
mount_opt=(--bind-try /opt /opt) mount_opt=(--bind-try /opt /opt)
fi fi
if ([ "${NVIDIA_HANDLER}" = 1 ] || [ "${USE_OVERLAYFS}" = 1 ]) && \ if ([ "${NVIDIA_HANDLER}" -ge 1 ] || [ "${USE_OVERLAYFS}" = 1 ]) && \
[ "$(ls "${overlayfs_dir}"/merged 2>/dev/null)" ]; then [ "$(ls "${overlayfs_dir}"/merged 2>/dev/null)" ]; then
newroot_path="${overlayfs_dir}"/merged newroot_path="${overlayfs_dir}"/merged
else else
@ -1116,7 +1126,7 @@ if [ "$(ls "${mount_point}" 2>/dev/null)" ] || launch_wrapper "${mount_command[@
exit exit
fi fi
if [ "${NVIDIA_HANDLER}" = 1 ]; then if [ "${NVIDIA_HANDLER}" -ge 1 ]; then
if [ -f /sys/module/nvidia/version ]; then if [ -f /sys/module/nvidia/version ]; then
unset NVIDIA_SHARED unset NVIDIA_SHARED
@ -1168,11 +1178,78 @@ if [ "$(ls "${mount_point}" 2>/dev/null)" ] || launch_wrapper "${mount_command[@
mkdir -p "${nvidia_drivers_dir}" mkdir -p "${nvidia_drivers_dir}"
echo > "${nvidia_drivers_dir}"/lock echo > "${nvidia_drivers_dir}"/lock
if [ "${NVIDIA_HANDLER}" = 1 ]; then
export nvidia_driver_version export nvidia_driver_version
export -f nvidia_driver_handler export -f nvidia_driver_handler
DISABLE_NET=0 QUIET_MODE=1 RW_ROOT=1 run_bwrap --tmpfs /tmp --tmpfs /var --tmpfs /run \ DISABLE_NET=0 QUIET_MODE=1 RW_ROOT=1 run_bwrap --tmpfs /tmp --tmpfs /var --tmpfs /run \
--bind "${nvidia_drivers_dir}" "${nvidia_drivers_dir}" \ --bind "${nvidia_drivers_dir}" "${nvidia_drivers_dir}" \
bash -c nvidia_driver_handler bash -c nvidia_driver_handler
fi
if [ "${NVIDIA_HANDLER}" = 2 ] || [ ! -f "${nvidia_drivers_dir}"/current-nvidia-version ]; then
if [ -f "${nvidia_drivers_dir}"/host_nvidia_libs ]; then
for f in $(cat "${nvidia_drivers_dir}"/host_nvidia_libs); do
libname="$(basename "${f}")"
rm -f "${overlayfs_dir}"/merged/usr/lib/"${libname}" \
"${overlayfs_dir}"/merged/usr/lib32/"${libname}"
done
fi
rm -f "${nvidia_drivers_dir}"/host_nvidia_libs \
"${nvidia_drivers_dir}"/host_libs
ldconfig -p > "${nvidia_drivers_dir}"/host_libs
if [ -s "${nvidia_drivers_dir}"/host_libs ]; then
grep -Ei "nvidia|libcuda" "${nvidia_drivers_dir}"/host_libs | cut -d ">" -f 2 >> "${nvidia_drivers_dir}"/host_nvidia_libs
if [ -s "${nvidia_drivers_dir}"/host_nvidia_libs ]; then
echo "Copying Nvidia libraries from the host system, please wait..."
for f in $(grep "libnv" "${nvidia_drivers_dir}"/host_libs | cut -d ">" -f 2); do
if strings "${f}" | grep -qi -m 1 "nvidia" &>/dev/null; then
echo "${f}" >> "${nvidia_drivers_dir}"/host_nvidia_libs
fi
done
for f in $(cat "${nvidia_drivers_dir}"/host_nvidia_libs); do
libname="$(basename "${f}")"
if file "$(readlink -f "${f}")" | grep "32-bit" &>/dev/null; then
cp -L "${f}" "${overlayfs_dir}"/merged/usr/lib32/"${libname}"
else
cp -L "${f}" "${overlayfs_dir}"/merged/usr/lib/"${libname}"
fi
done
nvidia_other_files="/usr/share/vulkan/icd.d/nvidia_icd.json \
/usr/share/vulkan/implicit_layer.d/nvidia_layers.json \
/usr/lib/nvidia/wine/nvngx.dll \
/usr/lib/nvidia/wine/_nvngx.dll \
/usr/share/egl/egl_external_platform.d/20_nvidia_xcb.json \
/usr/share/glvnd/egl_vendor.d/10_nvidia.json \
/usr/share/nvidia/nvidia-application-profiles-${nvidia_driver_version}-rc"
for f in ${nvidia_other_files}; do
filedir="$(dirname "${f}")"
if [ -f "${f}" ]; then
filepath="${f}"
else
filepath="$(find /usr /run /nix -name "$(basename "${f}")" -type f -print -quit 2>/dev/null)"
fi
if [ -f "${filepath}" ]; then
mkdir -p "${overlayfs_dir}"/merged/"${filedir}"
cp -L "${filepath}" "${overlayfs_dir}"/merged/"${filedir}" &>/dev/null
cp -L "$(dirname "${filepath}")"/*nvidia* "${overlayfs_dir}"/merged/"${filedir}" &>/dev/null
fi
done
echo "${nvidia_driver_version}" > "${nvidia_drivers_dir}"/current-nvidia-version
fi
fi
fi
rm -f "${nvidia_drivers_dir}"/lock rm -f "${nvidia_drivers_dir}"/lock
fi fi