Latest Linux Distributions on LattePanda and Kernel Customization
前言 Preface
原创文章,转载引用请务必注明链接,水平有限,如有疏漏,欢迎指正。从此以后,尽量使用双语,英语水平有限,贻笑大方,万事开头难。
有时候买到心仪的东西,特别盼着早点到货,然后隔一会就去打开手机客户端刷新一下查看快递信息,时间久了浪费生命,所以想着用电脑帮我查,有变动告诉我。
软硬件环境:
LattePanda、Python3.8、Arduino 18.12、Lubuntu 20.04。
本项目将分为三个部分:
- Latest Linux Distributions on LattePanda and Kernel Customization | 为LattePanda安装Ubuntu 20.04并重新编译优化内核
- Core Code to Track the Packages | 包裹监视追踪项目的核心代码
- Additional Features like Tracking People with Wifi Using Kismet | 额外功能例如识别人在旁边时的智能化动作
本项目预计实现以下功能Features:
- 网页前端添加待监视信息
- 查询的所有快递历史记录
- 自定义查询频率
- 快递信息变动时微信通知
- 人在家中时额外LED、Speaker、Dashboard等提醒
本项目后期准备添加以下功能TODO:
-
使用微信等添加待监视快递信息,或者小程序
-
添加中文语音播报
-
整合进Home Assisant Dashboard
最后可以了解到的知识包括:
- Install and setup latest Ubuntu for LattePanda | 在LattePanda上安装配置最新版Ubuntu
- Interaction between MPU and MCU on LattePanda with Firmata protocol | LattePanda上Linux和Arduino使用Firmata协议进行交互
- Python GUI Programming with remi | Python图形化编程(使用remi)
- Usage of TinyDB——a lightweight database 破折号还是逗号?| 介绍轻量级数据库TinyDB的使用
- Wechat notification via ServerChan | 使用Server酱实现微信通知功能
- Tracking people with wifi using kismet | 使用Kismet识别人是否在旁边
- Using Kismet REST-like API | 使用Kismet的API
- Text To Speech with Python | 语音合成播报
- Home Assistant | HA的一些整合与应用
本文为第一部分。看到社区的活动,觉得很有趣,加上有个Intel 和 DFRobot合办的活动,需要Intel CPU,我的是AMD CPU,也没有神经开发棒,然后拿出LattePanda(以下称胖哒) 作为可行性验证。基板准备用LattePanda v1,系统准备转成Linux,方便开发。安装Linux的过程中发现一些问题,本文分享相关经验。另外LattePanda Alpha / Delta 相关架构类似,一些内容也有参考价值。
1. 准备
为什么要使用Linux | Why do we prefer to use Linux
Linux可定制化更高,用来开发更熟悉。
选择Ubuntu还是Mint | Ubuntu or Mint: which one to choose?
Mint 最新版基于Ubuntu 18.04,pass。但不喜欢Ubuntu的Unity桌面,加上LattePanda性能捉襟见肘,所以我们选择使用比较轻量级的LXQt桌面(之前是LXDE,使用Qt重写)的Lubuntu,基于openbox,能看到遗留。感兴趣的也可以看看来自TW的LXQt开发者洪任諭醫師的一些介绍:一、二。
1.1 现状
通过网上冲浪可知,目前关于在LattePanda上运行Linux有以下信息:
- Linux Ubuntu 16.04 LTS | 官方团队提供的安装镜像
- OpenSUSE Leap 15.0 | J.S. Evans 的教程
- lattepanda-mainline-4.11 | TW的MOP提供的安装较新内核的方法
Caution:
-
官方文档写着
Official Supported Version: S70CR200 Version
,但实际我的S70CR110
也是可用。 -
mop讲的设置bios里的南桥相关,新版ubuntu里无需设置。
以上三个都有一个共同的特点:OUTDATED。我们需要更好的软硬件兼容性以及主流的Linux版本和内核支持。当然,从以上还是能获得一些有价值的信息,也就是我们需要解决的问题。
1.2 面临的问题
- rtl8723bs wifi & bluetooth driver
- HDMI audio output issue
- Goodix touch panel dirver
- PWM? 这个我暂时不知道啥问题
1.3 探索
为啥LattePanda有上述问题要解决呢,主要和胖哒采用的Intel Atom x5 z8350 CPU有关,其规格如下:
Intel Atom x5 z8350, (Code Name: Cherry Tail, Original Target: Lightweight tablets / High-end Smartphones. Microarchitectures: Airmont——the 14 nm die shrink of Silvermont, more info, Via), remember that there is no avx instruction set supported, therefore, recompile is need to run newer version of Tensorflow.
- Intel CPU 系列介绍,Atom x5-z8350规格和性能 | Japanese
原来z8350设计用于Windows平板以及手机,并没有考虑Linux兼容性,所以有很多问题,特别是驱动上,总结起来有以下:
- 无线和蓝牙功能:使用RTL8723BS模块,SDIO接口,2.4GHz 802.11bgn,bt4.0,RealTek官网仅提供了Windows驱动
- 触摸屏:使用Goodix gt911 方案
甚至默认最大仅支持2GB内存,不过国内魔改支持4GB,但是据说内存带宽也减半。
在Linux Kernel 4.12之前,需要手动安装RTL8723BS模块的驱动,但是Since Linux 4.12, rtl8723bs has been merged
,这就很像早几年在树莓派上使用小米随身wifi(mt7601u芯片),最初需要自己编译安装驱动,后来也合并到内核里开箱即用了,可以看到mop的内核还是4.11。
Caution:
- LattePanda Delta 采用的Intel Celeron N4100同样不支持avx指令集,所以想要运行新版的Tensorflow,需要自行编译。参考《Tensorflow-Intel-Atom-CPU》
采用z8350的设备有很多,比如Lenovo Miix 310 和Chuwi Hi10 Pro,其中联想的miix310属于笔记本,更接近胖哒的使用情景。
参考链接:
- intel-atom-iso | 重要参考
- Fix-Intel-Z8350-for-ubuntu-kubuntu
- miix310 | 重要参考
- tuxblet
- lubuntu_in_chuwi_Hi10Pro
- linux-on-hi10
1.4 发现
字里行间我们发现两个东西:Ian Morrison's isorespin.sh
和kernel_gcc_patch
。
1.4.1 isorespin.sh
简而言之,就是使用Intel Bay Trail 和 Cherry Trail处理器的设备安装Linux会遇到一些兼容性问题,特别是HDMI输出、系统假死以及无线驱动,Linux 4.11 解决了HDMI音频输出和系统假死的问题,4.12解决了无线驱动的问题。而Ian Morrison(Linuxium)则更进一步,开发了isorespin.sh
这个工具,可以制作适合上述CPU的带有Linux Mainline内核的新版Ubuntu ISO安装镜像。另外Ian也是 cnx-software网站的作者之一。——Via
我们使用该脚本来定制化Linux系统,而且作者有做好的最新系统镜像可供下载。目前支持自定义64bit Ubuntu、Ubuntu Flavoured、LinuxMint等等。
该脚本针对Intel Atom处理器做了如下改进:
- Add a GRUB 32-bit bootloader to allow ISOs to boot on the many Intel Atom devices limited by their BIOS.
- Add functionality to boot ISOs on any Intel Apollo device regardless of the BIOS settings.
- Upgrade the kernel to the latest mainline version or to a specific version to benefit from recent patch functionality e.g. for audio and wifi/bluetooth or to use a rolling (HWE) kernel.
- Add (or remove) repositories, software packages, scripts and files to allow the installation of firmware and favourite programs.
- Preseed or perform set-up commands and scripts and also change system defaults and kernel boot parameters.
- Add persistence so that the ISO can retain data, installed software packages and settings across reboots.
- Create a server ISO that works on both 32-bit and 64-bit bootloaders found on various low cost Intel Atom mini PCs or one that works on the more recent Apollo and Gemini Lake mini PCs..
--atom include the flags, packages, scripts and commands that I recommend when respinning an ISO for a device with an Intel Atom (Bay Trail or Cherry Trail) processor and mirrors the manual invocations of '-l rtl8723bX_4.12.0_amd64.deb -f linuxium-install-UCM-files.sh -f wrapper-linuxium-install-UCM-files.sh -f linuxium-install-broadcom-drivers.sh -f wrapper-linuxium-install-broadcom-drivers.sh -c wrapper-linuxium-install-UCM-files.sh -c wrapper-linuxium-install-broadcom-drivers.sh'.
关于HWE内核可以参考《为 Ubuntu LTS 安装 HWE 以获取更新的内核与图形支持》。
遇着宝了,似乎我们的问题都可以一揽子解决,是否真的可以高枕无忧呢?这里下载Lunbutu 20.04 LTS Atom。
1.4.2 kernel_gcc_patch
项目主页 | Kernel patch enables gcc optimizations for additional CPUs.
由于Atom x5-8350和Celeron N4100相对性能比较低,操作系统默认会使用generic
内核,着眼于兼容性普适性,就是安装好之后大多数的硬件都可以运行起来。所以我们可以针对性地重新编译内核,以期获得更高的性能。另外本项目也支持Celeron N4100 (Intel Goldmont Plus family of low-power Atom processors——Gemini Lake)。
注意这里是我理解错了,generic是实时性方面的东西,具体见参考链接所述
2. 整活
2.1 Install Lubuntu Customized for Cherry Trail CPU
制作安装U盘
- 我用
balenaEtcher
将作者ISO安装镜像烧录到U盘上,插上制作好的U盘(不支持从mSD卡启动),开机按ESC
或者Del
进入到bios,更改boot设置即可,忘记看是不是 默认U盘启动顺序最高了,大家可以试试。 - 可以从清华镜像站下载原版镜像以供定制。
硬盘分区
- esp分区 | 必须要有,100MB就行,flag: boot
- root分区,xfs文件系统,反正ext4不是emmc的最优解,后续还要改改默认调度模式
- swap,根据内存大小,2-4G选择1:1即可。我这里4G。
插电!启动!
我是插HDMI连接显示器,不是用的MIPI接口的显示屏(以下称IGD, 内置图形显示),然后显示器上只有壁纸没有图标和任务栏,原来主输出跑到没连接的IGD上了。这整的真的是。。。盲开终端,然后输入sudo poweroff
先关上机,然后插上显示屏和触控面板,发现触控面板没反应。
2.2 Post-Installation Setup
好的,目前需要测试上面提到的问题以及解决HDMI输出和触控面板的问题。先插上专用IPS屏,设置HDMI为主输出,然后安装OpenSSH,我们通过MobaXterm连接到LP,具体可以参考我的文章《忘掉VNC/RDP,拿起手中的MobaXterm轻松上手远程桌面》。
选择
Openbox desktop
是图形界面,默认的LXQt目前MobaXterm不支持,仅支持LXDE。选择
Interactive shell
是传统终端界面
安装必要的软件:
sudo apt install openssh-server tmux
2.2.1 测试无线、蓝牙、音频输出功能
我们下载的是作者为atom处理器制作的镜像,根据isorespin.sh
使用介绍:
--atom include the flags, packages, scripts and commands that I recommend when respinning an ISO for a device with an Intel Atom (Bay Trail or Cherry Trail) processor and mirrors the manual invocations of '-l rtl8723bX_4.12.0_amd64.deb -f linuxium-install-UCM-files.sh -f wrapper-linuxium-install-UCM-files.sh -f linuxium-install-broadcom-drivers.sh -f wrapper-linuxium-install-broadcom-drivers.sh -c wrapper-linuxium-install-UCM-files.sh -c wrapper-linuxium-install-broadcom-drivers.sh'.
也就是安装了rtl8723bs的无线蓝牙固件,注意有些是系统带驱动driver但是不带正确的固件firmware,也不能正确使用。增加了音频输出的UCM文件。
我们来测试一下:
蓝牙部分使用bluetoothctl,参考https://wiki.archlinux.org/index.php/Bluetooth#Console,成功连上了我的手机
无线部分可以用iwconfig
、iw list
等命令,可以看到该无线网卡支持``monitor模式,为我们下面使用kismet进行无线嗅探提供了硬件基础,关于无线网卡的介绍可以参考我的文章:UP Board USB无线网卡选购指南。
连接无线网络 CLI
了解一番发现使用的是networkmanager,图形化很好弄,CLI的话就是nmcli:
$ nmcli device status
DEVICE TYPE STATE CONNECTION
wlx001f1fa92b87 wifi connected nww
wlan0 wifi disconnected --
$ nmcli device wifi list ifname wlan0
$ sudo nmcli device wifi connect nww password PASSWORD ifname wlan0
以上命令即可,注意改成你的无线网络名称SSID和密码。具体可以参考nm操作指南。
声音输出的话,LXQt桌面自带的任务栏右下角调节widget支持不好,使用的是pavucontrol进行控制,图形菜单栏里也有,实测HDMI音频输出和3.5mm都正常。
其他相关命令:
dmesg | grep XXX
lsmod | grep XXX
lshw
lsusb
lspci
2.2.2 默认输出设置为HDMI
这个很头疼,我是先用专用屏上去连无线网安装ssh server后从SSH里面暂时用。虽然进入桌面后手动更改主/副输出后,可以正常使用,但是重启还是一个样,所以干脆关闭IGD输出。
查看How to Disable Internal Display from BIOS?,官方说的BIOS->"Chipset"->"North Bridge"->"IGD - LCD Control"->"Force Lid Status"->"Off"
没用,最后参考k3dAR的回帖解决: add kernel parameter: video=DSI-1:d
怎么做到的呢?查看archwiki的Kernel parameters页面:
sudo nano /etc/default/grub
# 在GRUB_CMDLINE_LINUX_DEFAULT这行处”前添加video=DSI-1:d
# 例如GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=cb38daad-4618-4b36-98de-1915abb168cf video=DSI-1:d"
# 重新生成grub.cfg文件
sudo grub-mkconfig -o /boot/grub/grub.cfg
# TODO:使用sed进行更改
重启生效,想要启用IGD,步骤同上,删除添加的那句话。如果我们想要生成默认关闭IGD的镜像,参考isorespin.sh的介绍,添加grub内容,生成iso镜像参数为isorespin.sh -i xxx.iso --atom -g "video=DSI-1:d"
2.2.3 解决触控面板驱动问题
安装之后主要功能正常,但是触摸屏不行,以为是我没插好,试了好几次都一样,使用xinput list
命令没看到,使用dmesg | grep Goodix
可以看到识别了一个设备,但是没有正确驱动;进系统使用lsmod goodix
也有加载,怀疑是驱动不正确问题。
可以看到触控面板主控芯片为Goodix GT911
dmesg | grep goodix # 能识别到设备,但是有报错
lsmod # 我不记得输出什么样的,大家可以自己瞅瞅
xinput list # 识别不到Goodix Capacitive TouchScreen
参考以下内容,可以发现Goodix驱动确实存在问题。而且在Linux内核里能看到GT911相关内容,很困惑。
- Beta Ubuntu Image for LattePanda - Official version
- Goodix Touchscreen and Stylus share device
- Showing posts sorted by relevance for query goodix
放狗一搜,找到了这个:Goodix Touchscreen Linux Driver,实测可用。
# 编译驱动
git clone https://gitlab.com/AdyaAdya/goodix-touchscreen-linux-driver
cd goodix-touchscreen-linux-driver
make
# 测试驱动(删除原驱动并加载刚编译的驱动),我这里成功
sudo su
rmmod goodix
insmod goodix.ko
# 安装驱动
xz goodix.ko
mv goodix.ko.xz /lib/modules/$(uname -r)/kernel/drivers/input/touchscreen/goodix.ko.xz
重启之后可用。
完整的debug命令:
$ dmesg | grep -i goodix
$ cat /proc/bus/input/devices | grep -B 1 -A 8 -i goodix
# libinput list-devices | grep -A 17 -i goodix
# libinput debug-events
$ xinput list
2.3 Recompile kernel to increase performance | 重新编译内核(待优化)
前文说过针对Atom X5 z8350重新编译内核,可以些许提高性能,现在就来实际操作一番。
sjqlwy@LattePanda:~$ uname -a
Linux LattePanda 5.6.8 #1 SMP Sat May 2 23:36:54 CST 2020 x86_64 x86_64 x86_64 GNU/Linux
sjqlwy@LattePanda:~$ cat /proc/version
Linux version 5.6.8 (sjqlwy@LattePanda) (gcc version 9.3.0 (Ubuntu 9.3.0-10ubuntu2)) #1 SMP Sat May 2 23:36:54 CST 2020
这是我在LattePanda上为它自己编译的内核,不带genetic字样。编译花了一个多小时?建议在其他性能更强的电脑上进行编译。
2.3.1 下载源码并打上补丁
打开Linux Kernel网站可以看到最新的Stable版是5.6.x,下载下来备用。建议阅读Linux内核版本介绍与查询。Ubuntu自带的内核讲究一个通用性,所以我们使用patch来针对z8350重新编译内核,以期获得更好的性能。好在已经有人做了,并且进行了日常维护,移步:kernel_gcc_patch。
CPU Family | GCC Optimization |
---|---|
Intel Silvermont family of low-power Atom processors | -march=silvermont |
Intel Goldmont family of low-power Atom processors (Apollo Lake and Denverton) | -march=goldmont |
Intel Goldmont Plus family of low-power Atom processors (Gemini Lake) | -march=goldmont-plus |
教程使用silvermont,怎么没看到我们需要的Cherry Trail ,这些代码都是啥意思?查找Intel Atom的相关Wiki,了解到如下内容。
- Cherry Trail、Apollo Lake、Gemini Lake等是Code Name开发代号
- Silvermont、Goldmont、Airmont等是CPU微架构
- 微架构下又有子集,例如Airmont是Silvermont的子集,Goldmont Plus是的子集
- Goldmont Plus——Gemini Lake——Celeron N4100(Mobile processors)
- Airmont——Cherry Trail ——Atom X5 z8350(consumer SoCs aimed at tablets)
- Airmont is the 14 nm die shrink of Silvermont(22 nm)
2.3.2 编译内核
这里我们下载
enable_additional_cpu_optimizations_for_gcc_v9.1+_kernel_v5.5+.patch
(5.6)放到Linux源码所在文件夹里。This patch works with gcc versions 9.1+ and with kernel version 5.5+ and should
NOT be applied when compiling on older versions of gcc due to key name changes
of the march flags introduced with the version 4.9 release of gcc如果使用Ubuntu 20.04则编译环境gcc版本、kernel版本都满足,否则需要进行设置
patch -p1 < PATCH_NAME.patch 会报错
sudo apt-get install gcc make libncurses5-dev libssl-dev bison flex libelf-dev
patch -Np1 -i /path/to/patch
make menuconfig
此时在 "Processor type and features -> Processor family"中可以选择 "Intel Silvermont family of low-power Atom processors (Silvermont)"了。
make -j4 bindeb-pkg # 编译内核,根据机器性能大约需要20m-2h不等
sudo dpkg -i linux*.deb # 安装编译好的内核,会自动设置grub
重启即可看到已经启用了新的内核。
参考:
2.3.3 番外1 升级gcc
上面讲到使用该补丁需要gcc 9.1以上,但是我在我的其他机器上(Ubuntu 18.04 LTS)可以看到默认安装的是gcc 7.5,这将导致安装失败。
ubuntu@VM-126-41-ubuntu:~$ gcc --version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
尝试过ubuntu-make,backports源等方法后,参考如何在 Ubuntu 18.04 LTS 系统中安装多版本 GCC 编译器的PPA源方法,完美。
你正在运行 Debian稳定版 因为你更偏好选择 Debian 稳定版分支。它运行得很好,但是只有一个问题:与其他发行版相比,它的软件有一点过时了。这便是 backports 出现的原因。
root@build-server:~# gcc --version
gcc (Ubuntu 9.3.0-11ubuntu0~18.04.1) 9.3.0
# Ubuntu 20.04 不存在该问题
sjqlwy@LattePanda:~$ gcc --version
gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0
2.3.4 番外2 阻止apt更改内核
我们运行apt upgrade时会提醒你安装generic内核,我们使用apt-mark命令来阻止这一行为。
apt list --installed
dpkg-query -l # 输出更清晰
apt-mark hold <pkg> # 将<pkg>改为apt upgrade里提示的所有内核相关的包
apt-mark unhold <pkg>
apt-mark showhold
参考:
2.3.5 docker 支持
参考DIY NAS Project (2) Docker and ownCloud以及上文Miix 310的设置来配置内核编译参数
2.3.6 TODO
- 参考Compiling your own kernel using isorespin.sh,使用Ubuntu的内核源码和补丁,整合我们的性能补丁
- 更改默认IO调度,增加文件系统支持,提高emmc性能和寿命
3. 总结
最终我们比较完美地在LattePanda上安装了Lunbutu 20.04,解决了BT/Wifi/Audio Output/Touch Panel以及IGD的问题,并使用优化内核提高了LP的性能,后续有时间的话可以自己定制适合LP的ISO镜像,包括:
- 默认关闭内置输出,采用HDMI输出信号
- 优化过的内核,支持Docker,更好的性能
- 预装触摸屏驱动
- 更改io调度和添加更多文件系统支持
- 预装SSH Server
4、Reference | 参考
-
RTL8723BS Wifi and BT firmware package for Ubuntu mainline v4.12 kernels | sudo systemctl start rtl8723bsbt.service
-
--debug
| 显示更多信息--interactive
| 进入root shell,自定义更改。例如修改mirrorlist--dist-upgrade
| 更彻底的升级,可以配合--debug使用
-
Why choose a low latency kernel over a generic or realtime one?
- If you do not require low latency for your system then please use the -generic kernel.
- If you need a low latency system (e.g. for recording audio) then please use the -preempt kernel as a first choice. This reduces latency but doesn't sacrifice power saving features. It is available only for 64 bit systems (also called amd64).
- If the -preempt kernel does not provide enough low latency for your needs (or you have an 32 bit system) then you should try the -lowlatency kernel.
- If the -lowlatency kernel isn't enough then you should try the -rt kernel
- If the -rt kernel isn't enough stable for you then you should try the -realtime kernel
- -generic——>preempt——>lowlatency——>rt——>realtime,越往后延迟越低,耗电越高
-
Latest improvements to isorespin.sh | rclone copy GDrive:rclone/ ~/downloads
-
Adding and deleting kernel boot parameters with isorespin.sh | 重要