Redmi G 2021锐龙版双系统环境工程记录
AMD Yes!
新电脑 Redmi G 2021 Ryzen7 版装双系统 (win11 + ubuntu 18.04 LTS)过程中遇到了一些问题,以后如果要换设备大概率还得再来一遍,本篇权当记录。不过说实话,从本篇字数来看,应该算得上一篇正规post而不是snippet了。这确实也与snippet板块的设置理念相悖,不过可能我就是那么啰嗦吧。PS:本文与AMD yes没有任何关系。
FLANN找不到
使用flann
库时,在CMakeLists
中是需要find_package
操作的,但flann
如何找?
首先如果我们一波:
1 | git clone <flann仓库地址,这里不写,随便找都能找到> |
安装flann
库,虽然flann
会被成功安装到/usr/local/include
下(如果没有指定安装路径就会到这个地方),但其.cmake
配置文件对CMake而言是不可见的,首先(1)make install
没有自己复制.cmake
文件,并且(2)locate
也是没能找到.cmake
文件(不知道为什么)
最后的解决方案有两个:
- 可以在
flann
库下的cmake
文件夹下找到FindFlann.cmake
,将其复制到cmake
对应的配置文件夹下:
1 | /usr/share/cmake-3.10/Modules/ |
这个做法很魔法,并且要手动改系统文件(需要管理员权限那种),但一劳永逸。
- 如果有ros(对,我有),那么pcl库中自带
flann
只需要指定pcl导入flann
即可(CMake配置)
1 | find_package(PCL REQUIRED COMPONENTS kdtree) |
LZ4冲突
服气。lz4在ROS
melodic中有一份实现(lz4.h)相关,在pcl
库中又有一份实现(存在/usr/include/flann
下)。首先如果CMake要能找到
lz4,就需要使用pkg-config
:
1 | find_package(PkgConfig REQUIRED) |
如果没有pkg-config
,可以使用apt install
进行安装。
发生冲突确实可以使用某个Github
issue中提到的方案解决,但是这个方案涉及到修改/usr/include
下的头文件,非常不优雅。个人在寒假前遇到过这个问题,当时貌似解决了,但没有记录下来,现在也回忆不起来,只能等回到学校后查看学校电脑了。
Nvidia!!!
英伟达真折磨到我了。之前我在[Nvidia 简单环境工程]中提到如何安装显卡驱动,但事实证明这份教程博客非常不完全。
- 我在实验室另一台RTX 3060上安装时遇到了无法安装CUDA
11.3的情况,可能是GPU与对应的460+
driver不适配(我忘了是不是460+了,由于CUDA 11.4对应470.95,个人猜测CUDA
11.3没到470,我也不想花时间去考证)
- 不能安装11.3确实有些不方便,英伟达的apex(某个auto mixed
precision库)需要CUDA与pytorch版本对上... 但我11.4 +
torch(cu113)真就不行,所以一直想卸了11.4装11.3 但都失败,表现在
安装11.3之后
电脑重启会黑屏,卡在登录界面,无论使用recovery还是直接启动都不行,并且在recovery的root权限命令行中使用
nvidia-smi
可能卡爆电脑。
- 不能安装11.3确实有些不方便,英伟达的apex(某个auto mixed
precision库)需要CUDA与pytorch版本对上... 但我11.4 +
torch(cu113)真就不行,所以一直想卸了11.4装11.3 但都失败,表现在
安装11.3之后
电脑重启会黑屏,卡在登录界面,无论使用recovery还是直接启动都不行,并且在recovery的root权限命令行中使用
- RTX 3060(for laptop computer)甚至都不能安装CUDA
11.4,表现类似也是黑屏,但是
nvidia-smi
在recovery root console中正常- 使用博客中的
sudo apt-get --purge remove nvidia-*
并不能完全删除英伟达驱动(之前都是可以的)。执行命令导致0 package to add\delete\update
,等于没动,原因不明 - 无论怎么删,
nvidia-smi
都阴魂不散,但如果这样卸载然后安装别的版本CUDA,又不会提示说电脑中已经有一个现有的英伟达驱动而冲突了。
- 使用博客中的
最后一直删不掉,其他指令都无效了,只能重装系统,一天半的工作白干。
这里值得一提的是:
根本不应该用sudo apt-get --purge remove
以及sudo apt autoremove
这么暴力而且危险的方式来卸载显卡驱动。
英伟达已经写好了:
- 使用
nvdia-uninstall
命令可以直接干净卸载(之前我不知道这个) - 使用
/usr/local/cuda-x
下的脚本cuda-uninstaller.sh
可以方便地卸载CUDA
这两个命令运行起来几乎没有破坏性,在经历了11.3\11.4的失败之后,11.4中我直接用上述命令卸载并重装11.6,干净又卫生。
OpenCV新坑
OpenCV还是我的必装库。但安装opencv对我来说已经是一件很久没做过的事情了,难免忘掉很多细节。
首先准备好
opencv_contrib
,里面还是有很多值得安装的拓展内容的准备好opencv需要安装的一些库:这部分可以参考 [raulqf/Install_OpenCV4_CUDA11_CUDNN8.md] 这个Gist。没有这些库是过不了cmake的
libEGL.so
消失问题:
The imported target "QT5::Gui" references the file "/usr/lib/x86_64-linux-gnu/libEGL.so" but this file does not exist.
很奇怪的一个问题,libEGL.so
是可以被locate到的,在ubuntu的文件property中可以看到(直接用GUI查看property),libEGL.so
要么是不存在,要么指向了一个不存在的so.x
文件(此文件不是真正的静态库,只是一个软链接),这里提醒一下设置软链接的方式,这么久了都忘了:
1 | sudo ln -s <source name> <target name> |
此处我们只需要首先locate libEGL.so
,发现有很多.so.1.0
以及.so.1.0.0
之类的文件,或者一些类似的,不在/usr/lib/x86_64-linux-gnu/
下的文件,都是可以拿来使用的。创建好对应的软链接,命名为libEGL.so
(以及libGL.so
因为这个文件也存在相同问题)放在上述目录下即可。
- oracle-java 编译opencv
java版:我用不到,但是它硬要我这样干。只能下载openjdk。
openjdk-default
默认版本(当前)11.0.13,但是opencv傻乎乎地要求我安装11.0.4,并且要求我安装oracle-java11-installer-local
- 但很不幸,openjdk与oracle-java版本对不上,
oracle-java11-installer-local
不能正常安装,系统需要我把对应11.0.4oracle-java11-installer-local
的deb包放到/var/cache/oracle-java11-installer-local
下 - 我照做的,无误,但是系统就是不认账,一直认为我没有这么做,叔叔我啊,真的要生气了
- 一怒之下想绕开
oracle-java11-installer-local
的安装,但是系统不允许,告诉我:
- 但很不幸,openjdk与oracle-java版本对不上,
1 | 1 not fully installed or removed. |
这个问题是:装到一半由于一些问题而没装好的包,使得新的dpkg请求没办法完成。那么如何取消这样的 not fully installed or removed 的安装进程呢?
1 | sudo dpkg --force-depends --purge oracle-java11-installer-local |
对于本问题的
oracle-java11-installer-local
,这样即可。
RTW89-8852AE
额。刚买回电脑来的第三天(开始装ubuntu),装完发现不能联网,十分恶心(显示 No WiFi Adapter Found)。由于win11可以正常联网,网卡硬件端肯定没有问题,推测没有网卡驱动,再一查解决方案后成功解决... 不过在这里,我并不能省略 “一查” 的过程,因为有些命令我是不清楚用法的:
1 | lspci # 用于显示当前主机的所有PCI总线信息 |
执行结束后出了一大堆信息,其中有用的就只有:
1 | 02:00.0 Network controller: Realtek Semiconductor Co., Ltd. Device 8852 |
Ethernet controller一般都是有线网络网卡。实际上有用的就是这一条命令,但搞清楚 就是这一条有用 的过程还是很曲折的。其中还遇到这么一些指令:
1 | sudo lshw -class network |
输出如下:
1 | *-network |
隐去了一些重要信息。在没有安装8852对应的网卡驱动前,第一项(第一个*-network
,每一项表示一个网络控制设备)显示的是
unmanaged。此外还有一个命令(多了我也没记住):
1 | iwconfig |
这是什么?常用的是ifconfig
,区别主要在于:
iwconfig is similar to ifconfig, but is dedicated to wireless networking interfaces.[1]
好,那么在lspci
之后,我已经知道了Realtek
8852网络控制器这个型号,接下来就是查找网卡驱动了,此处忽略google的过程,找到了Github库:[Github:
lwfinger/rtw89],直接编译安装就可以使用!
但是在安装前一定要注意,Redmi G 2021 默认是打开了secure boot的(我一开始还被蒙在鼓里),secure boot的情况一定要按照repo中README的指示安装,否则就会不成功。我直接取消了secure boot,直接安装成功。
Reference
[1] Debian/iwconfig