[置顶] 泰晓 RISC-V 实验箱,配套 30+ 讲嵌入式 Linux 系统开发公开课
[置顶] Linux Lab v1.4 升级部分内核到 v6.10,新增泰晓 RISC-V 实验箱支持,新增最小化内核配置支持大幅提升内核编译速度,在单终端内新增多窗口调试功能等Linux Lab 发布 v1.4 正式版,升级部分内核到 v6.10,新增泰晓实验箱支持
[置顶] 泰晓社区近日发布了一款儿童益智版 Linux 系统盘,集成了数十个教育类与益智游戏类开源软件国内首个儿童 Linux 系统来了,既可打字编程学习数理化,还能下棋研究数独提升智力
Linux Lab 正式进入 Linux 5.0 时代
已支持X86_64/pc, ARM/vexpress-A9, ARM64/virt, ARM/versatilepb, PPC/g3beige, MIPS/malta 开发板
By Falcon of TinyLab.org May 03, 2019
背景
最近有几个朋友都在写 5.0 内核的书,看了下内核源码,才发现已经到了 v5.0.10 了。
是时候为 5.0 内核增加 Linux Lab 支持,这些新书发布后,少不了相应的实验操作,Linux Lab 将提供大大地便利。
另外一方面,本站正计划陆续连载一系列专辑文章,也已经正式发起了 征稿活动 活动,接下来很多文章可能都直接基于 5.0 内核撰写,所以 Linux Lab 很迫切需要升级到 5.0。
选定开发板
当前 Linux Lab 已经支持 5 大平台:ARM、X86、MIPS、PowerPC、Csky,可以运行总共接近 10 款开发板。
目前已经完成了如下板子的升级工作:
- ARM 32
- vexpress-A9
- versatile-a9
- ARM 64
- virt
- X86_64
- pc
- PowerPC
- g3beige
- MIPS
- malta
升级过程介绍
升级过程非常简单,以上面选定的两款开发板为例。
更新 linux-stable 镜像
由于 mainline 的内核源的访问负载很大,下载速度很慢,我们在国内选一个最快的镜像:https://mirrors.tuna.tsinghua.edu.cn/git/linux-stable.git。
所以,第一步就是要把这个镜像同步到最新的 mainline linux-stable: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git,并同步到本地。
有两种方式可以完成同步:
- 在 Github 删除掉老镜像,直接新建一个 Import 最新的进来
- 在本地 fetch 最新的 mainline linux-stable 再以 mirror 的方式 push 到 Github
实际操作过程中,两者都不是很顺利,第一个中途出错了,导致很多 tags 没有同步完成甚至 Github 的该仓库页面都无法打开了,还得进行第二种方式。而第二种方式在直接以 git push --tags
和 git push --mirror
同步时都奇慢无比,于是想到一个方法,就是用 diff 比对 Github 和本地,找出缺失的 tags,一条一条 tag push。
Vexpress-A9 (ARM 32)
首先,在 boards/vexpress-a9/Makefile 中修改 LINUX 默认版本为最新的 v5.0.10。
同时基于 boards/vexpress-a9/linux_v4.6.7_defconfig 和 linux-stable/arch/arm/configs/vexpress_defconfig 创建一个新的 boards/vexpress-a9/linux_v5.0.10_defconfig。
接着,设置默认板子为 vexpress-a9:
make BOARD=vexpress-a9
之后,Checkout 出 v5.0.10 的内核:
make kernel-checkout
启用配置文件:
make kernel-defconfig
调整配置:
make kernel-menuconfig
开始编译:
make kernel
启动新内核:
make boot
保存配置文件:
make kernel-saveconfig
保存内核和 dtb:
make kernel-save
上述过程基本比较顺利,编译时缺少了 flex,在编译环境安装上即可。
而 dtb 编译时出现了 #include
语法错误,后面发现是最新内核的 scripts/Makefile.lib: cmd_dtc
编译指令加了 gcc 预处理,而把原来 dtc 编译器支持的 /include/
指令改成了 #include
,所以不能直接用 dtc 编译了,所以我们在 Linux Lab 中需要把 dtb 编译目标也改成了内核的 dtbs 目标,而不是自己调用 dtc 编译了。
Virt (ARM 64)
迁移过程基本同上,只是不太顺利,遇到了几个问题。
迁移过程主要是改动 boards/virt/Makefile 中的 LINUX 为 v5.0.10,并基于 boards/virt/linux_v4.5.5_defconfig 增加 boards/virt/linux_v5.0.10_defconfig。
迁移过程遇到了三类问题:
- 编译时弹出:“Restart config: GCC_PLUGINS”,需要手动配置
编译时遇到警告
arch/arm64/Makefile:40: LSE atomics not supported by binutils arch/arm64/Makefile:48: Detected assembler with broken .inst; disassembly will be unreliable
- 启动时直接死机,无任何输出
这三类问题的详细解决和分析过程见 “Linux 知识星球” 的最新文章:Linux Lab 新增 5.0.10 for ARM64/virt board & 启动死机问题 debugging 详解。本文从经验和毅力两方面介绍了 debugging 过程中需要面临的技术问题和克服的心理障碍,解决问题首先需要克服对未知疑难问题的惶恐心理,勇于挑战,不要逃避;其次才是不断学习,熟拈各类常用技术工具,从而不断积累解决问题的技术经验。
您可以在微信付费阅读或者直接加入 “Linux 知识星球” 长期和其他各企业一线同行一起学习交流,也可以联系我们进一步咨询:
PC (X86_64)
大体过程跟上面类似,只是这里之前一直用的是 i386,于是这里尝试了 x86_64。
所以,除了改动 LINUX 版本外,还需要同时修改 XARCH 和 CPU 为 X86_64。
而 Linux 的版本由于之前的 v4.6.7 是 i386 的,所以我们需要主要基于 linux-stable/arch/x86/configs/x86_64_defconfig 并借鉴 boards/pc/linux_v4.6.7_defconfig 来新增 boards/pc/linux_v5.0.10_defconfig。
另外,由于架构发生了变化,所以 BUILDROOT 借此机会直接升级到了 2019.02.2。
下面介绍中途碰到的几个问题。
编译问题
编译过程中出了三处错误,需要新增 libelf-dev, libssl-dev 和 gcc-8.0。前两个可以直接用 apt-get 安装,第三个需要 ppa,安装如下:
sudo -s add-apt-repository ppa:ubuntu-toolchain-r/test apt-get -y update apt-get install -y --force-yes --no-install-recommends gcc-8 update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 46
启动问题
用 linux-stable 下的 x86_64_defconfig 默认编译后,发现有个 regulatory.db 加载失败,检索后发现是缺失了一个包,在 buildroot 里头刚好找到了这个配置:
BR2_PACKAGE_WIRELESS_REGDB=y
既然这个是无线相关的驱动,我们在内核里头把无线支持屏蔽掉也可以:
# CONFIG_WIRELESS is not set
联网问题
发现默认的内核配置没有打开我们 Makefile 中使用的 ne2k_pci 这个网卡,新增配置即可:
CONFIG_NE2K_PCI=y
当然,也可以在 Makefile 中修改 NETDEV 为 e1000 等内核中已经支持的网卡。
其他平台和开发板
理论上,qemu 支持的所有平台和开发板,Linux Lab 都支持,所以非常欢迎大家参考上述过程为 Linux Lab 贡献其他的开发板支持,也欢迎提出需求,由我们来添加。
当前支持状态,所有之前内置的板子都已经升级到最新的 Linux v5.0.x 内核:
$ make list
[ g3beige ]:
ARCH = powerpc
CPU ?= generic
LINUX ?= v5.0.13
ROOTDEV ?= /dev/ram0
[ malta ]:
ARCH = mips
CPU ?= mips32r2
LINUX ?= v5.0.13
ROOTDEV ?= /dev/ram0
[ pc ]:
ARCH = x86
CPU ?= x86_64
LINUX ?= v5.0.10
ROOTDEV ?= /dev/ram0
[ versatilepb ]:
ARCH = arm
CPU ?= arm926t
LINUX ?= v5.0.13
ROOTDEV ?= /dev/ram0
[ vexpress-a9 ]:
ARCH = arm
CPU ?= cortex-a9
LINUX ?= v5.0.10
ROOTDEV ?= /dev/ram0
[ virt ]:
ARCH = arm64
CPU ?= cortex-a57
LINUX ?= v5.0.10
ROOTDEV ?= /dev/ram0
基础用法
对于用户而言,无需关心上述升级过程,只需要参考 Linux Lab 先安装。
以 Ubuntu 为例,快速安装和使用:
git clone https://gitee.com/tinylab/cloud-lab.git
cd cloud-lab
tools/docker/install // 安装 docker-engine,安装完重启一下 X11 或者整个系统
tools/docker/choose linux-lab
tools/docker/run linux-lab
之后,正常情况下会自动打开浏览器开启一个实验窗口,登陆进去执行桌面的控制台即可进入实验环境,进入以后就可以参考 README.md 真正用起来。
make BOARD=vexpress-a9
make boot
如果之前已经安装过 Linux Lab,只需要更新一下 Cloud Lab, Linux Lab, linux-stable 等源码,可以单独进去用 git pull 更新也可以直接在 Cloud Lab 下执行 tools/docker/update。
拓展用法
另外,除了完整使用 Linux Lab 以外,还可以仅仅使用其中的某个组件:
prebuilt kernel and rootfs: 在各个板子下面的 bsp 子仓库中
这个对于学习内核来说至关重要,无论是用 buildroot 还是 debootstrap 等工具制作 rootfs 都非常费时。而我们的 prebuilt 仓库提前制作好了 minimal rootfs,已经满足简单的内核测试和调试。另外,我们正在计划用 debootstrap 制作 full rootfs,方便做 app 开发学习。
configs: boards/BOARD/{linux,buildroot…}_version_defconfig
作为初学者,要找到第一个可以工作的内核配置文件是比较棘手的,而我们这些都是验证过的,你可以基于这个调整修改。
qemu:
make boot V=1
通过
make boot V=1
可以看到我们自动构建的 qemu 命令和参数,Linux Lab 已经支持串口、图形、调试、网络、各种存储类型、各种文件系统类别、自动化测试等,这个命令和参数无需记忆,参考 README.md 使用,并传递V=1
就可以看到完整 Qemu 命令。
当然,我们也在陆续加入大量实验案例,例如 examples 和 modules 下的例子,都可以参考。
参与项目
欢迎大家反馈平时的使用心得或者是参与项目,一起贡献更多功能,Linux Lab 需要你!
项目发起人微信是:lzufalcon,快联系我们吧。
猜你喜欢:
- 我要投稿:发表原创技术文章,收获福利、挚友与行业影响力
- 知识星球:独家 Linux 实战经验与技巧,订阅「Linux知识星球」
- 视频频道:泰晓学院,B 站,发布各类 Linux 视频课
- 开源小店:欢迎光临泰晓科技自营店,购物支持泰晓原创
- 技术交流:Linux 用户技术交流微信群,联系微信号:tinylab
支付宝打赏 ¥9.68元 | 微信打赏 ¥9.68元 | |
请作者喝杯咖啡吧 |
Read Album:
- Linux Lab 发布 v0.7 正式版,新增 Linux Lab 实验盘,一分钟内即可开展内核实验
- Linux Lab 真盘开发日志(6):体验内存编译的用法和好处
- Linux Lab 真盘开发日志(5):体验透明压缩带来的可用容量翻倍效果
- Linux Lab 真盘开发日志(4):在台式机、笔记本和 macBook 上即插即用
- Linux Lab 真盘开发日志(3):在 Linux 下直接启动 Linux Lab Disk,当双系统使用
Read Related:
Read Latest:
- vexpress 2
- qemu 13
- x86 7
- arm 4
- arm64 2
- aarch64 4
- pc 3
- gcc 6
- virt 2
- versatilepb 2
- g3beige 2
- malta 2
- restart config 1
- 知识星球 4