搜索
bottom↓
回复: 1

《STM32MP157嵌入式Linux驱动开发指南》第十九章 Buildroot系统构建

[复制链接]

出0入234汤圆

发表于 2021-6-25 19:02:41 | 显示全部楼层 |阅读模式
本帖最后由 正点原子 于 2021-6-25 19:02 编辑

1)实验平台:正点原子STM32MP157开发板
2)  章节摘自【正点原子】《STM32MP157嵌入式Linux驱动开发指南》
3)购买链接:https://item.taobao.com/item.htm?&id=629270721801
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/arm-linux/zdyzmp157.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子STM32MP157技术交流群:691905614
1.png

2.jpg


3.png


第十九章 Buildroot根文件系统构建


        上一小节我们学习了如何使用busybox来构建根文件系统,但是busybox构建的根文件系统不齐全,很多东西需要我们自行添加,比如lib库文件。在我们后面的驱动开发中很多第三方软件也需要我们自己去移植,这些第三方软件有很多又依赖其他的库文件,导致移植过程非常的繁琐。本章我们来学习一下另外一种更加实用的根文件系统构建方法,那就是使用buildroot来构建根文件系统。


19.1 何为buildroot?
19.1.1 buildroot简介
        在上一章我们讲解了如何使用busybox构建文件系统,busybox仅仅只是帮我们构建好了一些常用的命令和文件,像lib库、/etc目录下的一些文件都需要我们自己手动创建,而且busybox构建的根文件系统默认没有用户名和密码设置。在后续的实验中,我们还要自己去移植一些第三方软件和库,比如alsa、iperf、mplayer等等。那么有没有一种傻瓜式的方法或软件,它不仅包含了busybox的功能,而且里面还集成了各种软件,需要什么软件就选择什么软件,不需要我们去移植。答案肯定是有的,buildroot就是这样一种工具,buildroot比busybox更上一层楼,buildroot不仅集成了busybox,而且还集成了各种常见的第三方库和软件,需要什么就选择什么,就跟我们去吃自助餐一样,想吃什么就拿什么。buildroot极大的方便了我们嵌入式Linux开发人员构建实用的根文件系统。
从busybox开始一步一步的构建根文件系统适合学习、了解根文件系统的组成,但是不适合做产品(主要是自己构建的话会有很多不完善、没有注意到的细节)。buildroot会帮我们处理好各种细节,根文件系统也会更加的合理、有效。因此在做产品的时候推荐大家使用buildroot来构建自己的根文件系统,当然了,类似buildroot的软件还有很多,比如yocto,一般半导体厂商会选择yocto来制作系统包,但是由于国内的网络环境,yocto编译起来会有很多问题!
buildroot和uboot、kernel很类似,我们需要到其官网上下载源码,然后对其进行配置,比如设置交叉编译器、设置目标CPU参数等,最主要的就是选择所需要的第三方库或软件。一切配置好以后就可以进行编译,编译完成了以后就会在一个文件夹里面存放好编译结果,也就是根文件系统。
注意!buildroot制作的根文件系统也是放到ubuntu的nfs目录下的rootfs文件夹,因此如果rootfs文件夹已经存放了前面busybox制作的根文件系统,那么请大家对其做一份备份,然后清空rootfs文件夹。
19.1.2 buildroot下载
        buildroot源码肯定是要从buildroot官网下载,官网地址为https://buildroot.org/,打开以后的官网界面如图19.1.2.1所示:
第十九章1269.png

图19.1.2.1 buildroot官网界面

        点击图19.1.2.1中的“DOWNLOAD”按钮即可打开buildroot的下载界面,如图19.1.2.2所示:
第十九章1354.png

图19.1.2.2 buildroot下载界面

        可以看出,在写本教程的时候最新的LTS(长期支持版)版buildroot为2020.02.8,分为.gz和.bz2两种压缩格式,这里我就使用右侧的.bz2压缩格式的源码,选中以后下载即可。但是笔者在此前测试的都是2020.02.6版本的,为了保险起见,我们就使用2020.02.6版本的。我们已经将其放到了开发板光盘中,路径为:1、例程源码-》7、buildroot源码-》buildroot-2020.02.6.tar.bz2,一切准备好以后就可以使用buildroot构建根文件系统了。
19.2 buildroot构建根文件系统
19.2.1 配置buildroot
        将buildroot源码buildroot-2020.02.6.tar.bz2拷贝到ubuntu中,拷贝完成以后对其进行解压,命令如下:
  1. tar -vxjf buildroot-2020.02.6.tar.bz2
复制代码

        解压完成以后就会得到一个名为“buildroot-2020.02.6”的目录,此目录就是我们解压得到的buildroot源码,进入到此目录中,此目录下的文件如图19.2.1.1所示:
第十九章1868.png

图19.2.1.1 buildroot源码文件

        buildroot和uboot、Linux kernel一样也支持图形化配置,输入如下命令即可打开图形化配置界:
  1. make menuconfig
复制代码

打开以后的图形化配置界面如图19.2.1.2所示:
第十九章1994.png

图19.2.1.2 buildroot图形化配置界面

        接下来我们就依次配置buildroot,配置完成以后就可以进行编译了。
        1、配置Target options
        首先配置Target options选项,需要配置的项目和其对应的内容如下(“=”号后面是配置项要选择的内容!):
  1. Target options        
  2.         -> Target Architecture                                  = ARM (little endian)  
  3.         -> Target Binary Format                         = ELF
  4.         -> Target Architecture Variant                 = cortex-A7
  5.         -> Target ABI                                         = EABIhf
  6.         -> Floating point strategy                         = NEON/VFPv4
  7.         -> ARM instruction set                                 = ARM
复制代码

配置完成以后如图19.2.1.3所示:
第十九章2415.png

图19.2.1.3 配置好的Target options选项

        2、配置Toolchain
        此配置项用于配置交叉编译工具链,也就是交叉编译器,这里设置为我们自己所使用的交叉编译器即可。buildroot其实是可以自动下载交叉编译器的,但是都是从国外服务器下载的,鉴于国内的网络环境,强烈推荐大家设置成自己所使用的交叉编译器。需要配置的项目和其对应的内容如下:
  1. <font size="4">Toolchain
  2.         -> Toolchain type         = External toolchain
  3.         -> Toolchain                 = Custom toolchain                        //用户自己的交叉编译器
  4.         -> Toolchain origin        = Pre-installed toolchain                //预装的编译器
  5.         -> Toolchain path        = /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf
  6.         -> Toolchain prefix                = $(ARCH) -none-linux-gnueabihf         //前缀
  7.         -> External toolchain gcc version                  = 9.x
  8.         -> External toolchain kernel headers series         = 4.20.x                //交叉编译器的linux版本号
  9.         -> External toolchain C library                         = glibc/eglibc
  10.         ->[*]</font><span style="font-size: large;">Toolchain has SSP support? (NEW)         //选中</span><div><span style="font-size: large;">        ->[*]</span><span style="font-size: large;">Toolchain has RPC support? (NEW)         //选中</span></div><div><font size="4">        ->[*</font><font size="4">]</font><font size="4">Toolchain has C++ support?                 //选中</font></div><div><font size="4">        ->[*</font><font size="4">]</font><font size="4">Enable MMU support (NEW)                  //选中</font></div>
复制代码


       Toolchain下几个比较重要的选项需要说明一下,如下所示:
       Toolchain:设置为Custom toolchain,表示使用用户自己的交叉编译器。
       Toolchain origin:设置为Pre-installed toolchain,表示使用预装的交叉编译器。
       Toolchain path:设置自己安装的交叉编译器绝对路径!buildroot要用到。
       Toolchain prefix:设置交叉编译器前缀,要根据自己实际所使用的交叉编译器来设置,比如我们使用的是arm-none-linux-gnueabihf-gcc,因此前缀就是$(ARCH)-none-linux-gnueabihf,其中ARCH我们前面已经设置为了arm。
       External toolchain kernel headers series:这个设置的是交叉编译器所对应的linux内核版本号,gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf所对应的linux内核版本号为4.20,因此这里需要设置为4.20.x!大家一定要根据自己所使用的交叉编译器来设置,否则编译的时候会报版本不一致的错误。
        3、配置System configuration  
此选项用于设置一些系统配置,比如开发板名字、欢迎语、用户名、密码等。需要配置的项目和其对应的内容如下:
  1. <font size="4">System configuration
  2.         -> System hostname                = ATK-stm32mp1                         //平台名字,自行设置
  3.         -> System banner                        = Welcome to alientek STM32MP157           //欢迎语
  4.         -> Init system                                = BusyBox                                //使用busybox
  5.         -> /dev management                = Dynamic using devtmpfs + mdev        //使用mdev
  6.         -></font><font size="4"> [*]Enable root login with password (NEW)                          //使能登录密码
  7.         -> Root password                = 123456                                        //登录密码为123456</font>
复制代码

        在System configuration选项中可以配置平台名字,登录密码等信息。可以看出buildroot里面可以设置登录密码,但是作为实验,不建议大家设置登录密码,否则开发板每次重启都要输入密码,不方便开发。
        4、配置Filesystem images
        此选项配置我们最终制作的根文件系统为什么格式的,配置如下:
  1. <font size="4">-> Filesystem images
  2.         ->[*]</font><font size="4">ext2/3/4 root filesystem                 //如果是EMMC或SD卡的话就用ext3/ext4
  3.                 -> ext2/3/4 variant                 = ext4        //选择ext4格式
  4.                 -> exact size                        =1G                //ext4格式根文件系统1GB(根据实际情况修改)
  5.         ->[*]</font><font size="4">ubi image containing an ubifs root filesystem  //如果使用NAND的话就用ubifs</font>
复制代码

        可以看出,buildroot可以直接制作出ext4格式的根文件系统,但是一般我们会自行往根文件系统里面添加很多其他的文件,所以产品开发完成以后需要自行打包根文件系统,然后烧写到开发板里面。不管是针对EMMC的ext4格式的根文件系统还是针对NAND的ubi格式的根文件系统,都要设置相应的大小,比如这里我们设置的ex4格式根文件系统大小为1GB。
        5、禁止编译Linux内核和uboot
        buildroot不仅仅能构建根文件系统,也可以编译linux内核和uboot。当配置buildroot,使能linux内核和uboot以后buildroot就会自动下载最新的linux内核和uboot源码并编译。但是我们一般都不会使用buildroot下载的linux内核和uboot,因为buildroot下载的linux和uboot官方源码,里面会缺少很多驱动文件,而且最新的linux内核和uboot会对编译器版本号有要求,可能导致编译失败。因此我们需要配置buildroot,关闭linux内核和uboot的编译,只使用buildroot来构建根文件系统,首先是禁止Linux内核的编译,配置如下:
  1. -> Kernel   
  2.         -> [ ] Linux Kernel   //不要选择编译Linux Kernel选项!
复制代码

        如图19.2.1.4所示:
第十九章5189.png

图19.2.1.4 不编译Linux内核

        接着禁止编译Uboot,配置如下:
  1. -> Bootloaders   
  2.         -> [ ] U-Boot    //不要选择编译U-Boot选项!
复制代码

        如图19.2.1.5所示:
第十九章5300.png

图19.2.1.5 不编译U-Boot

6、配置Target packages
        此选项用于配置要选择的第三方库或软件、比如alsa-utils、ffmpeg、iperf等工具,这里我们先只选择内核的模块加载相关软件,配置如下:
  1. <font size="4">        -> Target packages                                                                    
  2.         -> System tools
  3.                 ->[*]</font><font size="4">kmod                 //使能内核模块相关命令 </font>
复制代码

        上面的配置是使能内核模块相关的操作命令,比如depmod等,如图19.2.1.6所示:
第十九章5597.png

图19.2.1.6 使能模块操作相关命令

至于其他的第三方库这里就先不选择了,先编译一下最基本的根文件系统,如果没有问题的话再重新配置选择第三方库和软件。否则一口吃太多会容易撑着的,编译出问题的时候都不知道怎么找问题。
        7、保存配置项
        和uboot、kernel一样,通过图形化界面配置好buildroot以后最好保存一下配置项,防止清除工程以后将配置项给删除掉。buildroot的默认配置项都保存在configs目录下,配置完成以后选择<Save>,然后输入要设置的配置项名字,如图19.2.1.7所示:
第十九章5856.png

图19.2.1.7 保存配置项

        我们将配置项命名为“stm32mp1_atk_defconfig”,以后要重新配置buildroot的话就可以直接输入:
  1. make stm32mp1_atk_defconfig
复制代码

        保存完成以后就会在buildroot的configs目录下看到“stm32mp1_atk_defconfig”,如图19.2.1.8所示:
第十九章6035.png

图19.2.1.8 保存好的buildroot配置文件

19.2.2 编译buildroot
        配置完成以后就可以编译buildroot了,编译完成以后buildroot就会生成编译出来的根文件系统压缩包,我们可以直接使用。输入如下命令开始编译:
  1. sudo make  //注意,一定要加sudo,而且不能通过-jx来指定多核编译!!!
复制代码

buildroot编译的时候会先从网上下载所需的软件源码,有些软件源码可能下载不下来,这个时候就需要我们自行处理,这个后面会详细的讲解。
        buildroot编译过程会很耗时,因为所需要的所有软件要先从网上下载源码,很多软件都是从外网下载的,速度比较慢,在加上电脑配置的不同,整个编译过程可能需要几十分钟甚至数小时,请耐心等待!
buildroot因为要从网上下载源码,因此可能存在有些源码无法下载或下载很慢的情况,比如如图19.2.2.1所示:
第十九章6430.png

图19.2.2.1 下载cmake-3.8.2.tar.gz

        可以看出图19.2.2.1中正在下载cmake-3.8.2.tar.gz这个压缩包,大小是7.2MB,当前下载网速是1.6KB/S,需要用时71分钟,显然这是无法忍受的!我们可以自行到https://cmake.org/files/v3.8/cmake-3.8.2.tar.gz这个网站上去将cmake-3.8.2.tar.gz这个源码下载下来,然后拷贝到buildroot源码目录下的dl文件夹中,dl文件夹专用用于存放下载下来的源码。拷贝进去以后重新编译buildroot,此时就不会在从网上下载cmake-3.8.2.tar.gz了,而是自己使用dl目录下已经存在的cmake-3.8.2.tar.gz压缩包,加快编译速度!
        等待编译完成,编译完成以后就会在buildroot-2020.02.6/output/images下生成根文件系统,如图19.2.2.2所示:
第十九章6917.png

图19.2.2.2 编译生成的根文件系统

        从图19.2.2.2可以看出,编译出来了多种格式的rootfs,比如ext2、ext4、ubi等。rootfs.ext4就是可以直接使用STM32CubeProgrammer烧写到开发板中的。但是我们后面的开发都是通过nfs挂载的方式,所以我们就使用rootfs.tar进行测试。将rootfs.tar拷贝到在nfs目录下的rootfs文件夹中并解压,命令如下:
  1. cd /home/zuozhongkai/linux/tool/buildroot-2020.02.6/output/images
  2. cp rootfs.tar /home/zuozhongkai/linux/nfs/rootfs/ -f                        //拷贝rootfs.tar
  3. cd /home/zuozhongkai/linux/nfs/rootfs/                                                //进入到rootfs目录下
  4. tar -vxf rootfs.tar                                                                                //解压缩rootfs.tar
  5. rm rootfs.tar                                                                                        //删除rootfs.tar
复制代码

        解压缩完成以后的rootfs目录如图19.2.2.3所示:
第十九章7433.png

图19.2.2.3 使用buildroot编译出来的根文件系统

        图19.2.2.3就是使用buildroot编译出来的根文件系统,我们可以通过nfs挂载到开发板上,然后对其进行测试。
19.2.3 buildroot根文件系统测试
        buildroot制作出来的根文件系统已经准备好了,接下来就是对其进行测试。测试方法也是通过nfs挂载的方式,启动uboot,修改bootargs环境变量,设置nfsroot目录为Ubuntu中的rootfs目录,命令如下:
  1. setenv bootargs console=ttySTM0,115200 root=/dev/nfs nfsroot=192.168.1.249:/home/zuozhongkai/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.250:192.168.1.249:192.168.1.1:255.255.255.0::eth0:off''   
复制代码

   
        设置好以后启动系统,进入根文件系统以后如图19.2.3.1所示:
第十九章7893.png

图19.2.3.1 buildroot根文件系统

        在图19.2.3.1中,首先要进入到/lib/modules目录,但是默认没有,因此需要我们自行创建此目录。buildroot构建的根文件系统启动以后会输出我们前面设置的欢迎语“Welcome to alientek STM32MP157”。然后需要输入用户名和密码,用户名是“root”,如果配置buildroot的时候设置了密码,那么就需要输入密码,这里我们没有设置密码,因此输入用户名就行了,如图19.2.3.2所示:
第十九章8134.png

图19.2.3.1 buildroot根文件系统文件

        可以看出的buildroot构建的根文件系统运行基本没有问题,但是这个根文件系统是最简单的,我们并没有在buildroot里面配置任何第三方的库和软件,接下来我们就配置buildroot,使能一些常见的第三方软件。
19.3 buildroot下的busybox配置
19.3.1 busybox配置
        buildroot在构建根文件系统的时候也是要用到busybox的,既然用到了busybox那么就涉及到busybox的配置。buildroot会自动下载busybox压缩包,buildroot下载的源码压缩包都存放在/dl目录下,在dl目录下就有一个叫做“busybox”的文件夹,此目录下保存着busybox压缩包,如图19.3.1.1所示:
第十九章8490.png

图19.3.1.1 busybox源码

        可以看出,buildroot下载的busybox版本为1.31.1。要想编译busybox,必须对图19.3.1.1中的压缩包进行解压缩,buildroot会对其进行解压!buildroot将所有解压缩后的软件保存在/output/build软件中,我们可以在找到/output/build/busybox-1.31.1这个文件夹,此文件夹就是解压后的busybox源码,文件内容如图19.3.1.2所示:
第十九章8717.png

图19.3.1.2 busybox源码

        如果大家想要修改busybox源码的话就直接在图19.3.1.2中找到相应的文件,然后修改即可。我们现在是要配置buildroot下的busybox,因此肯定要打开busybox的配置界面,在buildroot源码根目录下输入如下命令:
  1. sudo make busybox-menuconfig
复制代码

        输入以后就会打开buildroot下的busybox配置界面,如图19.3.1.3所示:
第十九章8934.png

图19.3.1.3 buildroot下的busybox配置界面

        图19.3.1.3就是我们最熟悉的busybox配置界面了,大家想要配置什么就直接操作就行了,或者参考第十八章即可。
19.3.2 busybox中文字符的支持
        在第十八章我们讲过了,busybox对中文字符显示做了限制,因此必须要修改相关的文件,具体修改过程参考18.2.2小节即可,这里就不再赘述了。
19.3.3 编译busybox
        配置好以后就可以重新编译buildroot下的busybox,进入到buildroot源码目录下,输入如下命令查看当前buildroot所有配置了的目标软件包,也就是packages:
sudo make show-targets
        结果如图19.3.3.1所示:
第十九章9275.png

图19.3.3.1 当前buildroot下的所有packages

        图19.3.3.1中列出了当前buildroot中所有使能了的packages包,其中就包括busybox,如果我们想单独编译并安装busybox的话执行下面命令即可:
  1. sudo make busybox
复制代码

        上述命令就会重新编译busybox。编译完成以后重新编译buildroot,主要是对其进行打包,输入如下命令:
  1. sudo make
复制代码

        重新编译完成以后查看一下output/images目录下rootfs.tar的创建时间是否为刚刚编译的,如果不是的话就删除掉rootfs.tar,然后重新执行“sudo make”重新编译一下即可。最后我们使用新的rootfs.tar启动Linux系统。
19.4.3 使用自己的busybox源码
        buildroot会自行下载busybox并编译,但是有时候我们不想要buildroot自带的busybox,我们想要使用自己配置好的busybox,比如第十八章我们已经配置好的busybox。这个可以在buildroot中实现,只要进行相应的配置,指定要使用的busybox源码目录即可。这个要自己编写buildroot的local.mk文件,在此文件里面指定busybox目录,在buildroot的configs目录下新建一个名为“local.mk”的文件,然后在里面输入如下格式内容:
  1. XXXXXX_OVERRIDE_SRCDIR=‘具体路径’
复制代码

        比如指定busybox路径的时候就使用:
  1. BUSYBOX_OVERRIDE_SRCDIR=/home/zuozhongkai/linux/busybox/busybox-1.32.0
复制代码

        local.mk准备好以后就可以配置buildroot,使用local.mk,打开buildroot的配置界面需要配置的项目和其对应的内容如下(“=”号后面是配置项要选择的内容!):
  1. -> Build options   
  2.         -> location of a package override file        = ./configs/local.mk 指定local.mk所在目录
复制代码

        如图19.4.3.1所示:
第十九章10209.png

图19.4.3.1 设置local.mk

        图19.4.3.1中“location of a package override file”选项就是设置local.mk路径的,这里设置为 “./configs/local.mk”。重新编译buildroot,此时buildroot会将BUSYBOX_OVERRIDE_SCRDIR指定的busybox源码拷贝到buildroot的output/build/busybox-custom目录下。编译完成以后使用新的根文件系统启动,输入“busybox”命令查看busybox版本号是否为1.32.0,如图19.4.3.2所示:
第十九章10498.png

图19.4.3.2 使用自定义busybox源码

        从图19.4.3.2可以看出,此时buildroot中的busybox版本号变为了1.32.0。为了方便开发,建议大家使用buildroot自带的busybox,也就是1.31.0版本的。
19.4 buildroot第三方软件和库的配置
        上一小节我们通过buildroot制作了一个最基本的根文件系统,本节我们来学习一下如何配置buildroot使能一些第三放软件或库,比如FTP和SSH服务等。
19.4.1 使能VSFTPD服务
        我们可以在开发板上搭建一个FTP服务器,这样我们就可以使用FileZilla软件直接向开发板拷贝文件,或者将开发板中的文件拷贝到电脑中。这里我们通过使能buildroot中的vsftpd软件来完成FTP服务器的搭建,配置路径如下:
  1. <font size="4">-> Target packages                                                                    
  2.                    -> Networking applications   
  3.                         -></font><font size="4">[*]vsftpd                                //使能vsftpd</font>
复制代码

        如图19.4.1.1所示:
第十九章11030.png

图19.4.1.1 使能vsftpd

19.4.2 使能SSH
        有时候我们需要远程登录开发板,这个时候就可以通过网络登录,要用到SSH服务,OpenSSH是SSH的开源免费版本。直接使能buildroot中的OpenSSH即可,配置路径如下:                                                                             
  1. <font size="4">-> Target packages                                                                    
  2.                 -> Networking applications
  3.                         ->[*]</font><font size="4">openssh                           //使能openssh</font>
复制代码

        如图19.4.2.1所示:
第十九章11398.png

图19.4.2.1 使能openssh

        等待编译完成就可以使用新的根文件系统进行测试了,将ouput/images/rootfs.tar拷贝到nfs目录下的rootfs目录中,然后重新解压。注意,以前自己添加的文件并不会被删除掉的,解压命令如下:
  1. tar -vxf rootfs.tar
复制代码

        解压完成以后就可以使用FTP和SSH等相关的软件了,由于FTP和SSH都是通过网络进行数据传输的,因此需要先配置网络,如果是通过nfs挂载的根文件系统,那么网络已经初始化完成了,因此可以直接使用。如果是烧写到EMMC里面的,那么就需要先配置网络相关功能。
        关于VSFTPD和SSH的测试稍后再讲解。
19.5 buildroot根文件系统测试
buildroot的根文件系统制作好以后就是测试工作了,基本测试内容和18.5小节一样,这里就不赘述了,我们重点讲解一下其他的测试内容。
19.5.1 depmod命令测试
        depmod命令非常重要,我们后面学习Linux驱动的时候需要使用此命令分析模块的依赖性,此命令需要在busybox中使能,路径如下:        
  1. <font size="4">-> Linux Module Utilities
  2.                 -></font><font size="4"> depmod                        //使能depmod命令</font>
复制代码

        如图19.5.1.1所示:
第十九章11948.png

图19.5.1.1 使能depmod命令

        默认情况下depmod命令是使能了的,但是如果大家输入depmod命令以后发现不存在,那么就自行重新配置一下buildroot下的busybox,按照上面的方法使能depmod命令并编译一次即可,最后使用新的buildroot根文件系统启动,输入depmod命令,一般会有如图19.5.1.2所示错误提示:
第十九章12126.png

图19.5.1.2 depmod命令错误提示

        从图19.5.1.2可以看出,depmod命令提示没有找到“lib/modules/5.4.31”目录(后面的5.4.31是和具体的Linux内核版本相关的,我们本教程使用的Linux内核版本为5.4.31。如果你使用的其他版本的Linux内核,那么这里就是相应的内核版本名字,比如4.1.15)。我们一般将驱动模块放到lib/modules/5.4.31目录下,既然当前根文件系统不存在这个目录,那么就手动创建此目录,命令如下:
  1. mkdir /lib/modules/5.4.31 -p
复制代码

        创建好以后在执行depmod命名就不会报错了,并且depmod命令会在lib/modules/5.4.31目录下生成三个文件:modules.alias、modules.dep、modules.symbols,如图19.5.1.3所示:
第十九章12517.png

图19.5.1.3 depmod命令产生的三个文件

        图19.5.1.3中这三个文件不需要我们去操作,系统会自己使用这三个文件。
19.5.2 vsftpd测试
        接下来测试一下用vsftpd搭建的FTP服务器,在测试之前要先进行一些设置,首先需要对vsftpd进行配置,打开/etc/vsftpd.conf文件,将下面两行前面的“#”去掉:
  1. local_enable=YES                //取消掉前面的‘#’
  2. write_enable=YES                //取消掉前面的‘#’
复制代码

接下来需要修改/etc/vsftpd.conf文件的所属用户,默认为sshd用户,我们要将其改为root用户,输入如下命令:
  1. chown root:root /etc/vsftpd.conf        //修改vsftpd.conf文件所属用户
复制代码

        必须修改vsftpd.conf的所有用户以及所属用户组,否则vsftpd运行的时候会报错!修改以后的vsftpd.conf所属用户以及用户组就都是root了,如图19.5.2.1所示:
第十九章12963.png

图19.5.2.1 修改后的vsftpd.conf所属用户和用户组

        最后在开发板上使用adduser命令新建一个用户要来完成FTP登录,如图19.5.2.2所示:
第十九章13048.png

图19.5.2.2 新建“zuozhongkai”用户

        创建完成以后就会在/home目录下存在“zuozhongkai”用户目录,如图19.5.2.3所示:
第十九章13130.png

图19.4.3.3 zuozhongkai用户目录

        设置完成以后重启开发板,vsftpd服务默认会使能!启动log信息如图19.5.2.4所示:
第十九章13206.png

图19.5.2.4 vsftpd开机自启动

        从图19.5.2.4可以看出,开机以后vsftpd默认已经启动了,大家可以输入“ps”命令查看一下,结果如图19.5.2.5所示:
第十九章13297.png

图19.5.2.5 后台运行的vsftpd软件

        至此vsftpd服务已经正常运行了,我们可以使用FileZilla来登录开发板,用户名使用前面创建的“zuozhongkai”即可,如图19.5.2.6所示:
第十九章13404.png

图19.5.2.6 设置FileZilla

        设置好以后就可以连接了,连接成功以后如图19.5.2.7所示:
第十九章13461.png

图19.5.2.7 FileZilla连接开发板

        至此,开发板FTP服务就搭建完成了。
19.5.3 sshd测试
        SSHD不仅包含SSH服务,也包含scp指令,SSHD不需要进行配置,只需要创建一个登陆用户即可,前面在FTP设置中已经创建了一个名为“zuozhongkai”的用户,所以这里就不用再创建用户了,直接使用“zuozhongkai”这个用户即可。SSHD默认会启动开启,然后在后台运行,开发板linux系统启动的时候会输出SSHD开启信息,如图19.5.3.1所示:
第十九章13706.png

图19.5.3.1 SSHD服务自启动

        从图19.5.3.1可以看出,SSHD服务开机自启动了,如果SSHD启动失败并且提示“sshd: /var/empty must be owned by root and not group or world-writable.”,此时我们需要修改/var/empty目录所属用户以及用户组,输入如下命令:
  1. chown root:root /var/empty
复制代码

        完成以后重启开发板即可,进入系统以后通过“ps”命令来查看sshd后台服务,如图19.5.3.2所示:
第十九章13963.png

图19.5.3.2 后台运行的sshd

        sshd测试方法很简单,使用MobaXterm软件通过SSH服务登录即可,打开MobaXterm软件,点击“Session”按钮,在弹出的“Session settings”界面上选择“SSH”。打开以后在“Remote Host”栏填写开发板的IP地址,勾选后面的“Specify username”,并且填写登录用户名,比如:zuozhongkai,配置完成以后如图19.5.3.3所示:
第十九章14183.png

图19.5.3.3 SSH配置

        配置好以后点击“OK”按钮,此时就会打开ssh会话框,并且要求你输入用户密码,如图19.5.3.4所示:
第十九章14255.png

图19.5.3.4 SSH登录

输入sshd用户密码,可能会弹出是否保存密码对话框,选择保存即可。如果密码正确的话就会登录到开发板上,如图19.5.3.5所示:
第十九章14338.png

图19.5.3.5 SSH登录成功

        同样的,我们也可以在ubuntu下通过ssh命令登录开发板,输入如下命令:
  1. ssh <a href="mailto:zuozhongkai@192.168.1.251" target="_blank">zuozhongkai@192.168.1.251</a>
复制代码

        其中“zuozhongkai”为登录账户名字,192.168.1.250是开发板的IP地址。用户名和开发板IP地址之间用“@”符号链接起来。第一次与开发板建立连接的时候会让你进行确认,输入“yes”就行了,如图19.5.3.6所示:
第十九章14545.png

        图 19.5.3.6 确认建立连接输入“yes”以后就会让你输入“zuozhongkai”用户密码,如图19.5.3.7所示:
第十九章14613.png

        图19.5.3.7 输入zuozhongkai用户密码

        如果密码正确的话就会登录进开发板,可以对开发板进行各种操作,如图19.5.3.8所示:
第十九章14687.png

图19.5.3.8 通过SSH对开发板进行操作

        输入“exit”命令即可退出SSH会话。
19.5.4 创建自启动文件
        前面在测试busybox的根文件系统的时候都是直接在/etc/init.d/rcS里面添加自启动相关命令的,但是buildroot构建的根文件系统中就不需要直接在/etc/init.d/rcS中添加自启动命令了,默认情况下buildroot构建的根文件系统中rcS文件内容如图19.5.4.1所示:
第十九章14901.png

图19.5.4.1 rcS默认内容

        从图19.5.4.1中可以看出,rcS默认会在/etc/init.d目录下查找所有以‘S’开头的脚本,然后依次执行这些脚本。所以我们可以自己创建一个以‘S’开头的自启动脚本文件,比如我创建一个名为Sautorun的自启动文件,命令如下:
  1. cd /etc/init.d/                                        //进入/etc/init.d目录
  2. touch Sautorun                                //使用touch命令创建Sautorun脚本
  3. chmod 777 Sautorun                        //给予Aautorun脚本可执行权限
复制代码

        最后在Sautorun脚本里面输入要执行的命令,比如要开机自启动test这软件,那么Sautorun脚本内容如图19.5.4.2所示:
第十九章15231.png

图19.5.4.2 Sautorun脚本内容

        设置好以后重启开发板,此时Sautorun脚本就会被rcS调用,进而运行test软件。
19.5.5 显示路径
        这里我们重点说一下另外一个问题,我们使用buildroot构建的根文件系统启动以后会发现,输入命令的时候命令行前面一直都是“#”,如果我们进入到某个目录的话前面并不会显示当前目录路径,如图19.5.5.1所示:
第十九章15420.png

图19.5.5.1 目录路径未显示

        从图19.5.5.1可以看出,我们当前所处的目录是/etc,但是前面的提示符一直是“#”,这样不利于我们查看自己当前所处的路径。最好能像Ubuntu一样,可以指出当前登录的用户名,主机名以及所处的目录,如图19.5.5.2所示:
第十九章15556.png

图19.5.5.2 Ubuntu shell命令前缀信息

        我们现在就来设置,实现图19.5.5.2中所示的效果。我们要先了解一下“PS1”这个环境变量,PS1用于设置命令提示符格式,格式如下:
  1. PS1 = ‘命令列表’
复制代码

        命令列表中可选的参数如下:
  1. \!:显示该命令的历史记录编号。
  2. \#:显示当前命令的命令编号。
  3. \$:显示$符作为提示符,如果用户是root的话,则显示#号。
  4. \\:显示反斜杠。
  5. \d:显示当前日期。
  6. \h:显示主机名。
  7. \n:打印新行。
  8. \nnn:显示nnn的八进制值。
  9. \s:显示当前运行的shell的名字。
  10. \t:显示当前时间。
  11. \u:显示当前用户的用户名。
  12. \W:显示当前工作目录的名字。
  13. \w:显示当前工作目录的路径
复制代码

        我们打开/etc/profile文件,文件内容如下所示:
示例代码19.5.5.1 /etc/profile文件要屏蔽的内容
  1. 1  export PATH="/bin:/sbin:/usr/bin:/usr/sbin"
  2. 2  
  3. 3  if [ "$PS1" ]; then
  4. 4          if [ "`id -u`" -eq 0 ]; then
  5. 5                  export PS1='# '
  6. 6          else
  7. 7                  export PS1='$ '
  8. 8          fi
  9. 9  fi
  10. 10
  11. 11 export EDITOR='/bin/vi'
  12. 12
  13. 13 # Source configuration files from /etc/profile.d
  14. 14 for i in /etc/profile.d/*.sh ; do
  15. 15         if [ -r "$i" ]; then
  16. 16                 . $i
  17. 17         fi
  18. 18 done
  19. 19 unset i
复制代码

        第3~9行就是设置PS1环境变量的值,我们可以直接修改这部分代码,但是不建议大家这么做,因为我们及时修改正常了,但是后续如果重新编译buildroot并解压以后,/etc/profile文件又会被重新替换掉,我们又得修改/etc/profile。
        第14~17行,从这里可以看出,/etc/profile文件执行的时候会遍历/etc/profile.d目录下的所示.sh脚本文件,然后执行这些.sh脚本文件。所以我们可以在/etc/profile.d目录下创建一个自定义的.sh脚本文件,然后在此脚本文件里面添加PS1初始化代码就行了,这样即使后面重新编译了buildroot也不用担心此.sh脚本会被替换掉。
        在/etc/profile.d目录下新建一个名为“myprofile.sh”的shell脚本文件,并且给予此文件可执行权限,命令如下:
  1. cd /etc/profile.d/                                //进入/etc/profile.d目录
  2. touch myprofile.sh                                //创建myprofile.sh文件
  3. chmod 777 myprofile.sh                        //给予myprofile.sh可执行权限
复制代码

最后在myprofile.sh里面添加如下所示内容:
示例代码19.5.5.2 /etc/profile添加的内容
  1. 1 #!/bin/sh
  2. 2
  3. 3 PS1='[\u@\h]:\w$ '
  4. 4 export PS1
复制代码

        重点是第3行,也就是设置PS1环境变量,格式就是:
  1. [user@hostname]:currentpath$:
复制代码

        user:用户名。
       hostname:主机名。
       currentpath:当前所处目录绝对路径。
设置好以后的myprofile.sh文件内容如图19.5.5.3所示:
第十九章17139.png

图19.5.5.3 修改后的myprofile.sh文件

        myprofile.sh文件创建完成以后重启开发板,这个时候我们就如到某个目录的时候命令行就会有提示,如图19.5.5.4所示:
第十九章17236.png

图19.5.5.4 命令提示符

        从图19.5.4可以看出,命令提示符显示正常了,完整的显示除了用户名、主机名和当前路径。至此,buildroot构建根文件系统就已经全部完成了,当然了,很多第三方软件本章并没有使能,大家可以自行根据实际需求选择对应的第三方软件和库。
19.6 烧写根文件系统到EMMC中
        至此,一个最基本的buildroot根文件系统就制作好了,我们可以将其打包烧写到开发板中。虽然编译buildroot的时候已经生成了rootfs.ext4格式的根文件系统,但是!我们实际上还在自行创建了一些文件,因此buildroot编译出来的rootfs.ext4不实用,所以还是需要我们对上面测试过的根文件系统打包,然后再烧写。
19.6.1 根文件系统打包
        首先对/home/zuozhongkai/linux/nfs/rootfs目录下的根文件系统打包,打包方法和18.6.1小节一模一样,大家参考18.6.1小节打包即可,最终得到一个名为“rootfs.ext4”的根文件系统包。
19.6.2 烧写到EMMC
        打包完成以后就可以使用STM32CubeProgrammer软件烧写到开发板EMMC中,烧写方法在18.6.2小节详细讲解了。
19.6.3 EMMC启动测试
        烧写完成以后就可以从EMMC启动测试了,需要设置uboot下面的bootcmd和bootargs这两个环境变量,命令如下:
  1. setenv bootcmd 'ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
  2. setenv bootargs 'console=ttySTM0,115200 root=/dev/mmcblk1p3 rootwait rw'
  3. saveenv
  4. boot
复制代码

        启动以后如图19.6.3.1所示:
第十九章18076.png

图19.6.3.1 从EMMC启动

        从EMMC启动的话默认是不开启网络的,需要我们自行开启,输入“ifconfig -a”命令查看当前开发板所有网卡信息,如图19.6.3.2所示:
第十九章18170.png

图19.6.3.3 当前开发板所有网卡

        从图19.6.3.3可以看出,当前开发板有两个网卡:eth0和lo,其中eth0就是开发板的千M有线网卡,lo是回测用的。但是eth0这个网卡默认是没有启用的,大家输入“ifconfig”命令可以查看当前正在工作的网卡,如图19.6.3.4所示:
第十九章18317.png

图19.6.3.4 当前系统启用的网卡

        从图19.6.3.4可以看出,当前系统就只启用了lo网卡,eth0网卡并没有启用,所以我们需要手动打开eth0网卡,输入如下命令:
  1. ifconfig eth0 up                        //打开eth0网卡
复制代码

        输入上述命令以后就会打开eth0网卡,如图19.6.3.5所示:
第十九章18470.png

图19.6.3.5 eth0网卡启动

        从图19.6.3.5可以看出,eth0网络连接成功,网速为1Gbps。注意!如果你的开发板连接的路由器或交换机是百M的,那么网速可能为100Mbps!
        再次输入“ifconfig”命令就可以看到eth0网卡打开了,如图19.6.3.6所示:
第十九章18614.png

图19.6.3.6 eth0网卡打开

        从图19.6.3.6可以看出,此时eth0网卡已经打开了,但是此时开发板网络还不能使用,因为我们还没有配置eth0网卡地址信息,如果开发板没有连接路由器,而是直接连接的交换机或者电脑,那么只能手动设置eth0网卡地址信息,命令如下:
  1. ifconfig eth0 192.168.1.250 netmask 255.255.255.0
复制代码

        如果需要开机自动设置静态IP地址,那么就可以在/etc/init.d/Sautorun中添加如下两行:
  1. ifconfig eth0 up                                                                        //打开eth0
  2. ifconfig eth0 192.168.1.250 netmask 255.255.255.0                //设置IP地址
复制代码

        修改完Sautorun文件以后执行一次sync命令,确保修改的内容写入到Sautorun文件里面,而不是写入到缓存中。最后重启开发板,此时系统启动的时候就会自动打开eth0网卡,并且设置静态IP地址。
        如果开发板连接路由器的话就更简单了,不需要我们手动设置静态IP地址,直接使用“udhcpc”命令从路由器获取动态IP地址即可,如图19.6.3.7所示:
第十九章19130.png

图19.6.3.7 udhcpc动态获取IP地址

        从图19.6.3.7可以看出,开发板通过udhcpc命令获取到了192.168.1.157这个IP地址。



出0入0汤圆

发表于 2021-6-25 19:54:34 | 显示全部楼层
点个赞,提个问,什么时候出yocto的教程
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 06:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表