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
2
3
4
git clone <flann仓库地址,这里不写,随便找都能找到>
cd flann/; mkdir build; cd build/
cmake ..; make -j
sudo make install

​ 安装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
2
find_package(PkgConfig REQUIRED)
pkg_check_modules(LZ4 REQUIRED liblz4)

​ 如果没有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可能卡爆电脑。
  • 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.4 oracle-java11-installer-local的deb包放到/var/cache/oracle-java11-installer-local
    • 我照做的,无误,但是系统就是不认账,一直认为我没有这么做,叔叔我啊,真的要生气了
    • 一怒之下想绕开oracle-java11-installer-local的安装,但是系统不允许,告诉我:
1
2
3
1 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
E: Internal Error, No file name for oracle-java11-installer-local:amd64

​ 这个问题是:装到一半由于一些问题而没装好的包,使得新的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
2
02:00.0 Network controller: Realtek Semiconductor Co., Ltd. Device 8852
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)

​ Ethernet controller一般都是有线网络网卡。实际上有用的就是这一条命令,但搞清楚 就是这一条有用 的过程还是很曲折的。其中还遇到这么一些指令:

1
sudo lshw -class network

​ 输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
*-network                 
description: Wireless interface
product: Realtek Semiconductor Co., Ltd.
vendor: Realtek Semiconductor Co., Ltd.
physical id: 0
bus info: pci@0000:02:00.0
logical name: wlp2s0
version: 00
serial: <xxxxxxxxxxxxxxxxxxxx>
width: 64 bits
clock: 33MHz
capabilities: pm msi pciexpress bus_master cap_list ethernet physical wireless
configuration: broadcast=yes driver=rtw89_pci driverversion=5.4.0-100-generic firmware=N/A ip=<xxxxxxxxxxxxxxxxxxxx> latency=0 link=yes multicast=yes wireless=IEEE 802.11
resources: irq:85 ioport:3000(size=256) memory:d1800000-d18fffff
*-network
description: Ethernet interface
product: RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
vendor: Realtek Semiconductor Co., Ltd.
physical id: 0
bus info: pci@0000:03:00.0
logical name: eno1
version: 15
serial: <xxxxxxxxxxxxxxxxxxxx>
capacity: 1Gbit/s
width: 64 bits
clock: 33MHz
capabilities: pm msi pciexpress msix bus_master cap_list ethernet physical tp mii 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
configuration: autonegotiation=on broadcast=yes driver=r8169 firmware=rtl8168h-2_0.0.2 02/26/15 latency=0 link=no multicast=yes port=MII
resources: irq:24 ioport:2000(size=256) memory:<xxxxxxxxxxxxxxxxxxxx> memory:<xxxxxxxxxxxxxxxxxxxx>

​ 隐去了一些重要信息。在没有安装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