Ok, a slight rewrite of @sean6541 script in bash.
Create a dataset for the script and run it from there. Set it to run POSTINIT
and you should be good. I removed the other mount commands because those are symlinks.
This version also fixes an issue where the original script would mount multiple lib files.
mount|grep libnvidia
pool/data/scripts on /usr/lib/x86_64-linux-gnu/libnvidia-encode.so.550.127.05 type zfs (rw,relatime,xattr,nfs4acl,casesensitive)
pool/data/scripts on /usr/lib/x86_64-linux-gnu/libnvidia-encode.so.550.127.05 type zfs (rw,relatime,xattr,nfs4acl,casesensitive)
pool/data/scripts on /usr/lib/x86_64-linux-gnu/libnvidia-encode.so.550.127.05 type zfs (rw,relatime,xattr,nfs4acl,casesensitive)
pool/data/scripts on /usr/lib/x86_64-linux-gnu/libnvidia-encode.so.550.127.05 type zfs (rw,relatime,xattr,nfs4acl,casesensitive)
Script:
#!/bin/bash
set -x
PATCH_DIR="$PWD"
KEYLASE_GH="https://raw.githubusercontent.com/keylase/nvidia-patch/refs/heads/master/patch.sh"
KEYLASE_SCRIPT="$PATCH_DIR/patch.sh"
# Download latest keylase script
wget -O $KEYLASE_SCRIPT $KEYLASE_GH && \
# Update backup_path
sed -i -r "s,^backup_path=.*,backup_path=\"$PATCH_DIR/libnvidia-encode-backup\",g" "$KEYLASE_SCRIPT" && \
# Add output path if it doesn't exist
[[ ! -f $PATCH_DIR/patched-lib ]] && mkdir -p "$PATCH_DIR/patched-lib"
# Patch libs
PATCH_OUTPUT_DIR="$PATCH_DIR/patched-lib" bash "$KEYLASE_SCRIPT" && \
# Get current mounted nvidia libs
NV_MOUNTED_LIBS=`awk '/libnvidia/ { print $2 }' < /proc/mounts`
cd "$PATCH_DIR/patched-lib" && \
# Mount patched libs
for file in * ; do
suffix="${file##*.so}"
name="$(basename "$file" "$suffix")"
# Check if old libraries are mounted
# and unmount if so, else continue
# mounting.
if [[ ! -z $NV_MOUNTED_LIBS ]]; then
i=0
for NV_LIB in ${NV_MOUNTED_LIBS[$i]} ; do
((i++))
umount $NV_LIB
NV_LIB_BASE=`basename $NV_LIB`
mount --bind "$NV_LIB_BASE" "$NV_LIB"
done
else
mount --bind "$file" "/usr/lib/x86_64-linux-gnu/$file"
fi
done && \
# Link libs
ldconfig
Output:
./ts-nvidia-patch.sh
+ PATCH_DIR=/mnt/pool/data/scripts/nvidia
+ KEYLASE_GH=https://raw.githubusercontent.com/keylase/nvidia-patch/refs/heads/master/patch.sh
+ KEYLASE_SCRIPT=/mnt/pool/data/scripts/nvidia/patch.sh
+ wget -O /mnt/pool/data/scripts/nvidia/patch.sh https://raw.githubusercontent.com/keylase/nvidia-patch/refs/heads/master/patch.sh
--2025-01-29 19:31:23-- https://raw.githubusercontent.com/keylase/nvidia-patch/refs/heads/master/patch.sh
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.109.133, 185.199.108.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 28264 (28K) [text/plain]
Saving to: ‘/mnt/pool/data/scripts/nvidia/patch.sh’
/mnt/pool/data/scripts/nvidia/patch 100%[================================================================>] 27.60K --.-KB/s in 0.003s
2025-01-29 19:31:23 (8.90 MB/s) - ‘/mnt/pool/data/scripts/nvidia/patch.sh’ saved [28264/28264]
+ sed -i -r 's,^backup_path=.*,backup_path="/mnt/pool/data/scripts/nvidia/libnvidia-encode-backup",g' /mnt/pool/data/scripts/nvidia/patch.sh
+ [[ ! -f /mnt/pool/data/scripts/nvidia/patched-lib ]]
+ mkdir -p /mnt/pool/data/scripts/nvidia/patched-lib
+ PATCH_OUTPUT_DIR=/mnt/pool/data/scripts/nvidia/patched-lib
+ bash /mnt/pool/data/scripts/nvidia/patch.sh
Detected nvidia driver version: 550.127.05
libnvidia-encode.so
Backup exists and driver file differ from backup. Skipping patch.
++ cat /proc/mounts
++ grep libnvidia
++ awk '{print($2)}'
+ NV_MOUNTED_LIBS='/usr/lib/x86_64-linux-gnu/libnvidia-encode.so.550.127.05
/usr/lib/x86_64-linux-gnu/libnvidia-encode.so.550.127.05
/mnt/pool/data/scripts/nvidia/patched-lib/libnvidia-encode.so.550.127.05'
+ cd /mnt/pool/data/scripts/nvidia/patched-lib
+ for file in *
+ suffix=.550.127.05
++ basename libnvidia-encode.so.550.127.05 .550.127.05
+ name=libnvidia-encode.so
+ [[ ! -z /usr/lib/x86_64-linux-gnu/libnvidia-encode.so.550.127.05
/usr/lib/x86_64-linux-gnu/libnvidia-encode.so.550.127.05
/mnt/pool/data/scripts/nvidia/patched-lib/libnvidia-encode.so.550.127.05 ]]
+ for NV_LIB in ${NV_MOUNTED_LIBS[@]}
+ umount /usr/lib/x86_64-linux-gnu/libnvidia-encode.so.550.127.05
++ basename /usr/lib/x86_64-linux-gnu/libnvidia-encode.so.550.127.05
+ NV_LIB_BASE=libnvidia-encode.so.550.127.05
+ mount --bind libnvidia-encode.so.550.127.05 /usr/lib/x86_64-linux-gnu/libnvidia-encode.so.550.127.05
+ ldconfig
Mount output:
mount|grep libnvidia
pool/data/scripts on /usr/lib/x86_64-linux-gnu/libnvidia-encode.so.550.127.05 type zfs (rw,relatime,xattr,nfs4acl,casesensitive)
Files output:
ll /usr/lib/x86_64-linux-gnu/libnvidia-encode*
lrwxrwxrwx 1 root root 21 Jan 27 23:19 /usr/lib/x86_64-linux-gnu/libnvidia-encode.so -> libnvidia-encode.so.1
lrwxrwxrwx 1 root root 30 Jan 27 23:19 /usr/lib/x86_64-linux-gnu/libnvidia-encode.so.1 -> libnvidia-encode.so.550.127.05
-rw-r--r-- 1 root root 271K Jan 29 16:09 /usr/lib/x86_64-linux-gnu/libnvidia-encode.so.550.127.05