编译一套相对简单的操作系统
粗浅的研究了一下ST官方提供的利用Yocto工具建立的系统,个人感觉掌握起来有点复杂,而且编译过程真心的痛不欲生。我的机器内存2G根本编译不了,而且时间超级长,我的机器是个双核2G,内存4G,编译一次应该在10个小时以上,还不包括所需内容在网络获取的时间。我下载了第三方澎湃兔的系统,整整下载了1天,接近50G的资料。最重要的是,好不容易编译了一个出来,整个系统动不动就上G,对于一个工控产品这个也太大了。等我先哭一会。。。。。 于是,我决定不采用官方的系统,利用官方提供的uboot和linux kernel看看可不可以有个第三方的工具可以建立一个简单点的系统。功夫不负有心人,我找到了一个老外搞得,采用buildroot工具建立的系统,感觉挺好,下面把我构建系统的过程和问题总结如下。
1. 下载buildroot采用命令:
git clone git://git.buildroot.net/buildroot
先克隆buildroot开发环境。 2. 针对STM32MP1-DK开发板建立环境其实这个过程挺复杂,但是好在有个老外牛人已经搞好了,我就等现成的就好了。 进入刚才得到buildroot目录: cd buildroot 例如如下命令获取基本环境: git remote add tpetazzoni https://github.com/tpetazzoni/buildroot.gitgit fetch tpetazzonigit checkout -b stm32mp157-dk2 tpetazzoni/2019.02/stm32mp157-dk
当写到这里时,我遇到了git的克隆速度那叫一个慢啊,实在是无法忍受。怎么办呢。干脆,跳过克隆过程,直接到github下载下来之后在解压看看行不行。 然后选择 “stm32mp157-dk”,点击“Clone or download”按钮,把这个工程下载下来。
下载的文件为:buildroot-stm32mp157-dk.zip 把这个文件复制到ubunt 16下面,然后解压。 解压缩命令:unzipbuildroot-stm32mp157-dk.zip 3. 装载缺省配置文件进入刚才解压的目录,目录名为buildroot-stm32mp157-dk #cdbuildroot-stm32mp157-kd #makestm32mp157_dk_defcofig 4. 对当前的配置进行调整以适合我们的开发板我们执行命令: # makemenuconfig
这时候,我们可以看到打开了这个系统的配置界面。 Target Architecture:ARM(little endian) Target BinaryFormat:ELF Target ArchitectureVariant:cortex-A7 Target ABI:EABIhf Floating pointstrategy:VFPv4-D16 ARM instructionset:ARM 看一下就可以,不用调整。 2、Build options 其中的内容我们不用调整。 3、Toolchain 这里我进行了几项调整: Toolchain type:Externaltoolchain Toolchain:Arm ARM2018.11 选中Copygdb server to the Target。将来远程调试应用程序的时候会用到。
4、System configuration 可以调整 System hostname ,这个默认为buildroot,你可以改成你喜欢的名字,将来系统中的hostname就是这个名字。 提一下这个设置Root filesystem overlay direction。它指出了一个配置文件的位置,是uboot引导系统的一些命令,如果将来有需要的我们在调整。 Extra argumentspassed:这个配置指向的文件将来是SD卡分区的配置文件,如果有需要将来我们在修改。.
5、Kernel 这里面我们要调整一个参数: In-tree Device Tree Source file names:stm32mp157c-dk2更改为stm32mp157a-dk1,来适合我们的开发板。
记住Kernel verion下面的linux源码压缩文件为linux-v4.19-stm32mp-r1.2.tar.gz。这个我们后面会用到。
6、Target packages 这个里面都是将来linux系统下面集成的一些命令,根据需要我们可以自己选择想用。我这里选择了如下几个,在Networkingapplications下面选中: iproute2 如果在linux下使用CAN,贼重要 openssh 这个不用多说了吧,将来的开发全靠他了 其它的就按照默认的选,不动。 7、Bootloaders 这个下面我们要记住U-Boot下面的Custom repositiory version:v2018.11-stm32mp-r2.1,后面会用到。 修改Custommake options:DEVICE_TREE=stm32mp157a-dk1,来适应我们的开发板。
其它没提到的部分我目前都没有修改。好了保存退出menuconfig过程。 5. 执行编译执行命令开始编译: #make2>&1 | tee build.log 接下来将是痛苦的开始,如果你耐心足够,下面你不用看了,如果你挺不住了,继续往下看吧。 6. 下载必要的源码文件其它的源码文件因为压缩包很小,基本都可以忍受,但是toolchain、uboot和linuxkernel的压缩包太大了,真心不能忍受。我们自己下载下来。 前面提到的需要记住的名字起作用了: u-boot:v2018.11-stm32mp-r2.1 需要修改压缩包的名字为uboot-v2018.11-stm32mp-r2.1.tar.gz 目录:dl/uboot linux kernel:linux-v4.19-stm32mp-r1.2.tar.gz 下载地址: https://github.com/STMicroelectronics/linux/archive/v4.19-stm32mp-r1.2/linux-v4.19-stm32mp-r1.2.tar.gz 目录:dl/linux toolchain:arm-2018.11
目录:dl/toolchain-external-arm-arm
7. 输出文件
如果编译过程一切顺利,在output/images下面会出现如下所示的文件。
其中sdcard.img是可以直接烧录到sd卡的镜像文件。 8. 烧录采用如下命令烧录到sd卡中。 sudo dd if=output/images/sdcard.img of=/dev/sdb bs=1M conv=fdatasync status=progress
需要注意,of=/dev/sdb是指sd卡在你的系统中的设备文件名称。 可以使用如下命令来查看以下:
#sudo fdisk –l 9. 从SD卡启动中遇到的问题 我遇到的问题:end Kernel panic - not syncing: VFS: Unable to mount root fs onunknown-block(179,4) SD卡烧录完成后,系统中查看每个分区都是正常的。Uboot可以正常启动,但是linux却无法挂载rootfs分区,并提示上面错误。 经过试验发现是rootfs的分区被破坏了,目前采用的修复方式是在Ubuntu下面重新格式化这个分区: #sudomkfs.ext4 /dev/sdb4 格式化分区后,将rootfs下面的文件重新复制到SD的这个分区内,重现上电,问题解决了。目前还不是太清楚是不是生成的sdcard.img有问题。
接下来您将会从SD卡启动了,但是为了让这个系统运行的如我们所需要的形式,还需需要一些配置,下一贴配置新系统。
|