跟琪露诺一起配置ubuntu的开发环境
有任何问题可以联系作者hcgzfs@163.com
很多同学第一次在ubuntu系统安装显卡驱动的时候总会碰到各种问题:循环重启、开机黑屏,最后只能重装系统。因此,我写了这个连琪露诺都能看懂的教程,在讲解安装显卡驱动的同时,我会顺便把别的难安装的东西也给大家讲解一下,顺便讲一些有用的知识,随手给个收藏吧。
目录
显卡驱动
卸载
首先我们要卸载旧的驱动,清理干净的标志是,输入以下代码
sudo dpkg --list | grep nvidia-*
没有任何输出
一般来说我们可以用这些命令来卸载
sudo /usr/bin/nvidia-uninstall
sudo apt-get --purge remove nvidia-\* # 有的不需要加-\
sudo apt-get purge nvidia-\* # 有的不需要加-\
sudo apt-get purge libnvidia-\* # 有的不需要加-\
如果还有输出的话,就直接用
sudo apt-get --purge remove
把输出的那些东西删掉就行了。
禁用集显
一般来说,ubuntu在安装的时候会安装集显的驱动,但有可能会与独显的驱动冲突,因此我们把集显驱动禁用了。
打开配置文件
sudo gedit /etc/modprobe.d/blacklist.conf
在最后一行增加,并重启电脑。
blacklist nouveau
options nouveau modeset=0 #禁用nouveau第三方驱动
如果输入
lsmod | grep nouveau
没有输出的话,证明禁用成功。
安装显卡驱动
一般来说,安装显卡驱动有四种方法,二进制安装,编译安装,附加驱动安装和ppa安装,后两种方法我并不建议,所以这里只讲前两种。
二进制安装
首先查看一下自己需要安装哪个版本的驱动,这与你的系统版本与显卡型号密切相关,而后面要装的cuda等对显卡驱动的版本并不敏感。
使用
ubuntu-drivers devices
查看推荐的版本,我这里输出的是
可以看到我这里推荐 版本是525,因此一个简单的方法是直接
sudo apt-get install nvidia-driver-525
然后重启电脑,输入
nvidia-smi
有输出说明你成功了,恭喜你。
但是你可能会遇到循环登录或者直接卡死的情况,这种情况下你可以选择进入文本模式,方法是Ctrl+Alt+F1~F7,登录后卸载显卡驱动,使用编译安装来解决问题吧。
编译安装
首先下载驱动文件链接: 显卡驱动下载地址
在里面找到你需要的版本,不知道的要安装哪个版本的看上一节,具体哪个子版本看你自己的心情任选吧,你需要下载.run文件,可别下载错了,比如我下载的是NVIDIA-Linux-x86_64-525.78.01.run。
然后给下载的文件添加可执行权限
sudo chmod a+x NVIDIA-Linux-x86_64-525.78.01.run
进入文本模式,方法是Ctrl+Alt+F1~F7
sudo ./NVIDIA-Linux-x86_64-525.78.01.run
进行安装。
问你是否继续安装 选择comtimue installation
问你DKMS 选择YES
问你X Configuration 选择No
问你opengl 选择Yes 很多同学跟着一些教程在这里选No,这样的后果是你使用RVIZ这些东西的时候不会使用显卡进行加速,因此当你显示大规模点云的时候会非常非常卡,所以一定要选No。如果遇到循环重启直接卸载显卡驱动重装就行
然后重启电脑,之后输入nvidia-smi看是否有输出,并且去设置/详细信息/About里面看你的图形硬件是不是英伟达显卡
注意
某些教程会让你装gdm3或者lightdm。这两者都是显示管理器,直观的区别就是gdm3的登陆窗口在显示器正中间,而lightdm登录窗口在偏左边,正常使用没有区别。需要注意的是,如果你有控制多屏显示的需要,gdm3可能更适合你,使用lightdm设置多屏,可能会出现卡屏,死机,无法动弹情况。而且ubuntu自带gdm3,因此你根本没必要去装lightdm.
禁用内核更新
为了防止内核自动更新后显卡驱动失效,请禁用内核自动更新
sudo apt-mark hold linux-image-generic linux-headers-generic
安装CUDA
对于搞深度学习的同学来说,CUDA是必要的,因此在这里我一并说明安装方式。
首先我要说明的是,smi中的cuda版本是cuda的driver api版本,而我们安装的cuda一般是指cudatoolkit的版本,大家有时在安装pytorch的时候会发现,安装命令里面依旧有安装cudatoolkit的内容了,因此不装cuda运行gpu版本的pytorch也是可以的,但c++显卡编程以及tensorflow一般是依赖本机的cudatoolkit,因此这一步还是必要的。
首先,cudatoolkit的版本不能高于cuda的driver api版本即smi中的cuda版本,而且一般新版本会向下兼容,所以我建议读者尽量安装旧一点的版本,我的smi中cuda是12.0,综合考虑我打算安装11.3.0,下载地址在这里cuda地址。
下载完成后
sudo sh cuda_11.3.0_465.19.01_linux.run
accept后如下选择
在.bashrc文件中加入
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-11.3/lib64
export PATH=$PATH:/usr/local/cuda-11.3/bin
export CUDA_HOME=/usr/local/cuda-11.3
并且
source ~/.bashrc
以后卸载可以 run cuda-uninstaller in /usr/local/cuda-11.3/bin
验证安装成功
cd /usr/local/cuda/samples/1_Utilities/deviceQuery
sudo make
./deviceQuery
如图pass之后说明安装成功了
安装cudnn
cudnn是专为深度学习设计的显卡加速库,nn就是nurel networks的缩写吧。
下载地址在这里,自己注册一个账号就行。
嫌麻烦的话直接下deb安装包安装,当然也可以下tar然后用以下命令安装,说是安装,其实就是复制一下已经编译好的二进制库,
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include
sudo cp cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
验证安装成功
执行命令
sudo cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
实时内核安装显卡驱动
很多机械臂的控制频率是1000Hz,普通的ubuntu系统的控制频率远远跟不上,必须安装实时内核补丁才可以正常控制真实机械臂,安装实时内核补丁就不再赘述了,这里主要讲如何在实时内核里面安装显卡驱动。首先,确保你非实时内核里面的显卡驱动已经使用上文的方法安装成功(最好是编译安装)。
然后用下面这个脚本安装
#!/bin/bash
BUILD_BASE=`pwd`
NV_FILE="NVIDIA-Linux-x86_64-xxx.run" # 这里改成自己下载的.run文件名(之前安装过的)
#NV_URL="https://us.download.nvidia.cn/XFree86/Linux-x86_64/430.50/${NV_FILE}" # 之前已经下好了显卡驱动.run文件,就不用从网上下载了,直接注释掉,而且如果要下载的话,则慢
NEED_TO_COMPILE_NV_KO=1
function clean_env() {
[ -d ./${NV_DIR} ] && rm -rf ./${NV_DIR}
}
function check_env() {
# check if in rt kernel
uname -r | grep rt 1>/dev/null 2>&1
if [ $? -ne 0 ]
then
echo "Not in rt kernel, Please install apollo kernel and reboot machine first."
exit 2
fi
# check if nv ko already in kernel
if [ ! -f /lib/modules/`uname -r`/kernel/drivers/video/nvidia.ko ]
then
export NEED_TO_COMPILE_NV_KO=1
fi
}
function prepare_nv() {
## download nv install file from nvidia home page
#if [ ! -f ./${NV_FILE} ]
#then
# echo "Downloading ${NV_FILE} from nvidia website..."
# wget ${NV_URL} -O ${NV_FILE}
# if [ $? -ne 0 ]
# then
# echo "Downloading ${NV_FILE} failed, please check your network connection!"
# rm -rf ./${NV_FILE}
# exit 1
# fi
#fi
###########上面是下载驱动的代码,我们已经提前下载好了,就不需要这段代码了,直接注释掉############
# +x
chmod +x ./${NV_FILE}
echo "Extracting nvidia install run file..."
./${NV_FILE} -x 1>/dev/null 2>&1
NV_DIR="`echo ${NV_FILE} | awk -F '.run' '{print $1}'`"
NV_VERSION="`echo ${NV_FILE} | awk -F '-' '{print $4}' | awk -F '.run' '{print $1}'`"
export NV_DIR
export NV_VERSION
export NVIDIA_SOURCE="${NV_DIR}/kernel"
}
function install_lib() {
NV_LIB_OUTPUT_PATH="/usr/lib/x86_64-linux-gnu/"
NV_BIN_OUTPUT_PATH="/usr/bin/"
[ -f ./${NV_DIR}/libnvidia-ml.so.${NV_VERSION} ] && /bin/cp -f ./${NV_DIR}/libnvidia-ml.so.${NV_VERSION} ${NV_LIB_OUTPUT_PATH}
[ -f ./${NV_DIR}/libnvidia-fatbinaryloader.so.${NV_VERSION} ] && /bin/cp -f ./${NV_DIR}/libnvidia-fatbinaryloader.so.${NV_VERSION} ${NV_LIB_OUTPUT_PATH}
[ -f ./${NV_DIR}/libnvidia-ptxjitcompiler.so.${NV_VERSION} ] && /bin/cp -f ./${NV_DIR}/libnvidia-ptxjitcompiler.so.${NV_VERSION} ${NV_LIB_OUTPUT_PATH}
[ -f ./${NV_DIR}/libcuda.so.${NV_VERSION} ] && /bin/cp -f ./${NV_DIR}/libcuda.so.${NV_VERSION} ${NV_LIB_OUTPUT_PATH}
[ -f ./${NV_DIR}/nvidia-modprobe ] && /bin/cp -f ./${NV_DIR}/nvidia-modprobe ${NV_BIN_OUTPUT_PATH}
[ -f ./${NV_DIR}/nvidia-smi ] && /bin/cp -f ./${NV_DIR}/nvidia-smi ${NV_BIN_OUTPUT_PATH}
chmod +x /usr/bin/nvidia*
chmod +s /usr/bin/nvidia-modprobe
# link for nvidia
/bin/rm -rf /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so
/bin/ln -s /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.${NV_VERSION} /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1
/bin/ln -s /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so
/bin/rm -rf /usr/lib/x86_64-linux-gnu/libcuda.so /usr/lib/x86_64-linux-gnu/libcuda.so.1
/bin/ln -s /usr/lib/x86_64-linux-gnu/libcuda.so.${NV_VERSION} /usr/lib/x86_64-linux-gnu/libcuda.so.1
/bin/ln -s /usr/lib/x86_64-linux-gnu/libcuda.so.1 /usr/lib/x86_64-linux-gnu/libcuda.so
# take effect
/sbin/ldconfig 1>/dev/null 2>&1
}
function build_nv() {
if [ ${NEED_TO_COMPILE_NV_KO} == 0 ]
then
return
fi
NVIDIA_MOD_REL_PATH='kernel/drivers/video'
NVIDIA_OUTPUT_PATH="/lib/modules/`uname -r`/${NVIDIA_MOD_REL_PATH}"
CPUNUM=`cat /proc/cpuinfo | grep processor | wc | awk -F " " '{print $1}'`
export IGNORE_PREEMPT_RT_PRESENCE=true
cd ${NVIDIA_SOURCE} && make -j ${CPUNUM} module
cd ${BUILD_BASE}
unset IGNORE_PREEMPT_RT_PRESENCE
mkdir -p ${NVIDIA_OUTPUT_PATH}
[ -f ${NVIDIA_SOURCE}/nvidia.ko ] && cp ${NVIDIA_SOURCE}/nvidia.ko ${NVIDIA_OUTPUT_PATH}
[ -f ${NVIDIA_SOURCE}/nvidia-modeset.ko ] && cp ${NVIDIA_SOURCE}/nvidia-modeset.ko ${NVIDIA_OUTPUT_PATH}
[ -f ${NVIDIA_SOURCE}/nvidia-drm.ko ] && cp ${NVIDIA_SOURCE}/nvidia-drm.ko ${NVIDIA_OUTPUT_PATH}
[ -f ${NVIDIA_SOURCE}/nvidia-uvm.ko ] && cp ${NVIDIA_SOURCE}/nvidia-uvm.ko ${NVIDIA_OUTPUT_PATH}
depmod -a
}
# check environment
check_env
# prepare for nvidia
prepare_nv
# build nvidia.ko
build_nv
# install user lib
install_lib
# clean environment
clean_env
echo "Done to install nvidia kernel driver and user libraries."
然后添加可执行权限
chmod +x ./install_nvidia.sh
运行脚本:
sudo ./install_nvidia.sh
安装Anaconda
去anaconda官网下载.sh文件,直接下载最新版就行了,没必要可以去下载旧版。
bash ${name of file}.sh
跟着指示一路确认就行了,最后出现下图说明安装成功
这是再打开终端,会发现前面多了一个(base),并且输入python后出现的不是ubuntu自带的python版本,如下图说明安装成功。
最后,考虑到ros依赖的python版本是python2,会跟这里的python3冲突,因此读者可以在.bashrc中加一行
conda deactivate
这样就默认用系统自带的python2运行了,想进conda就
conda activate
常用conda命令
下面给出一些常用的conda命令
创建环境
conda create -n environment_name
创建指定python版本下包含某些包的环境
conda create -n environment_name python=3.7 numpy scipy
进入环境
conda activate environment_name
退出环境
conda deactivate
删除环境
conda remove -n yourname --all
列出环境
conda env list
复制环境
conda create --name new_env_name --clone old_env_name
指定目录下生成环境yml文件
conda env export > 目录/environment.yml
从yml文件创建环境
conda env create -n env_name -f environment.yml
安装包
conda instal package_name
查看当前环境包列表
conda list
查看指定环境包列表
conda list -n environment_name
查看conda源中包的信息
conda search package_name
更新包
conda update package_name
删除包
conda remove package_name
清理无用的安装包
conda clean -p
清理tar包
conda clean -t
清理所有安装包及cache
conda clean -y --all
更新anaconda
conda update annaconda
一个用anaconda创建环境的示例
conda activate
conda create -n start python=3.7
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cudatoolkit=11.1 -c pytorch -c conda-forge
这里安装了一个名为start的虚拟环境,并且安装了pytorch=1.8.0
安装pycharm与clion
Pycharm与Clion是相同的安装方法,我就只讲pycharm了
去{官网}(https://www.jetbrains.com/pycharm/download/other.html)下载pycharm,下最新的专业版就行,用学校的邮箱注册一个账号就可以啦,因为网上的盗版插件更新都很慢,只能用在旧版上,所以还是直接用正版的比较方便。
下载完之后直接解压即可,进入pycharm/bin文件夹,输入
./pycharm.sh
即可运行。
然后登录你的账号,去 设置/插件 里面下载一个中文插件,然后重启pycharm就可以用中文版了。
现在每次命令行启动太麻烦,我们直接点击 工具/创建桌面条目 就有pycharm图标了
当然Clion也同理,这里不再赘述
接下来用这段代码验证一下吧
# 验证gpu版本pytorch是否安装成功
import torch
print(torch.cuda.is_available())
# 验证能否使用gpu
print(torch.cuda.device_count())
# 查看gpu名称
print(torch.cuda.get_device_name(0))
中文输入框无法跟随
中文输入框无法跟随是因为jet开发ide前端用的java版本太过老旧导致的,我们可以通过编译一个高版本的java来解决这个问题。我这里已经编译好了一个jdk,下载 密码: hgcb 大家自取。直接解压,然后在pycharm.sh 中加一句话
再./pycharm.sh 运行发现报错,这是因为ubuntu的Glibc版本太低,我们直接编译安装一个高版本的即可
查看当前glibc版本,发现版本确实过低
ldd --version
下载glibc-2.29到指定目录,这里的所有命令都要sudo权限,不在赘述
cd /usr/local
wget http://ftp.gnu.org/gnu/glibc/glibc-2.29.tar.gz
解压并创建相应文件夹:
tar -zxf glibc-2.29.tar.gz
cd glibc-2.29
mkdir build
cd build/
sudo apt-get install gawk bison -y
../configure --prefix=/usr/local --disable-sanity-checks
(一般如果系统没有提示GNU的问题的话,直接运行这个就可以 ../configure --prefix=/usr/local,如果有提示GNU问题,
会弹出提示是否在命令中加入--disable-sanity-checks参数。)
安装:
make -j18
make install
软链接建立:
cp /usr/local/lib/libm-2.29.so /lib/x86_64-linux-gnu/
cd /lib/x86_64-linux-gnu
sudo ln -sf libm-2.29.so libm.so.6
如果关机重启之后发现pycharm又不能打开了,直接
cd /lib/x86_64-linux-gnu
sudo ln -sf libm-2.29.so libm.so.6
Clion同理
安装pcl1.12与vtk8.2
编者极度建议读者先安装,因为安装pycharm时修改了ubuntu系统的glibc版本,会让这一部分的编译安装不通过
首先需要指出的是,我们编程都是写的高级程序语言,而机器最高只能识别汇编,所以编译器会将我们的代码转换成机器能懂的代码。python是解释型语言,你点击运行的时候开始编译,编译完成才运行,这意味着你每一次运行都需要编译。c++就不同了,你可以将c++源码编译成可执行文件(windows中一般是.exe文件),然后./+${文件名}来运行,而clion和vs这些只不过不显式地体现这一过程。综上,python免去了编译的过程,因此运行过程及其依赖python解释器,而c++需要你写cmakelists来说明编译逻辑。这两种方法各有优劣,网上的各种争论甚嚣尘上,这里就不深入探讨了。
本节的重点在c++,所以我会尽量将所有过程涉及的源码与cmakelists全部放出来以供读者学习。
下载pcl1.12与vtk8.2,我还是用百度网盘共享。安装opencv4.5的操作与这两个的很类似,所以我就不单独写了,再写下去琪露诺要累死了。opencv密码: ggj9 pcl 密码: usv9 vtk 密码: 3fvq
由于pcl依赖vtk,opencv也依赖vtk,所以必须先安装vtk8.2将所有东西解压。
安装cmake-gui
sudo apt-get install cmake-gui
在解压后的vtk文件夹中
mkdir build
cd build
cmake-gui
如图设置
点击configure
再点击generate
关闭窗口
make -j18
sudo make install
pcl的安装方式跟这个是一样的,重点在cmake-gui中如何选择编译选项 大家可以选择的有GPU CUDA VTK等等选项,按需选取即可
这里可能出现缺vtk包,那是因为你在编译vtk的时候有些包没有选上,你重新选上那些包编译就行,记得勾选advanced,否则显示不全。