yocto系列讲解 (实战篇) 52 - 制作system/rootfs文件系统镜像

By: fu linux
E-mail: fulinux@sina.com
Blog: https://blog.csdn.net/fulinus
喜欢的盆友欢迎点赞和订阅!
你的喜欢就是我写作的动力!

简述目的

本篇主要是讲如何制作system镜像文件或者说rootfs根文件系统镜像。

再讲BootLoader之前,先讲下如何制作system.img镜像文件,其实很简单,system.img镜像其实就是ext4格式的文系统,没有经过修饰。
我们首先需要在配置文件中声明我们的文件系统镜像是属于什么类型的,参考如下:

meta-mybsp]$ vim conf/machine/msm8909.conf
#添加下面这一行
IMAGE_FSTYPES += "ext4"
  • 1
  • 2
  • 3

制作迷你版本的system.img

为了方便验证我们先制作一个迷你版本的根文件系统镜像,之前也有提及,参考如下:

poky]$ source oe-init-build-env 
...
You can now run 'bitbake <target>'

Common targets are:
    core-image-minimal #这个target就是迷你版本的
    core-image-sato #这个是完整的
...
build]$ bitbake core-image-minimal
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

编译完成后会在 build/tmp/deploy/images/msm8909/ 目录下生成相应的ext4文件,如下所示:

build]$ ls tmp-msm8909/deploy/images/msm8909/
core-image-minimal-msm8909-20210409071716.rootfs.ext4      modules-msm8909.tgz
core-image-minimal-msm8909-20210409071716.rootfs.manifest  msm8909-boot.img
core-image-minimal-msm8909-20210409071716.testdata.json    vmlinux-3.18.71
core-image-minimal-msm8909.ext4                            xxx
core-image-minimal-msm8909.manifest                        zImage-dtb
core-image-minimal-msm8909.testdata.json                   zImage-dtb--3.18.71-r0-msm8909-20210408113626.bin
modules--3.18.71-r0-msm8909-20210408113626.tgz             zImage-dtb-msm8909.bin
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

就是core-image-minimal-msm8909-20210409071716.rootfs.ext4和core-image-minimal-msm8909.ext4文件,后者只是前者的符号链接文件。
我们通过fastboot工具,将其刷入板子看看能不能执行,同时按住power和Vol_down键,开启电源,进入fastboot模式(以下在windows的cmd终端中操作):

C:\Users\peeta.chen>fastboot flash system U:\poky\build\tmp-msm8909\deploy\images\msm8909\core-image-minimal-msm8909-20210409071716.rootfs.ext4
Sending 'system' (8424 KB)                         OKAY [  0.869s]
Writing 'system'                                   OKAY [  0.259s]
Finished. Total time: 1.160s
C:\Users\peeta.chen>fastboot reboot
Rebooting
Finished. Total time: 0.007s
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

刷好之后重启系统

出错了没有进入文系统

不过没有跑起来:

...
[    6.566415] spk_vreg: disabling
[    6.568681] oem_otg_ext_vreg: disabling
[    6.572585] clock_late_init: Removing enables held for handed-off clocks
[    6.582872] ALSA device list:
[    6.584809]   No soundcards
[    6.594160] EXT4-fs (mmcblk0p21): couldn't mount as ext3 due to feature incompatibilities
[    6.602127] EXT4-fs (mmcblk0p21): couldn't mount as ext2 due to feature incompatibilities
[    6.610443] EXT4-fs (mmcblk0p21): INFO: recovery required on readonly filesystem
[    6.616839] EXT4-fs (mmcblk0p21): write access will be enabled during recovery
[    6.671985] EXT4-fs (mmcblk0p21): recovery complete
[    6.677210] EXT4-fs (mmcblk0p21): mounted filesystem with ordered data mode. Opts: (null)
[    6.684470] VFS: Mounted root (ext4 filesystem) readonly on device 179:21.
[    6.692677] Freeing unused kernel memory: 812K
[    7.448761] rc (284) used greatest stack depth: 5776 bytes left
[    7.559228] udevd (306) used greatest stack depth: 5720 bytes left
[    7.578664] udevadm (307) used greatest stack depth: 5648 bytes left
[    7.836434] EXT4-fs (mmcblk0p21): re-mounted. Opts: data=ordered
[    7.850818] rc (277) used greatest stack depth: 5464 bytes left
[   13.182202] msm_thermal:msm_thermal_update_freq Freq mitigation task is not initialized
[   13.931399] mdss_fb_release_all: try to close unopened fb 0! from pid:342 name:halt
[   13.939560] reboot: Power down
[   13.941680] Powering off the SoC
[   13.945374] Calling SCM to disable SPMI PMI
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

提示信息有这么几点:

  1. 没有声卡,声卡没有起来
  2. readonly filesystem只读文件系统
  3. 使用的是udev管理器
  4. halt:Powering off the SoC,系统关机了。

其中:

mdss_fb_release_all: try to close unopened fb 0! from pid:342 name:halt
  • 1

应该是最严重的,就是去关闭一个没有打开的/dev/fb0(显示设备的framebuffer),然后呢执行了halt停止了系统。

设备管理器通常有mdev、udev和systemd,而这里使用的是udev,udev比较庞大和复杂,而嵌入式设备通常使用的是mdev。猜想制作的core-image-minimal默认的就是udev设备管理器。systemd是一个全新的第一个进程,也非常的好用,后面我教大家使用。
更换devtmfs的
如何优雅的修改设备管理器呢?参考如下:

meta-mybsp]$ vim conf/machine/msm8909.conf
#添加:
VIRTUAL-RUNTIME_dev_manager ?= "busybox-mdev"
  • 1
  • 2
  • 3

加上后重编译:

poky]$ source oe-init-build-env
build]$ bitbake core-image-minimal
  • 1
  • 2

再次使用fastboot命令刷入后成功启动了

[    5.947684] ALSA device list:
[    5.947687]   No soundcards found.
[    6.014234] msm_hsusb msm_hsusb: CI13XXX_CONTROLLER_RESET_EVENT received
[    6.014251] msm_hsusb msm_hsusb: CI13XXX_CONTROLLER_CONNECT_EVENT rece[    6.357350] mmcblk0rpmb: mmc0:0001 H8G4a2 partition 3 4.00 MiB
[    6.368604]  mmcblk0: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 p18 p19 p20 p21 p22 p23 p24 p25 p26 p27 p28 p29 p30 p31 p32 p33 p34 p35 p36
[    6.394321] EXT4-fs (mmcblk0p21): couldn't mount as ext3 due to feature incompatibilities
[    6.397905] msm8952-asoc-wcd 7702000.sound: default codec configured
[    6.401780] msm8952-asoc-wcd 7702000.sound: ASoC: CODEC DAI cajon_vifeedback not registered
[    6.401834] msm8952-asoc-wcd 7702000.sound: snd_soc_register_card failed (-517)
[    6.424679] EXT4-fs (mmcblk0p21): couldn't mount as ext2 due to feature incompatibilities
[    6.435733] EXT4-fs (mmcblk0p21): mounted filesystem with ordered data mode. Opts: (null)
[    6.443000] VFS: Mounted root (ext4 filesystem) readonly on device 179:21.
[    6.451190] Freeing unused kernel memory: 812K
[    7.142566] mount (282) used greatest stack depth: 6424 bytes left
[    7.163610] mknod (284) used greatest stack depth: 6156 bytes left
[    7.229999] rc (296) used greatest stack depth: 5920 bytes left
[    9.486994] mdev (308) used greatest stack depth: 5792 bytes left
[    9.529620] EXT4-fs (mmcblk0p21): re-mounted. Opts: data=ordered
[    9.600274] bootlogd (636) used greatest stack depth: 5704 bytes left
[   10.069919] random: dd urandom read with 13 bits of entropy available
[   10.196535] rc (281) used greatest stack depth: 5464 bytes left

Poky (Yocto Project Reference Distro) 3.2.2 msm8909 /dev/ttyHSL0
msm8909 login: root
root@msm8909:~# ls /
bin         dev         home        lost+found  mnt         run         sys         usr
boot        etc         lib         media       proc        sbin        tmp         var
root@msm8909:~# uname -a
Linux msm8909 3.18.71 #1 SMP PREEMPT Tue Mar 30 11:55:56 UTC 2021 armv7l GNU/Linux
  • 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

编译警告问题

在编译文系统是提示了很多这么多信息该如何处理呢?

NOTE: preferred version 3.18 of linux-msm not available (for item virtual/kernel)
NOTE: versions of linux-msm available: 3.18.71
NOTE: preferred version 3.18 of linux-msm not available (for item kernel-image)
NOTE: versions of linux-msm available: 3.18.71
  • 1
  • 2
  • 3
  • 4

还是版本字符串不全的问题导致的。参考修改如下:

meta-mybsp]$ vim conf/machine/msm8909.conf
#将下面的
PREFERRED_VERSION_linux-msm ?= "3.18"
#改成:
PREFERRED_VERSION_linux-msm ?= "3.18%"

#修改kernel的recipe文件名:
meta-mybsp]$ mv recipes-kernel/linux-msm/linux-msm_3.18.bb recipes-kernel/linux-msm/linux-msm_3.18%.bb
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

定值自己的发行版

这个是什么问题呢?怎么说好呢?
首先我们在 build/conf/local.conf 中定义的一些信息,比如:

DISTRO ?= "poky"
#PACKAGE_CLASSES ?= "package_rpm package_deb package_ipk"
PACKAGE_CLASSES ?= "package_ipk"
TMPDIR = "${TOPDIR}/tmp-${MACHINE}"
  • 1
  • 2
  • 3
  • 4

这几个变量是定义在一个零时的配置文件中的。如果有开发过imx6 yocto项目的盆友,看下他编译的命令是不是类似这样:

$ DISTRO=<distro name> MACHINE=<machine name> source fsl- setup-release.sh -b <build dir>
  • 1

就在开头指定了发行版本。

so~ 发行版本到底是个啥,怎么感觉你说的这些配置和在 conf/machine/msm8909.conf 中提及的配置差不多呢。
确实有很多变量的设置可以放到 conf/machine/msm8909.conf 中。但是有的时候如果有多种平台可能就需要做好共性和特性的差异。比如你的yocto不光是可以编译msm8909的平台还可以编译msm8953或者sdm660等平台,处理BSP部分可能有差异,但是上层软件可以差不多,发行版本里面可以规定哪些软件可以或不开源安装到镜像中,是否需要编译一个交叉编译器(gcc 什么的)到镜像中,是否使用glibc,定义自己的发行版本,是否需要在终端中定制一些自己的显示信息等。

比如我们可以看到在进入系统前有这样的提示:

Poky (Yocto Project Reference Distro) 3.2.2 msm8909 /dev/ttyHSL0
msm8909 login: 
  • 1
  • 2

那我们可以修改成类似这样吗:

fulinux.blog.csdn.net (MSM8909 Reference Distro) 1.0.0 msm8909 /dev/ttyHSL0
msm8909 login: 
  • 1
  • 2

答案是可以的。

比如我们默认的发行版使用的配置就是在下面的文件中:

poky]$ vim meta-poky/conf/distro/poky.conf
DISTRO = "poky"
DISTRO_NAME = "Poky (Yocto Project Reference Distro)" #上面启动显示的那句话
DISTRO_VERSION = "3.2.2"
DISTRO_CODENAME = "gatesgarth"
SDK_VENDOR = "-pokysdk"
SDK_VERSION = "${@d.getVar('DISTRO_VERSION').replace('snapshot-${DATE}', 'snapshot')}"
...
#还有很多内容
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

首先我们在 conf/machine/msm8909.conf 指定我们的 DISTRO 名,比如叫mydistro:

meta-mybsp]$ vim conf/machine/msm8909.conf
DISTRO = "mydistro"
  • 1
  • 2

然后在meta-mybsp/目录下创建相应的配置文件:

meta-mybsp]$ mkdir conf/distro/
meta-mybsp]$ vim conf/distro/mydistro.conf #注意这个mydistro.conf要和${DISTRO}.conf同名才可以找到
#Distro configuration
DISTRO_VERSION ?= "1.0.0" #定义自己的发行版本
DISTRO_NAME ?= "MyDistro (MSM8909 Reference Distro)"

PACKAGE_CLASSES ?= "package_ipk" #只要这一个类型的package
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

编译后会在build/目录下创建一个新的 tmp-msm8909-glibc 目录,之前编译出来的镜像都是使用的libc,但是这个使用的是GNU的glibc,具体有什么差异可以自行查证。

当然如何你不喜欢这个改动可以将配置改回来(我也改回来,继续使用默认的poky发行版),比如:

meta-mybsp]$ vim conf/machine/msm8909.conf
DISTRO = "poky"
  • 1
  • 2

以后有实际需要在具体该也可以。后面有实际需求再讲如何编译full文件系统

文件系统还有很多工作要做,比如modem、aDSP、声卡、wifi都没有起来,屏幕也没亮,后期还有很多工作要做,有时间再慢慢讲~

给我点个赞加个关注呗!万分感谢!
在这里插入图片描述