泰晓科技 -- 聚焦 Linux - 追本溯源,见微知著!
网站地址:https://tinylab.org

基于泰晓RISC-V实验箱的Linux公开课
请稍侯

Linux Lab 正式进入 Linux 5.0 时代


已支持X86_64/pc, ARM/vexpress-A9, ARM64/virt, ARM/versatilepb, PPC/g3beige, MIPS/malta 开发板
Wu Zhangjin 创作于 2019/05/03

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 款开发板。

目前已经完成了如下板子的升级工作:

  1. ARM 32
    • vexpress-A9
    • versatile-a9
  2. ARM 64
    • virt
  3. X86_64
    • pc
  4. PowerPC
    • g3beige
  5. 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,并同步到本地。

有两种方式可以完成同步:

  1. 在 Github 删除掉老镜像,直接新建一个 Import 最新的进来
  2. 在本地 fetch 最新的 mainline linux-stable 再以 mirror 的方式 push 到 Github

实际操作过程中,两者都不是很顺利,第一个中途出错了,导致很多 tags 没有同步完成甚至 Github 的该仓库页面都无法打开了,还得进行第二种方式。而第二种方式在直接以 git push --tagsgit 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 知识星球” 长期和其他各企业一线同行一起学习交流,也可以联系我们进一步咨询:

tinylab wechat

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,快联系我们吧。



Read Album:

Read Related:

Read Latest: