Code: Select all
#!/bin/bash
# Build of Nvidia video driver, cleaning and compressing to xzm module for Porteus
# You can use this script for both architectures i586 or x86_64
# Version 2019-07-18
# Written by Blaze <admin at ublaze.ru>
# Modified by fulalas <your email at zipmail.com.br>
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# Root check
if [ `whoami` != "root" ]; then
echo -e "\e[1m\e[31mOnly root can run this.\e[0m"
exit 1
fi
# Creating installer variable and folder
MODULES_FOLDER=$(readlink -f /mnt/live/porteus/modules)
INSTALL_TEMP_FOLDER=/tmp/nvidia-$$
mkdir $INSTALL_TEMP_FOLDER
# Checking and extracting blacklist.xzm
if [ -f blacklist.xzm ]; then
xzm2dir blacklist.xzm $INSTALL_TEMP_FOLDER &>/dev/null
elif [ -f "$PORTDIR/optional/blacklist.xzm" ]; then
xzm2dir "$PORTDIR/optional/blacklist.xzm" $INSTALL_TEMP_FOLDER &>/dev/null
elif [ -f "$PORTDIR/base/blacklist.xzm" ]; then
xzm2dir "$PORTDIR/base/blacklist.xzm" $INSTALL_TEMP_FOLDER &>/dev/null
else
echo -e "\e[1m\e[31mblacklist.xzm couldn't be found.\e[0m"
rm -rf $INSTALL_TEMP_FOLDER
exit 1
fi
# Selective compression and extraction of memory changes
sync; echo 3 > /proc/sys/vm/drop_caches
echo -e '\n\033[1m\e[32m[*]\e[0m\033[1m Compression of memory changes to /tmp/nvidia.tar.gz...\033[0m'
tar czf /tmp/nvidia.tar.gz --exclude={"*/.*","*/.wh.*",".cache","dev","home","mnt","opt","root","run","tmp","var","etc/bootcmd.cfg","etc/ld.so.cache","etc/fstab","etc/random-seed","etc/cups","etc/udev","etc/profile.d","etc/porteus","etc/X11/xorg.conf.nvidia-xconfig-original","lib/firmware","lib/modules/*porteus/modules.*","usr/man","usr/src","usr/bin/gnome-keyring-daemon","usr/lib/gio","usr/lib/gtk-2.0","usr/lib/gtk-3.0","usr/lib/libXvMCgallium.so.1","usr/lib/libbrscandec2.so.1","usr/lib/libgsm.so.1","usr/lib/libudev.so.1","usr/lib/libunrar.so.5","usr/lib64/gio","usr/lib64/gtk-2.0","usr/lib64/gtk-3.0","usr/lib64/libXvMCgallium.so.1","usr/lib64/libbrscandec2.so.1","usr/lib64/libgsm.so.1","usr/lib64/libudev.so.1","usr/lib64/libunrar.so.5","usr/local","usr/share/glib-2.0","usr/share/mime","usr/share/pixmaps","usr/share/applications/mimeinfo.cache","usr/local/share/applications/mimeinfo.cache","usr/share/doc/NVIDIA_GLX-1.0/html","usr/share/doc/NVIDIA_GLX-1.0/sample","usr/share/doc/NVIDIA_GLX-1.0/LICENSE","usr/share/doc/NVIDIA_GLX-1.0/NVIDIA_Changelog","usr/share/doc/NVIDIA_GLX-1.0/README.txt"} -C /mnt/live/memory changes
echo -e "\n\033[1m\e[32m[*]\e[0m\033[1m Extraction of memory changes from /tmp/nvidia.tar.gz to $INSTALL_TEMP_FOLDER...\033[0m"
tar xf /tmp/nvidia.tar.gz --strip 1 -C $INSTALL_TEMP_FOLDER
# Сleaning driver
echo -e "\n\033[1m\e[32m[*]\e[0m\033[1m Cleaning of driver directory...\033[0m"
rm -rf $INSTALL_TEMP_FOLDER/{.cache,dev,home,mnt,opt,root,run,tmp,var}
find $INSTALL_TEMP_FOLDER -type f -maxdepth 1 -delete
find $INSTALL_TEMP_FOLDER -type l -maxdepth 1 -delete
find $INSTALL_TEMP_FOLDER/etc/ -type f -maxdepth 1 -delete
find $INSTALL_TEMP_FOLDER/etc/ -type d ! -iname 'modprobe.d' ! -iname 'OpenCL' ! -iname 'vulkan' ! -iname 'X11' ! -iname 'etc' -maxdepth 1 -exec rm -rf '{}' '+'
rm -f $INSTALL_TEMP_FOLDER/etc/X11/xorg.conf.nvidia-xconfig-original
rm -rf $INSTALL_TEMP_FOLDER/lib/firmware
rm -f $INSTALL_TEMP_FOLDER/lib/modules/*porteus/modules.*
rm -rf $INSTALL_TEMP_FOLDER/usr/{man,src}
rm -f $INSTALL_TEMP_FOLDER/usr/bin/gnome-keyring-daemon
rm -rf $INSTALL_TEMP_FOLDER/usr/lib/{gio,gtk-2.0,gtk-3.0}
rm -f $INSTALL_TEMP_FOLDER/usr/lib/{libXvMCgallium.so.1,libbrscandec2.so.1,libgsm.so.1,libudev.so.1,libunrar.so.5}
rm -rf $INSTALL_TEMP_FOLDER/usr/lib64/{gio,gtk-2.0,gtk-3.0}
rm -f $INSTALL_TEMP_FOLDER/usr/lib64/{libXvMCgallium.so.1,libbrscandec2.so.1,libgsm.so.1,libudev.so.1,libunrar.so.5}
rm -rf $INSTALL_TEMP_FOLDER/usr/local
rm -rf $INSTALL_TEMP_FOLDER/usr/share/{glib-2.0,mime,pixmaps}
rm -f $INSTALL_TEMP_FOLDER/usr/{,local/}share/applications/mimeinfo.cache
rm -rf $INSTALL_TEMP_FOLDER/usr/share/doc/NVIDIA_GLX-1.0/{html,sample,LICENSE,NVIDIA_Changelog,README.txt}
ls -la
# Adding vdpau hardware video decode rule
if [ -f vdpau.sh ]; then
mkdir -p $INSTALL_TEMP_FOLDER/etc/profile.d
cp vdpau.sh $INSTALL_TEMP_FOLDER/etc/profile.d
else
echo -e "\n\e[1m\e[31mvdpau.sh couldn't be found. Hardware video decode won't work properly.\e[0m"
fi
# Getting driver version
case $(arch) in
i486) LIBDIR="/usr/lib"
;;
x86_64) LIBDIR="/usr/lib64"
;;
*) LIBDIRSUFFIX="/usr/lib"
;;
esac
DRIVER_FILE=$(find $LIBDIR/libEGL_nvidia.so* \! -type l)
DRIVER_VERSION=${DRIVER_FILE: -6}
# Creating final module
MODULE_FILENAME=08-nvidia-$DRIVER_VERSION-k.$(uname -r)-$(cat /etc/porteus-version | cut -d '-' -f2)-$(arch).xzm
dir2xzm $INSTALL_TEMP_FOLDER/ /tmp/$MODULE_FILENAME 2>/dev/null
mv /tmp/$MODULE_FILENAME $MODULES_FOLDER
# Removing temporary files
rm -f /tmp/nvidia.tar.gz
rm -f /tmp/nvidia.xzm
rm -rf $INSTALL_TEMP_FOLDER
# Reboot
echo -e "\n\e[1m\e[32m[DONE]\e[0m \e[1mYou can find your Nvidia driver module in \e[96m$MODULES_FOLDER\e[0m"
echo -e "\e[1m>>> Now you can reboot Porteus via \e[92mreboot\e[0m \e[1mcommand <<<\e[0m\n"
1- we don't need .run file anymore. I'm getting the driver version from the actual driver file;
3- I'm not removing blacklist.xzm because I don't like the idea of removing a file that the installer doesn't create;
4- minor changes that I can't remember; please check if you approve everything;
: I finally understood why $MODDIR and $PORTDIR variables can't be found on my machine. It turns out that this won't work if you call a script like this:
I don't know why, but it seems some variables aren't exported if you don't call this before:
: I found a workaround. The script above was updated.