你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32MP1嵌入式Linux驱动开发指南V1.7——Buildroot根文件系统构建

[复制链接]
STMCU小助手 发布时间:2022-9-24 21:51
Buildroot根文件系统构建: e5 }' }; f( }2 ]! t$ c
上一小节我们学习了如何使用busybox来构建根文件系统,但是busybox构建的根文件系统不齐全,很多东西需要我们自行添加,比如lib库文件。在我们后面的驱动开发中很多第三方软件也需要我们自己去移植,这些第三方软件有很多又依赖其他的库文件,导致移植过程非常的繁琐。本章我们来学习一下另外一种更加实用的根文件系统构建方法,那就是使用buildroot来构建根文件系统。( n1 H0 V5 }3 G# H7 R: L/ v  Q, r5 `
5 Z/ Q% f" `3 T3 r" y
19.1 何为buildroot?
9 [, ^) q: g) Y- B. O  D19.1.1 buildroot简介1 {& A# c2 T1 q3 \# e$ @
在上一章我们讲解了如何使用busybox构建文件系统,busybox仅仅只是帮我们构建好了一些常用的命令和文件,像lib库、/etc目录下的一些文件都需要我们自己手动创建,而且busybox构建的根文件系统默认没有用户名和密码设置。在后续的实验中,我们还要自己去移植一些第三方软件和库,比如alsa、iperf、mplayer等等。那么有没有一种傻瓜式的方法或软件,它不仅包含了busybox的功能,而且里面还集成了各种软件,需要什么软件就选择什么软件,不需要我们去移植。答案肯定是有的,buildroot就是这样一种工具,buildroot比busybox更上一层楼,buildroot不仅集成了busybox,而且还集成了各种常见的第三方库和软件,需要什么就选择什么,就跟我们去吃自助餐一样,想吃什么就拿什么。buildroot极大的方便了我们嵌入式Linux开发人员构建实用的根文件系统。& u# [0 O: o9 i5 j. C+ @, e) }+ R
从busybox开始一步一步的构建根文件系统适合学习、了解根文件系统的组成,但是不适合做产品(主要是自己构建的话会有很多不完善、没有注意到的细节)。buildroot会帮我们处理好各种细节,根文件系统也会更加的合理、有效。因此在做产品的时候推荐大家使用buildroot来构建自己的根文件系统,当然了,类似buildroot的软件还有很多,比如yocto,一般半导体厂商会选择yocto来制作系统包,但是由于国内的网络环境,yocto编译起来会有很多问题!
- K7 d# y( d$ K2 ^buildroot和uboot、kernel很类似,我们需要到其官网上下载源码,然后对其进行配置,比如设置交叉编译器、设置目标CPU参数等,最主要的就是选择所需要的第三方库或软件。一切配置好以后就可以进行编译,编译完成了以后就会在一个文件夹里面存放好编译结果,也就是根文件系统。
2 N7 N: f2 Q/ e/ v0 @( l注意!buildroot制作的根文件系统也是放到ubuntu的nfs目录下的rootfs文件夹,因此如果rootfs文件夹已经存放了前面busybox制作的根文件系统,那么请大家对其做一份备份,然后清空rootfs文件夹。6 K. I: H, S. @% l0 ~9 i! D
19.1.2 buildroot下载
  P" c- B: R% y( _* B/ e- {buildroot源码肯定是要从buildroot官网下载,打开以后的官网界面如图19.1.2.1所示:1 b) }* O7 m  N- ?# l! k+ R- o
$ H0 _0 G9 i2 W) ]+ |# k" k. g2 X
001322bc85944841a7d581ad015795c7.png 9 A' P# w. z" a" J! }9 T8 e. G" S3 C

3 f7 M- e2 Q: v2 _% w* v# w图19.1.2.1 buildroot官网界面5 m# Y) Y8 ^; \6 h1 I. ]
点击图19.1.2.1中的“DOWNLOAD”按钮即可打开buildroot的下载界面,如图19.1.2.2所示:4 e) Y7 Q% N9 q9 B6 j

& t& z& l/ B- `) v& n 0eb95dbfc3ce4380b219fa059a155304.png
) P8 C* Y0 i& ?+ Z7 x1 h, o  \" o) Z% V7 `
图19.1.2.2 buildroot下载界面
) x0 U! B8 T3 d6 ^可以看出,在写本教程的时候最新的LTS(长期支持版)版buildroot为2020.02.8,分为.gz和.bz2两种压缩格式,这里我就使用右侧的.bz2压缩格式的源码,选中以后下载即可。但是笔者在此前测试的都是2020.02.6版本的,为了保险起见,我们就使用2020.02.6版本的。我们已经将其放到了开发板光盘中,路径为:1、例程源码-》7、buildroot源码-》buildroot-2020.02.6.tar.bz2,一切准备好以后就可以使用buildroot构建根文件系统了。
0 U7 I( Y) F! Y, I1 r  k19.2 buildroot构建根文件系统. V* u) Y- p3 t- T! u6 u: D9 i
19.2.1 配置buildroot5 S3 J- `9 `* D$ L1 ^( {5 }/ E
将buildroot源码buildroot-2020.02.6.tar.bz2拷贝到ubuntu中,拷贝完成以后对其进行解压,命令如下:
# B+ m: ^3 m) h: q; xtar -vxjf buildroot-2020.02.6.tar.bz29 E5 _7 B7 e) C" I6 t- e( G: f
解压完成以后就会得到一个名为“buildroot-2020.02.6”的目录,此目录就是我们解压得到的buildroot源码,进入到此目录中,此目录下的文件如图19.2.1.1所示:# v) l+ a# D' o, P

# @0 I0 @2 i# N  K e09fdc369dc74675a054b494781b1974.png
: W" Q/ Y0 f/ O7 M2 L0 r6 P4 K8 i0 q9 P3 L% `7 x* k6 R, S  f& r
图19.2.1.1 buildroot源码文件
. ^' g- e. ^5 W, U( j7 |) j4 Pbuildroot和uboot、Linux kernel一样也支持图形化配置,输入如下命令即可打开图形化配置界:) `1 F$ T% I2 E$ E9 N# L- [
make menuconfig
, _! g' m; s) T' \- {打开以后的图形化配置界面如图19.2.1.2所示:/ C) d! j* J/ T& _5 Z% p

, t" ]* Y5 _# d3 l f184427c2078444c8266ca6ff3cb954f.png
0 K5 Y7 Y9 e9 d' Z9 ?
2 S+ j1 Z( x2 s: z% T1 [图19.2.1.2 buildroot图形化配置界面) e, F% _( F8 Q/ ~, _
接下来我们就依次配置buildroot,配置完成以后就可以进行编译了。" d, y+ {, C4 R& ?
1、配置Target options
* O3 K* q; A4 d1 r+ n3 L% n3 `首先配置Target options选项,需要配置的项目和其对应的内容如下(“=”号后面是配置项要选择的内容!):- S( N3 T9 [2 e$ _/ @
Target options
( {6 L& m8 _) z8 J9 H- {- A2 o-> Target Architecture = ARM (little endian). l; g4 r$ l( z% L: c; e
-> Target Binary Format = ELF
5 ^* h3 u( t9 R! u+ a; K& X-> Target Architecture Variant = cortex-A7
0 g& \6 P+ |& D* a6 W, ~3 l% m-> Target ABI = EABIhf
' e3 c2 M4 v) k$ f" s4 W; H( g-> Floating point strategy = NEON/VFPv40 H3 I  M5 @! Y  S* j* j
-> ARM instruction set = ARM" f. N7 g$ u/ u' v6 u; S! [3 W
配置完成以后如图19.2.1.3所示:, ]' V$ W# ]% c" u1 R: x

5 i9 b0 W2 E* v8 ]4 c/ U1 R 8df9d24ba86e4e9091891aede33ef59d.png
$ Y9 s, u0 g4 ?: m/ w. T- t2 `5 t* f5 |
图19.2.1.3 配置好的Target options选项
' h3 o5 P7 z" q; ~0 v8 B5 r2、配置Toolchain- [( B9 O4 o% U& h
此配置项用于配置交叉编译工具链,也就是交叉编译器,这里设置为我们自己所使用的交叉编译器即可。buildroot其实是可以自动下载交叉编译器的,但是都是从国外服务器下载的,鉴于国内的网络环境,强烈推荐大家设置成自己所使用的交叉编译器。需要配置的项目和其对应的内容如下:: @2 s; i- N, J. [
Toolchain
6 o3 C0 B, ~3 W. O2 z-> Toolchain type = External toolchain
2 e3 ]% }- F. y3 {8 P0 u: L-> Toolchain = Custom toolchain //用户自己的交叉编译器
6 ?& u0 Y( c# G& _- _/ w-> Toolchain origin = Pre-installed toolchain //预装的编译器
0 ~7 Q7 p+ U; C-> Toolchain path = /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf
/ z! W; T. n) P/ M-> Toolchain prefix = ( A R C H ) − n o n e − l i n u x − g n u e a b i h f / / 前 缀 − > E x t e r n a l t o o l c h a i n g c c v e r s i o n = 9. x − > E x t e r n a l t o o l c h a i n k e r n e l h e a d e r s s e r i e s = 4.20. x / / 交 叉 编 译 器 的 l i n u x 版 本 号 − > E x t e r n a l t o o l c h a i n C l i b r a r y = g l i b c / e g l i b c − > [ ∗ ] T o o l c h a i n h a s S S P s u p p o r t ? ( N E W ) / / 选 中 − > [ ∗ ] T o o l c h a i n h a s R P C s u p p o r t ? ( N E W ) / / 选 中 − > [ ∗ ] T o o l c h a i n h a s C + + s u p p o r t ? / / 选 中 − > [ ∗ ] E n a b l e M M U s u p p o r t ( N E W ) / / 选 中 T o o l c h a i n 下 几 个 比 较 重 要 的 选 项 需 要 说 明 一 下 , 如 下 所 示 : T o o l c h a i n : 设 置 为 C u s t o m t o o l c h a i n , 表 示 使 用 用 户 自 己 的 交 叉 编 译 器 。 T o o l c h a i n o r i g i n : 设 置 为 P r e − i n s t a l l e d t o o l c h a i n , 表 示 使 用 预 装 的 交 叉 编 译 器 。 T o o l c h a i n p a t h : 设 置 自 己 安 装 的 交 叉 编 译 器 绝 对 路 径 ! b u i l d r o o t 要 用 到 。 T o o l c h a i n p r e f i x : 设 置 交 叉 编 译 器 前 缀 , 要 根 据 自 己 实 际 所 使 用 的 交 叉 编 译 器 来 设 置 , 比 如 我 们 使 用 的 是 a r m − n o n e − l i n u x − g n u e a b i h f − g c c , 因 此 前 缀 就 是 (ARCH) -none-linux-gnueabihf //前缀 -> External toolchain gcc version = 9.x -> External toolchain kernel headers series = 4.20.x //交叉编译器的linux版本号 -> External toolchain C library = glibc/eglibc -> Toolchain has SSP support? (NEW) //选中 -> Toolchain has RPC support? (NEW) //选中 -> Toolchain has C++ support? //选中 -> Enable MMU support (NEW) //选中 Toolchain下几个比较重要的选项需要说明一下,如下所示: Toolchain:设置为Custom toolchain,表示使用用户自己的交叉编译器。 Toolchain origin:设置为Pre-installed toolchain,表示使用预装的交叉编译器。 Toolchain path:设置自己安装的交叉编译器绝对路径!buildroot要用到。 Toolchain prefix:设置交叉编译器前缀,要根据自己实际所使用的交叉编译器来设置,比如我们使用的是arm-none-linux-gnueabihf-gcc,因此前缀就是(ARCH)−none−linux−gnueabihf//前缀−>Externaltoolchaingccversion=9.x−>Externaltoolchainkernelheadersseries=4.20.x//交叉编译器的linux版本号−>ExternaltoolchainClibrary=glibc/eglibc−>[∗]ToolchainhasSSPsupport?(NEW)//选中−>[∗]ToolchainhasRPCsupport?(NEW)//选中−>[∗]ToolchainhasC++support?//选中−>[∗]EnableMMUsupport(NEW)//选中Toolchain下几个比较重要的选项需要说明一下,如下所示:Toolchain:设置为Customtoolchain,表示使用用户自己的交叉编译器。Toolchainorigin:设置为Pre−installedtoolchain,表示使用预装的交叉编译器。Toolchainpath:设置自己安装的交叉编译器绝对路径!buildroot要用到。Toolchainprefix:设置交叉编译器前缀,要根据自己实际所使用的交叉编译器来设置,比如我们使用的是arm−none−linux−gnueabihf−gcc,因此前缀就是(ARCH)-none-linux-gnueabihf,其中ARCH我们前面已经设置为了arm。
/ W& w6 g* {( D7 a: Z- wExternal toolchain kernel headers series:这个设置的是交叉编译器所对应的linux内核版本号,gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf所对应的linux内核版本号为4.20,因此这里需要设置为4.20.x!大家一定要根据自己所使用的交叉编译器来设置,否则编译的时候会报版本不一致的错误。
" Z8 Q3 t; m+ N; D7 w5 h3、配置System configuration
8 q( y7 t$ w3 ?4 [) f此选项用于设置一些系统配置,比如开发板名字、欢迎语、用户名、密码等。需要配置的项目和其对应的内容如下:  j' T3 y5 s7 o+ g% x
System configuration* a2 B' g8 B8 r/ `
-> System hostname = ATK-stm32mp1 //平台名字,自行设置
( W3 u% C) ?. c1 Y* [-> System banner = Welcome to alientek STM32MP157 //欢迎语4 R3 T1 m3 i2 }  j5 i% g
-> Init system = BusyBox //使用busybox7 }% @+ ^& p7 d7 C9 s
-> /dev management = Dynamic using devtmpfs + mdev //使用mdev/ j/ C" `" d! ?, V
-> [] Enable root login with password (NEW) //使能登录密码9 C" v: {! q, ]% h$ D# F/ v; X
-> Root password = 123456 //登录密码为123456
! i% f% u1 x! B在System configuration选项中可以配置平台名字,登录密码等信息。可以看出buildroot里面可以设置登录密码,但是作为实验,不建议大家设置登录密码,否则开发板每次重启都要输入密码,不方便开发。
0 e. e9 Y3 m6 w* r4 d9 D* l! q4、配置Filesystem images
4 g$ i' E/ i  a7 ^. s此选项配置我们最终制作的根文件系统为什么格式的,配置如下:) r! }/ d1 v: g% N
-> Filesystem images+ N5 S9 {; k  b5 x$ ^1 z. E3 i
-> [] ext2/3/4 root filesystem //如果是EMMC或SD卡的话就用ext3/ext4
' @; z6 [: d1 r-> ext2/3/4 variant = ext4 //选择ext4格式1 U  A9 E7 m# a) [
-> exact size =1G //ext4格式根文件系统1GB(根据实际情况修改)  i1 a( x5 I7 z$ Q
ubi image containing an ubifs root filesystem //如果使用NAND的话就用ubifs
1 ]  A3 C7 x/ S8 }0 s2 o可以看出,buildroot可以直接制作出ext4格式的根文件系统,但是一般我们会自行往根文件系统里面添加很多其他的文件,所以产品开发完成以后需要自行打包根文件系统,然后烧写到开发板里面。不管是针对EMMC的ext4格式的根文件系统还是针对NAND的ubi格式的根文件系统,都要设置相应的大小,比如这里我们设置的ex4格式根文件系统大小为1GB。; m$ g6 Z0 j+ H. L5 g9 z0 X
5、禁止编译Linux内核和uboot
5 f# b- \/ y7 r6 R7 obuildroot不仅仅能构建根文件系统,也可以编译linux内核和uboot。当配置buildroot,使能linux内核和uboot以后buildroot就会自动下载最新的linux内核和uboot源码并编译。但是我们一般都不会使用buildroot下载的linux内核和uboot,因为buildroot下载的linux和uboot官方源码,里面会缺少很多驱动文件,而且最新的linux内核和uboot会对编译器版本号有要求,可能导致编译失败。因此我们需要配置buildroot,关闭linux内核和uboot的编译,只使用buildroot来构建根文件系统,首先是禁止Linux内核的编译,配置如下:  F% j& n  ?# z/ y9 B" z
-> Kernel9 Z1 g  v4 H- p* D! o
-> [ ] Linux Kernel //不要选择编译Linux Kernel选项!
, |9 r- K4 d. R3 X如图19.2.1.4所示:
; A+ z$ |9 U2 L
  U* Y+ J" }+ u; H  V6 O 9d51820c9f514e048666ce620196ab52.png
% p# G4 v5 M, g
" \9 |1 f2 K9 d" l' j& }图19.2.1.4 不编译Linux内核" f+ G( A2 H1 V# |- x
接着禁止编译Uboot,配置如下:
2 |0 Y2 H* X- x4 ?-> Bootloaders
0 E- }6 {" [) C$ ^. r9 w-> [ ] U-Boot //不要选择编译U-Boot选项!
2 Y1 e, o6 g4 w1 a如图19.2.1.5所示:
$ s# G* D8 [* z- Q9 i: L
  P! s& Z3 m* n6 }/ }- ? 3523f4a8a29d47bb8559b96059fe1803.png   F. ]0 x) B; T
' \( @  w) O7 c1 p+ m
图19.2.1.5 不编译U-Boot' |" r6 b' u/ V+ `6 J4 D* E
6、配置Target packages
& c  t7 w4 Z- }此选项用于配置要选择的第三方库或软件、比如alsa-utils、ffmpeg、iperf等工具,这里我们先只选择内核的模块加载相关软件,配置如下:6 H& ~4 y5 w' b3 w# Z2 I* J" @2 F5 T
-> Target packages
( X" b# t! V) z; ?1 J; v4 B, ^-> System tools
  ]# \5 q: L7 L; s, w3 l$ [# l$ w kmod //使能内核模块相关命令% U5 A4 c! e' I* y1 M) b5 _2 x& M
上面的配置是使能内核模块相关的操作命令,比如depmod等,如图19.2.1.6所示:* x( o  w1 g# P0 f; b) w
# p8 `9 t0 i% h; Q4 R
8a6b49f40b5340e091d39bf19f08ec3e.png 8 _/ E) O! w& m* s  o% U
, ?' Y4 d! |% a! w5 {
图19.2.1.6 使能模块操作相关命令
' Y8 N/ i; d" @; Q; W- @8 i# T6 G至于其他的第三方库这里就先不选择了,先编译一下最基本的根文件系统,如果没有问题的话再重新配置选择第三方库和软件。否则一口吃太多会容易撑着的,编译出问题的时候都不知道怎么找问题。3 e. ?/ @) J/ `5 x: \1 t$ X
7、保存配置项
2 ^1 k/ Q7 k& x, N和uboot、kernel一样,通过图形化界面配置好buildroot以后最好保存一下配置项,防止清除工程以后将配置项给删除掉。buildroot的默认配置项都保存在configs目录下,配置完成以后选择,然后输入要设置的配置项名字,如图19.2.1.7所示:
+ Q7 W. ]! P/ u8 S+ Q1 G5 S7 r% _. z  n0 O& |
b803bcaaecb64031a10dbc33ace5dd08.png
8 E9 T" Y  C% c- p& q& |% M4 }% Q+ p* T: f# f
图19.2.1.7 保存配置项6 p1 Z- ?. r, e) T" {3 }$ Y
我们将配置项命名为“stm32mp1_atk_defconfig”,以后要重新配置buildroot的话就可以直接输入:
. G" x0 a6 n) B) g, R+ Imake stm32mp1_atk_defconfig
  X; S6 ^( K5 P# P- M' G5 a保存完成以后就会在buildroot的configs目录下看到“stm32mp1_atk_defconfig”,如图19.2.1.8所示:! d) W- C" G. Q* M

1 }! p' a6 ?/ x3 H 036f151c6f7940e6b230c05098155d70.png 5 L+ ?) L" X# a! i+ ^
( c5 V# J) m3 E) {  Q2 J
图19.2.1.8 保存好的buildroot配置文件8 P9 _% g- Q6 n6 _& t' S8 I( L
19.2.2 编译buildroot
+ o- y0 t/ m, ?/ f! m$ d配置完成以后就可以编译buildroot了,编译完成以后buildroot就会生成编译出来的根文件系统压缩包,我们可以直接使用。输入如下命令开始编译:" ^5 x# A, j' B
sudo make //注意,一定要加sudo,而且不能通过-jx来指定多核编译!!!& Z, X! G) l9 J
buildroot编译的时候会先从网上下载所需的软件源码,有些软件源码可能下载不下来,这个时候就需要我们自行处理,这个后面会详细的讲解。
$ M- m8 T1 ^- Q* Z, D' l9 c. Ubuildroot编译过程会很耗时,因为所需要的所有软件要先从网上下载源码,很多软件都是从外网下载的,速度比较慢,在加上电脑配置的不同,整个编译过程可能需要几十分钟甚至数小时,请耐心等待!
' W, h- W% E  B  y1 {8 ?4 obuildroot因为要从网上下载源码,因此可能存在有些源码无法下载或下载很慢的情况,比如如图19.2.2.1所示:
* I5 s( G1 a7 b* e8 i+ i0 s
) s% E" k, g; f/ K3 l 60b47930851640dea7df4f9c2d801210.png
% w+ \- @6 T, s4 u  i- S
: d8 K3 K( v: Y: ~图19.2.2.1 下载cmake-3.8.2.tar.gz- C; t2 A& e3 K& |. G# H
可以看出图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压缩包,加快编译速度!* U0 u5 D- T( K9 A$ D( l9 j: V5 M
等待编译完成,编译完成以后就会在buildroot-2020.02.6/output/images下生成根文件系统,如图19.2.2.2所示:8 }# N1 N9 z$ x$ v9 ~0 r; h/ N2 ?7 T4 c

' E0 Y8 W4 V$ J& ]; c& v 5732a740da9d416fad491930b736c920.png : |* T, o& M* l, K' ?  Y0 S& a) d- }, `# Q2 j

! m3 f; q* Y( S+ {9 d图19.2.2.2 编译生成的根文件系统0 j0 d- _9 V( B
从图19.2.2.2可以看出,编译出来了多种格式的rootfs,比如ext2、ext4、ubi等。rootfs.ext4就是可以直接使用STM32CubeProgrammer烧写到开发板中的。但是我们后面的开发都是通过nfs挂载的方式,所以我们就使用rootfs.tar进行测试。将rootfs.tar拷贝到在nfs目录下的rootfs文件夹中并解压,命令如下:" |( }6 r" B5 H6 x
cd /home/zuozhongkai/linux/tool/buildroot-2020.02.6/output/images
5 x  V- J) L  N9 B/ y5 D3 Acp rootfs.tar /home/zuozhongkai/linux/nfs/rootfs/ -f //拷贝rootfs.tar( U2 n! w) T! c) C# y
cd /home/zuozhongkai/linux/nfs/rootfs/ //进入到rootfs目录下9 N/ G# r$ E/ a9 q+ ~. D, p
tar -vxf rootfs.tar //解压缩rootfs.tar2 X- T. X. f" }* C7 ?5 h% r0 v( G6 y
rm rootfs.tar //删除rootfs.tar) S+ e, S  j  H* s
解压缩完成以后的rootfs目录如图19.2.2.3所示:- e6 I% Y* k* R

+ E' G0 Y8 }; J/ C3 k5 w4 ] 53bd89a6209747bab4a92fc0448e2e1e.png
, ?8 y; A. j( G& |/ ?. a1 Z/ j& A( _7 F
图19.2.2.3 使用buildroot编译出来的根文件系统
( t0 A; O( _6 I图19.2.2.3就是使用buildroot编译出来的根文件系统,我们可以通过nfs挂载到开发板上,然后对其进行测试。: B1 R# G1 a% u% ~! P) j! S
19.2.3 buildroot根文件系统测试
6 a4 J" t! ]; R. }; t( s8 E- Obuildroot制作出来的根文件系统已经准备好了,接下来就是对其进行测试。测试方法也是通过nfs挂载的方式,启动uboot,修改bootargs环境变量,设置nfsroot目录为Ubuntu中的rootfs目录,命令如下:* R+ f! {, V6 k
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::eth0ff’’
% A9 e  ?0 U' W+ K设置好以后启动系统,进入根文件系统以后如图19.2.3.1所示:
5 T0 Z! h2 B$ E' d! d7 o. J* w: @
cd377803917d4c7482439af278cc3eb1.png ( w6 {1 S, B/ S! j9 Q. Z/ y

( |, k. Z6 a  \# M. x0 J& b图19.2.3.1 buildroot根文件系统! {( B" \: e5 t
在图19.2.3.1中,首先要进入到/lib/modules目录,但是默认没有,因此需要我们自行创建此目录。buildroot构建的根文件系统启动以后会输出我们前面设置的欢迎语“Welcome to alientek STM32MP157”。然后需要输入用户名和密码,用户名是“root”,如果配置buildroot的时候设置了密码,那么就需要输入密码,这里我们没有设置密码,因此输入用户名就行了,如图19.2.3.2所示:8 }1 \  l8 ?) b9 z0 U
9 t+ Y% g8 l/ U& u; l
663156ee80ed462d99ea42481f94f466.png
& Z- O" |/ D& W
8 M5 E/ h, c- N" |7 h图19.2.3.1 buildroot根文件系统文件8 C: k( \7 T& }) Q2 d
可以看出的buildroot构建的根文件系统运行基本没有问题,但是这个根文件系统是最简单的,我们并没有在buildroot里面配置任何第三方的库和软件,接下来我们就配置buildroot,使能一些常见的第三方软件。
$ ~( P" ]/ _$ r19.3 buildroot下的busybox配置/ A, z* I* u0 E& v3 e' x5 e: }$ K
19.3.1 busybox配置
2 }) X' V( e( C8 H$ a. Y, z+ ]; Obuildroot在构建根文件系统的时候也是要用到busybox的,既然用到了busybox那么就涉及到busybox的配置。buildroot会自动下载busybox压缩包,buildroot下载的源码压缩包都存放在/dl目录下,在dl目录下就有一个叫做“busybox”的文件夹,此目录下保存着busybox压缩包,如图19.3.1.1所示:  q9 [4 D, f! o  J5 L

' s1 d; B! Q; V) j- Z$ D8 M 6f3757d0742b49fd8fb7938666002888.png : V" \5 R2 `8 A2 t7 R7 D( W: q
; L& L- q- E$ Y! Z8 o
图19.3.1.1 busybox源码! {( Z$ b- E. @/ Y# e7 V" k' s2 K
可以看出,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所示:4 F- K3 c* y& ~! j* M
' V9 c' ]) f& p1 @+ v  Y6 C
5ebdeddfdfd24196af966c5acaebfdf4.png
1 U3 R; @( J# J" P
, W: P, {1 K+ u0 q图19.3.1.2 busybox源码0 e  \- I9 _7 u* f
如果大家想要修改busybox源码的话就直接在图19.3.1.2中找到相应的文件,然后修改即可。我们现在是要配置buildroot下的busybox,因此肯定要打开busybox的配置界面,在buildroot源码根目录下输入如下命令:
, ]4 k5 U7 Y) ?$ y5 o5 msudo make busybox-menuconfig* K: Z$ ]7 e5 h. |* H7 u2 L
输入以后就会打开buildroot下的busybox配置界面,如图19.3.1.3所示:% [# W% I' |* s( U, e: p
" ^7 o5 H" a5 K+ ~$ }* ~# d
621c4cac11b34297a491529214894118.png 2 ?* h/ B" I5 o9 Q; Y
+ _0 L3 X; F9 ?
图19.3.1.3 buildroot下的busybox配置界面( ~: W' R  X, K; |8 w9 r$ E
图19.3.1.3就是我们最熟悉的busybox配置界面了,大家想要配置什么就直接操作就行了,或者参考第十八章即可。6 o: O- L3 Z: [* k6 r
19.3.2 busybox中文字符的支持
# y" c, c0 s0 b, y7 J在第十八章我们讲过了,busybox对中文字符显示做了限制,因此必须要修改相关的文件,具体修改过程参考18.2.2小节即可,这里就不再赘述了。. W# x* E+ d7 F: H/ y  O
19.3.3 编译busybox
* S6 `. a6 t( m9 q配置好以后就可以重新编译buildroot下的busybox,进入到buildroot源码目录下,输入如下命令查看当前buildroot所有配置了的目标软件包,也就是packages:- j% i) L# `) P, X8 ~" d7 U
sudo make show-targets
: f# N, U6 D2 x! s" a3 _" G) C结果如图19.3.3.1所示:
+ g) l5 D. z( v( T$ d! H9 |7 @5 S$ Y& _% T" B
4569161f616a456fb6a62ed1ad8d8905.png $ e# s. }) f2 E

% ]9 S5 K/ n; b图19.3.3.1 当前buildroot下的所有packages
% M; ^3 [' S3 K图19.3.3.1中列出了当前buildroot中所有使能了的packages包,其中就包括busybox,如果我们想单独编译并安装busybox的话执行下面命令即可:. F, P# y& u& k- i; Q
sudo make busybox
8 G! I' z& Q( P' e2 @上述命令就会重新编译busybox。编译完成以后重新编译buildroot,主要是对其进行打包,输入如下命令:0 Y! k% e0 @5 B- |  _: A" v
sudo make
# {8 }0 H+ K8 y* X  o: Q( w重新编译完成以后查看一下output/images目录下rootfs.tar的创建时间是否为刚刚编译的,如果不是的话就删除掉rootfs.tar,然后重新执行“sudo make”重新编译一下即可。最后我们使用新的rootfs.tar启动Linux系统。6 J1 ^% j; z% x
19.4.3 使用自己的busybox源码3 @3 y5 q. ^$ B
buildroot会自行下载busybox并编译,但是有时候我们不想要buildroot自带的busybox,我们想要使用自己配置好的busybox,比如第十八章我们已经配置好的busybox。这个可以在buildroot中实现,只要进行相应的配置,指定要使用的busybox源码目录即可。这个要自己编写buildroot的local.mk文件,在此文件里面指定busybox目录,在buildroot的configs目录下新建一个名为“local.mk”的文件,然后在里面输入如下格式内容:
" A  v& C* `7 w/ o3 M) a* X7 d4 IXXXXXX_OVERRIDE_SRCDIR=‘具体路径’
8 |" m% [2 ~* h( |比如指定busybox路径的时候就使用:, O# r- v% q8 C  L5 T7 C, b
BUSYBOX_OVERRIDE_SRCDIR=/home/zuozhongkai/linux/busybox/busybox-1.32.0
& a' \1 O: j3 H1 Q& \# Clocal.mk准备好以后就可以配置buildroot,使用local.mk,打开buildroot的配置界面需要配置的项目和其对应的内容如下(“=”号后面是配置项要选择的内容!):( o* }; c+ J: u# k) r- A" c9 f
-> Build options% W5 t2 @. u2 d7 x; Q; w9 K
-> location of a package override file = ./configs/local.mk 指定local.mk所在目录
6 b7 q# Q! u: \3 y: Z8 G1 ]9 L如图19.4.3.1所示:) D5 s2 s! K/ T

( ~& M; N$ \! L' a/ W- c5 ^: W. f  ]0 { cad8405c498046a894871d20b714e7c8.png
* D5 h2 F, W. s: O: M7 t: a; S9 U/ G$ q' P4 R% K
图19.4.3.1 设置local.mk' C4 c4 F0 x3 f( @6 P
图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所示:0 v: H; W- t1 X# W" j; o

- ^$ r7 V% |3 r8 _* c! y  l/ y7 R c44ebd32e2b141f9b92da1881d35d543.png 0 P5 Z0 d1 L. X% T- {7 Q6 ?  k

& F" K/ J2 ]% X/ M! x图19.4.3.2 使用自定义busybox源码  Y. Q5 S& s2 U! w1 d  W3 `6 U
从图19.4.3.2可以看出,此时buildroot中的busybox版本号变为了1.32.0。为了方便开发,建议大家使用buildroot自带的busybox,也就是1.31.0版本的。. K6 N0 w' q( A/ c8 \0 H
19.4 buildroot第三方软件和库的配置
7 I' \1 O2 b" h+ d5 @上一小节我们通过buildroot制作了一个最基本的根文件系统,本节我们来学习一下如何配置buildroot使能一些第三放软件或库,比如FTP和SSH服务等。" Y. w$ l( b+ j; E6 b# }
19.4.1 使能VSFTPD服务3 i" d( y1 j% {( {+ i
我们可以在开发板上搭建一个FTP服务器,这样我们就可以使用FileZilla软件直接向开发板拷贝文件,或者将开发板中的文件拷贝到电脑中。这里我们通过使能buildroot中的vsftpd软件来完成FTP服务器的搭建,配置路径如下:5 Z8 O3 J# x$ o+ `' t4 i
-> Target packages4 i" r( h, s+ T. [! X
-> Networking applications
* r3 v4 `/ i; e' x, p
1 j* ?9 V) m( j vsftpd //使能vsftpd
% a$ ^9 ?* ]8 K5 K' ]: ?如图19.4.1.1所示:
9 M% L* e- T/ r: i
0 N1 n/ e5 n9 q. k5 _: U 4c3af9c7ae4f4f2981f3f581837f1ada.png
5 d- R7 D8 {# Q; G3 s7 G( X! T$ {" X, \5 F9 l$ h+ e5 ^& N: D6 h
图19.4.1.1 使能vsftpd
( t: r  t; L  i4 Q, n19.4.2 使能SSH7 A' a/ L7 h: s+ n
有时候我们需要远程登录开发板,这个时候就可以通过网络登录,要用到SSH服务,OpenSSH是SSH的开源免费版本。直接使能buildroot中的OpenSSH即可,配置路径如下:) F7 T* R# ]6 B5 w0 |
-> Target packages
; ^2 v# ]" I8 u8 Y& L7 h  e-> Networking applications
6 h' S4 F# u. n+ n0 M$ A$ [. O4 ]" G( H% ?4 G; b' W
openssh //使能openssh
0 t' O9 g2 t% \8 z% {3 q如图19.4.2.1所示:+ p* M2 Z. i8 Y5 b. x7 P$ |
2 P- ?9 Q3 e" s% }) S
d42fb4a4d7774faca56f776032b3f726.png
/ {( O2 m* j) H) M# k  R" X$ C: b
' |1 |  y$ D# k8 b* Q! u图19.4.2.1 使能openssh
2 V6 U" X, K0 n3 o/ N1 S等待编译完成就可以使用新的根文件系统进行测试了,将ouput/images/rootfs.tar拷贝到nfs目录下的rootfs目录中,然后重新解压。注意,以前自己添加的文件并不会被删除掉的,解压命令如下:
9 I; G8 Y4 u( u7 ]tar -vxf rootfs.tar
) G: G. |9 Q9 d, w9 o" X解压完成以后就可以使用FTP和SSH等相关的软件了,由于FTP和SSH都是通过网络进行数据传输的,因此需要先配置网络,如果是通过nfs挂载的根文件系统,那么网络已经初始化完成了,因此可以直接使用。如果是烧写到EMMC里面的,那么就需要先配置网络相关功能。
% B( n' [+ i# [3 D关于VSFTPD和SSH的测试稍后再讲解。  P& I7 o/ ?# Y6 X, V
19.5 buildroot根文件系统测试# ~& S3 K: b. V+ ~
buildroot的根文件系统制作好以后就是测试工作了,基本测试内容和18.5小节一样,这里就不赘述了,我们重点讲解一下其他的测试内容。8 U  P2 T9 P. A
19.5.1 depmod命令测试8 q3 Q3 }0 W% U; G% @3 E! {
depmod命令非常重要,我们后面学习Linux驱动的时候需要使用此命令分析模块的依赖性,此命令需要在busybox中使能,路径如下:+ a# d! ^1 ]  [; [. j
-> Linux Module Utilities
5 x+ d3 D: R) O depmod //使能depmod命令! [0 \% [" b, T
如图19.5.1.1所示:
5 B- t- y# C2 m9 ^
" H4 X! t% g% H( t4 n+ E 57b78ffdcace4acda8ce42b3bceddab0.png
1 l% R, ?0 P; G8 _
0 _+ u- p/ n; N9 ~6 Z5 D; ?图19.5.1.1 使能depmod命令6 b4 F- i6 o: p' C# e
默认情况下depmod命令是使能了的,但是如果大家输入depmod命令以后发现不存在,那么就自行重新配置一下buildroot下的busybox,按照上面的方法使能depmod命令并编译一次即可,最后使用新的buildroot根文件系统启动,输入depmod命令,一般会有如图19.5.1.2所示错误提示:
# I% k' _5 r) M% K# Z! x
0 S, d3 ^4 X8 Z+ P: m6 e  v: d3 R6 L 508112ea71e94549a7270578cc8f2760.png
3 g" n9 Y( n* x, F; e, x% Z
( v) Y  v: @, t5 U' k- l图19.5.1.2 depmod命令错误提示
5 t. ~" M1 p" c/ ?从图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目录下,既然当前根文件系统不存在这个目录,那么就手动创建此目录,命令如下:0 S: H6 X; l* ^$ ]8 }
mkdir /lib/modules/5.4.31 -p
6 \6 o- i. Q+ C+ s3 t  U创建好以后在执行depmod命名就不会报错了,并且depmod命令会在lib/modules/5.4.31目录下生成三个文件:modules.alias、modules.dep、modules.symbols,如图19.5.1.3所示:
$ {- ~8 r( G3 T
" I" A6 c, N- p, B) z6 G5 d4 M[attachimg]50**[/attachimg]
: a& M0 ?- c' F# |' A8 E
4 ?4 \- r4 }0 L0 o  |8 N& q' D图19.5.1.3 depmod命令产生的三个文件" x4 k, a+ i# o; F
图19.5.1.3中这三个文件不需要我们去操作,系统会自己使用这三个文件。9 F+ z+ }6 c, {8 y$ L7 l
19.5.2 vsftpd测试; w4 \, X5 T4 ^% A
接下来测试一下用vsftpd搭建的FTP服务器,在测试之前要先进行一些设置,首先需要对vsftpd进行配置,打开/etc/vsftpd.conf文件,将下面两行前面的“#”去掉:
0 Y) t$ M, e& l6 P9 \local_enable=YES //取消掉前面的‘#’
% f! o( w4 X4 E& nwrite_enable=YES //取消掉前面的‘#’
- V1 p" `1 X8 O" X2 o接下来需要修改/etc/vsftpd.conf文件的所属用户,默认为sshd用户,我们要将其改为root用户,输入如下命令:
- K; v0 s* Y4 n: n. J/ s& Mchown root:root /etc/vsftpd.conf //修改vsftpd.conf文件所属用户( \$ l1 J4 a4 F6 Q& f+ L' d- V  G/ ~
必须修改vsftpd.conf的所有用户以及所属用户组,否则vsftpd运行的时候会报错!修改以后的vsftpd.conf所属用户以及用户组就都是root了,如图19.5.2.1所示:( A8 h7 r5 Y/ Y5 b

! ^( i9 }) r. K 5dbd6dc87d444aed8e80d04b65a62fc8.png
+ {  |2 q  Z8 s; z# F
' c2 @" Z2 U% w. ~' t4 o图19.5.2.1 修改后的vsftpd.conf所属用户和用户组+ B% U# b+ U" b' k* T1 C% Q8 A
最后在开发板上使用adduser命令新建一个用户要来完成FTP登录,如图19.5.2.2所示:! V# Z- K( h, r+ \" Y- L  O
9 t7 Y1 H) `: t6 P) [
bf11a771ac954177a4636e8c35e077dd.png 8 A" N3 [7 }  _3 b' X" x) ^# G: S
/ P: [4 f8 `! X# f/ B4 g
图19.5.2.2 新建“zuozhongkai”用户3 f4 N; o3 V$ u* G8 q. W
创建完成以后就会在/home目录下存在“zuozhongkai”用户目录,如图19.5.2.3所示:
/ ~8 J1 s' |1 d& H9 I  Z  T6 N4 r2 _! v$ Y; S$ G9 r8 b6 |3 n
888b9be870e74ae2b43a6a3cb72341aa.png ; m8 Z3 q* G# N$ Y2 S

" ^( [, v: c1 K0 a* e; Z图19.4.3.3 zuozhongkai用户目录/ |9 X9 l' C4 ]) F7 p7 t" W
设置完成以后重启开发板,vsftpd服务默认会使能!启动log信息如图19.5.2.4所示:3 d- Z2 @+ Y7 f7 z2 S! n

+ S4 O( }' l  ~ 69ae209c14ab49cd9ffdb651d1d0684d.png ) `2 \3 r  S% x6 G# F( U8 Q8 ?

# V* T4 o" }* G) I0 G  D3 P图19.5.2.4 vsftpd开机自启动1 c3 b' V; F  x8 K# J  l2 ^
从图19.5.2.4可以看出,开机以后vsftpd默认已经启动了,大家可以输入“ps”命令查看一下,结果如图19.5.2.5所示:7 ], V/ r3 r7 T' b! S8 ?
7 z- h( n6 V& b. @+ B, P' g% s
282e7e92ddbf4440b8f9a284446dcd21.png
5 k& _, |, L; a" x( p5 T' O- J5 Q8 H/ i. r0 f+ k: O& O! O
图19.5.2.5 后台运行的vsftpd软件- G: V' F" ^4 K, J
至此vsftpd服务已经正常运行了,我们可以使用FileZilla来登录开发板,用户名使用前面创建的“zuozhongkai”即可,如图19.5.2.6所示:) g  ^; T# n: s6 D
* y' i* X4 R  L+ P# t2 N6 ~
78b0cb3a0c9a44d4ab82c00dc831ef65.png
1 ~+ H; P8 T5 D4 [3 ~8 p7 B5 F% i. \2 W/ B7 F& w& ~' P
图19.5.2.6 设置FileZilla" ?4 c1 J) d1 ~* I" }- U  C
设置好以后就可以连接了,连接成功以后如图19.5.2.7所示:  c2 T/ u+ m, f4 N3 M0 n1 p. x

$ W1 B6 |# k/ S 7d5e4791ec78462e99c6c3165d875180.png 8 p2 N% ^  u! v4 c
+ `0 S' d# ^' O3 n! c7 d! E( y
图19.5.2.7 FileZilla连接开发板
# R. F% \, w& H! |6 ]至此,开发板FTP服务就搭建完成了。
: T  F- U$ H7 ?4 S$ `4 Y& ]) G19.5.3 sshd测试( ]/ J' t! n0 g- P# @
SSHD不仅包含SSH服务,也包含scp指令,SSHD不需要进行配置,只需要创建一个登陆用户即可,前面在FTP设置中已经创建了一个名为“zuozhongkai”的用户,所以这里就不用再创建用户了,直接使用“zuozhongkai”这个用户即可。SSHD默认会启动开启,然后在后台运行,开发板linux系统启动的时候会输出SSHD开启信息,如图19.5.3.1所示:
& v- U3 |6 W5 m8 K, Z4 F# ~1 a  ]: C: J% ^3 y
22f6d34c94a04c048a8612599b2e8fd7.png
, K, B6 A, E4 g4 A  A1 j" U/ i: l6 A+ N, |. d# g4 \0 ]
图19.5.3.1 SSHD服务自启动# Z  b: p  X7 D9 X0 v/ b
从图19.5.3.1可以看出,SSHD服务开机自启动了,如果SSHD启动失败并且提示“sshd: /var/empty must be owned by root and not group or world-writable.”,此时我们需要修改/var/empty目录所属用户以及用户组,输入如下命令:% b6 d2 t' W; P* G" i
chown root:root /var/empty
" s0 o9 {& t9 o% @1 ~( z  i# y; C! X/ G; \完成以后重启开发板即可,进入系统以后通过“ps”命令来查看sshd后台服务,如图19.5.3.2所示:/ ~, h4 N) p$ K8 a/ k( {
0 b8 z# ~% _" X- W  z& e5 r8 c; _
e6b7482f6c1541dbb877c84bdf823730.png
+ M3 ^$ l* \0 F; W
: b" X3 A6 s" ~图19.5.3.2 后台运行的sshd9 V9 Z% s& d8 B2 }1 `4 A# x
sshd测试方法很简单,使用MobaXterm软件通过SSH服务登录即可,打开MobaXterm软件,点击“Session”按钮,在弹出的“Session settings”界面上选择“SSH”。打开以后在“Remote Host”栏填写开发板的IP地址,勾选后面的“Specify username”,并且填写登录用户名,比如:zuozhongkai,配置完成以后如图19.5.3.3所示:& W% ?! c5 z- \  E
" [1 b5 D3 S9 m2 G4 p
35ae5adc3d3346f195a21adb3b38217b.png " x3 {6 I$ {# }8 S: J' o
( X3 L% u2 W6 ?, y5 I/ H( O
图19.5.3.3 SSH配置
- @. X6 j1 @! O- W4 k配置好以后点击“OK”按钮,此时就会打开ssh会话框,并且要求你输入用户密码,如图19.5.3.4所示:
7 g' `$ H; F) N9 v& \5 P( @- g
  n, M, l1 h+ j$ _4 K  Q# z" |3 i3 p0 z 8356eb8feae74d65bd0d753d14c810d8.png - D2 H  f, N) O- q! y3 Z  j# J  V, i

7 F' x, s0 N, k5 ?# l6 x+ F( p- a图19.5.3.4 SSH登录
* x. D: G! x- Z0 G) h6 v+ s. H3 G$ H1 M' ?输入sshd用户密码,可能会弹出是否保存密码对话框,选择保存即可。如果密码正确的话就会登录到开发板上,如图19.5.3.5所示:
+ u4 D/ z' m# T9 }
) c0 n% V" ~, a 04441b8bdc864fba92b2927a4705ab58.png
" `1 W, M# f0 w) S: c1 |. A4 g% f# }2 o# y- P
图19.5.3.5 SSH登录成功
* G3 Y9 t3 R) u' L7 t4 E! ?同样的,我们也可以在ubuntu下通过ssh命令登录开发板,输入如下命令:
0 f1 H/ k* E& ^, h2 H2 Q其中“zuozhongkai”为登录账户名字,192.168.1.250是开发板的IP地址。用户名和开发板IP地址之间用“@”符号链接起来。第一次与开发板建立连接的时候会让你进行确认,输入“yes”就行了,如图19.5.3.6所示:
. E9 Z( x& G8 i9 f2 V
; f0 y" u# t6 E, @9 v1 x! A 4066c2e4ad974eea8d5526e8679e13ea.png 0 }! O3 m" w8 l: e

. {5 |# c4 I; {. k图 19.5.3.6 确认建立连接3 e  i" N: a7 f8 L; J
输入“yes”以后就会让你输入“zuozhongkai”用户密码,如图19.5.3.7所示:( l* P' v4 E. {/ w( I9 f2 P5 C+ R
图19.5.3.7 输入zuozhongkai用户密码
- G# W. }( [3 ^9 }+ i如果密码正确的话就会登录进开发板,可以对开发板进行各种操作,如图19.5.3.8所示:
/ N7 ?8 S5 I" e4 |* _6 s, t
: V: A* c% L  B4 z$ ]$ N- v; n" _ 282f44730cba481595cb2abf336f1169.png
8 [" U8 [% q; n! `4 V1 d: c9 p" ^4 w0 @2 A
图19.5.3.8 通过SSH对开发板进行操作* |- k0 a/ v2 E
输入“exit”命令即可退出SSH会话。
/ h7 d0 p9 Z% S: @3 G2 T  L19.5.4 创建自启动文件1 P- C: W, h' E  v! |$ _
前面在测试busybox的根文件系统的时候都是直接在/etc/init.d/rcS里面添加自启动相关命令的,但是buildroot构建的根文件系统中就不需要直接在/etc/init.d/rcS中添加自启动命令了,默认情况下buildroot构建的根文件系统中rcS文件内容如图19.5.4.1所示:
: O, B/ e! k4 g! F, _- ~% X5 r$ b
20513e90d57d4f47bfe14cf37470a901.png
5 s1 j9 m& W" h9 ~. q- W1 Y6 C4 z
( M; N/ K6 l9 M图19.5.4.1 rcS默认内容( `! C- r% u( @9 y7 j
从图19.5.4.1中可以看出,rcS默认会在/etc/init.d目录下查找所有以‘S’开头的脚本,然后依次执行这些脚本。所以我们可以自己创建一个以‘S’开头的自启动脚本文件,比如我创建一个名为Sautorun的自启动文件,命令如下:; D0 a* N/ L* _
cd /etc/init.d/ //进入/etc/init.d目录9 o8 `9 n/ l& n! \$ `; x) O, P9 g9 f
touch Sautorun //使用touch命令创建Sautorun脚本9 @8 ]; `; ^4 [1 f% W% H
chmod 777 Sautorun //给予Aautorun脚本可执行权限
& N/ P' e1 }! k0 v; Z' _& b; t. n最后在Sautorun脚本里面输入要执行的命令,比如要开机自启动test这软件,那么Sautorun脚本内容如图19.5.4.2所示:
* @% W8 b& q" K! v7 ]4 d5 C$ ~
+ y+ S- h$ N9 @/ H2 b 80153f3f868143c68aa62d91a831c41a.png
3 u8 m8 N' e. U2 e- ?% }/ n( C) M% q/ C2 U  V+ u) y  n' y; I
图19.5.4.2 Sautorun脚本内容9 c, D: F6 m3 R! E6 c- j9 I
设置好以后重启开发板,此时Sautorun脚本就会被rcS调用,进而运行test软件。! h/ `# @/ ^" y, j9 A' ^
19.5.5 显示路径
) o( \# U/ G2 C) Z- f3 ]这里我们重点说一下另外一个问题,我们使用buildroot构建的根文件系统启动以后会发现,输入命令的时候命令行前面一直都是“#”,如果我们进入到某个目录的话前面并不会显示当前目录路径,如图19.5.5.1所示:
( i, t  n' Y$ @% \: [. q: }, s% I- W5 G2 k8 ?
313b7a55f7fe4da595e7f024050dd031.png
  H( I$ a+ n: {# m& S: j/ r" E' V3 ]$ c) e( N  T( ?6 {

! B0 ]2 k" P$ {' Y# d图19.5.5.1 目录路径未显示
5 A* Q$ e. I" k3 c1 T3 g$ d! T7 p从图19.5.5.1可以看出,我们当前所处的目录是/etc,但是前面的提示符一直是“#”,这样不利于我们查看自己当前所处的路径。最好能像Ubuntu一样,可以指出当前登录的用户名,主机名以及所处的目录,如图19.5.5.2所示:
2 G2 ]2 `! ^9 ]& C( k: g+ R6 Z" r/ K3 j2 i3 t' c7 h
fbb0cc4785204b0590c1313aad3efe5b.png ' v7 `  r( k. z3 B5 P5 c$ F

9 d- Q& b$ o1 H1 j图19.5.5.2 Ubuntu shell命令前缀信息5 H& t+ Y& u- E, E3 n
我们现在就来设置,实现图19.5.5.2中所示的效果。我们要先了解一下“PS1”这个环境变量,PS1用于设置命令提示符格式,格式如下:/ Q8 p. O7 ?* t" p3 \, h8 D
PS1 = ‘命令列表’
3 }7 l: ~# W  S; X. V. w命令列表中可选的参数如下:
5 y9 O, A% k% a5 v' a!:显示该命令的历史记录编号。! l- ^  k6 c; F% I
#:显示当前命令的命令编号。% q" ^0 i8 ^! K' m  H7 ^: S
$:显示$符作为提示符,如果用户是root的话,则显示#号。
( q/ F" M: O; m7 u. [\:显示反斜杠。
4 K4 U6 P8 H( D# G3 u\d:显示当前日期。4 J/ q4 L! F" f) _
\h:显示主机名。% U7 V4 h7 S" p9 r& b
\n:打印新行。2 X) w, ]( r2 Y/ K- i
\nnn:显示nnn的八进制值。
5 C# ?& q5 s8 s, r8 n7 y- {$ `. q\s:显示当前运行的shell的名字。
% s# J' L- o+ O+ A) d\t:显示当前时间。6 K" R5 V. u8 K: J2 U
\u:显示当前用户的用户名。
& J) z$ _1 _) O9 ^\W:显示当前工作目录的名字。4 q1 k& j. N; z0 @( _
\w:显示当前工作目录的路径
, K/ G/ E& @% e5 d% |' B, }我们打开/etc/profile文件,文件内容如下所示:" c' e/ O( T: @' x
, f7 _/ V. N1 g/ ^, p- v. J
  1. 示例代码19.5.5.1 /etc/profile文件要屏蔽的内容$ x' k9 E3 |/ {, A
  2. 1  export PATH="/bin:/sbin:/usr/bin:/usr/sbin"
    ; V" G7 A8 u+ ]6 e3 |
  3. 2  , k; ^. {  v/ P
  4. 3  if [ "$PS1" ]; then
    4 i4 Y" X* W4 j' O: Z  F* [
  5. 4          if [ "`id -u`" -eq 0 ]; then& a* x: S; P. M! I' C
  6. 5                  export PS1='# '
    8 V: h7 X, K0 l1 C* X
  7. 6          else
    ( B" Y# G5 b/ x3 p8 ~
  8. 7                  export PS1='$ '
    : x$ s2 v4 O( D3 _& G
  9. 8          fi
    0 A5 Z8 I" E+ [9 w
  10. 9  fi9 J5 M0 z0 K3 K$ ~' c6 j
  11. 10 % I  q0 t/ x8 y) `& R
  12. 11 export EDITOR='/bin/vi'- \- `' T& O* T- Y4 [8 V( N
  13. 12
    1 Q% V' ]$ R# }4 M
  14. 13 # Source configuration files from /etc/profile.d$ f! n3 R4 X7 T
  15. 14 for i in /etc/profile.d/*.sh ; do
      L! P1 R! }# z. e' O
  16. 15         if [ -r "$i" ]; then
    / r6 x) [) t' F1 v' E* w- j4 o. m
  17. 16                 . $i
    - R4 p! ]& ^: {- W4 x
  18. 17         fi
    : B/ F+ j* g* P* u5 Y4 s) D, |1 ^" h6 I$ p
  19. 18 done$ W8 T; P, q% |1 i5 z' }
  20. 19 unset i
复制代码

6 @$ ]1 G1 y6 t' |6 a  ?第3~9行就是设置PS1环境变量的值,我们可以直接修改这部分代码,但是不建议大家这么做,因为我们及时修改正常了,但是后续如果重新编译buildroot并解压以后,/etc/profile文件又会被重新替换掉,我们又得修改/etc/profile。) O( O% P* _5 l6 O
第14~17行,从这里可以看出,/etc/profile文件执行的时候会遍历/etc/profile.d目录下的所示.sh脚本文件,然后执行这些.sh脚本文件。所以我们可以在/etc/profile.d目录下创建一个自定义的.sh脚本文件,然后在此脚本文件里面添加PS1初始化代码就行了,这样即使后面重新编译了buildroot也不用担心此.sh脚本会被替换掉。
6 I2 m0 C0 E9 o( E" W( M3 k, s/ d在/etc/profile.d目录下新建一个名为“myprofile.sh”的shell脚本文件,并且给予此文件可执行权限,命令如下:
; I9 Y, j  y9 N0 i/ P$ @% s; F8 o2 L" H' [- s
  1. cd /etc/profile.d/                                //进入/etc/profile.d目录
    : c+ H6 n1 v: C% l
  2. touch myprofile.sh                                //创建myprofile.sh文件5 l) s+ i6 y4 ?+ l! q5 Y& Z
  3. chmod 777 myprofile.sh                        //给予myprofile.sh可执行权限
复制代码

5 |$ j4 U+ Z9 v- F最后在myprofile.sh里面添加如下所示内容:9 K& m7 ?- t' B2 q% b
示例代码19.5.5.2 /etc/profile添加的内容
4 J. h6 T3 @0 I7 K- `) P- ]* Y* }8 W0 O- Z% m0 k2 i6 p, Y$ w
  1. 1 #!/bin/sh3 v+ c) b) j+ {7 W' l
  2. 2
    ! l* x+ d9 {4 G' y
  3. 3 PS1='[\u@\h]:\w$ '
    ' i/ p, B4 f' ]6 `8 ]
  4. 4 export PS1* |. p9 z! r  o) w
  5. 重点是第3行,也就是设置PS1环境变量,格式就是:1 M$ @4 z: B% ?, m: J* U
  6. [user@hostname]:currentpath$:
    5 A3 N8 p( f0 v' o  ]
  7. user:用户名。
    : y7 ~. v* |5 z! C5 r$ J' Z: g
  8. hostname:主机名。
    1 G3 d1 L) M6 L
  9. currentpath:当前所处目录绝对路径。
复制代码

; s7 O9 r$ u! G  s/ @设置好以后的myprofile.sh文件内容如图19.5.5.3所示:* j2 r2 q# J5 E
$ G/ ^7 c5 N# E8 G, E
144edaa3bc4146e8aa0fee4980e1a153.png
1 K8 m& C; I" ]9 K& |* C/ g4 @' \% o/ g. _, e3 C
图19.5.5.3 修改后的myprofile.sh文件
2 V- z% Z% i5 p: I% p) \8 Cmyprofile.sh文件创建完成以后重启开发板,这个时候我们就如到某个目录的时候命令行就会有提示,如图19.5.5.4所示:
5 J% L1 g; S" d3 X
; A3 H2 o$ q$ x% A8 ^ 0b4d9f459e5345f9a7d0c959cd59e25c.png
& r( T# T7 c0 f3 c$ V* a8 C  U/ E4 ^4 ^. H# J. Y1 k9 u" @5 ?
图19.5.5.4 命令提示符
$ R3 j2 L( Y- f7 ?9 e6 ?0 x5 u从图19.5.4可以看出,命令提示符显示正常了,完整的显示除了用户名、主机名和当前路径。至此,buildroot构建根文件系统就已经全部完成了,当然了,很多第三方软件本章并没有使能,大家可以自行根据实际需求选择对应的第三方软件和库。
* |$ N0 V5 W5 @" \4 ~; I% ^19.6 烧写根文件系统到EMMC中3 c1 D; c/ K. Z, ^% I
至此,一个最基本的buildroot根文件系统就制作好了,我们可以将其打包烧写到开发板中。虽然编译buildroot的时候已经生成了rootfs.ext4格式的根文件系统,但是!我们实际上还在自行创建了一些文件,因此buildroot编译出来的rootfs.ext4不实用,所以还是需要我们对上面测试过的根文件系统打包,然后再烧写。
3 O2 P3 Y) \0 U3 W19.6.1 根文件系统打包  B% U+ K+ R6 |$ i% m: n
首先对/home/zuozhongkai/linux/nfs/rootfs目录下的根文件系统打包,打包方法和18.6.1小节一模一样,大家参考18.6.1小节打包即可,最终得到一个名为“rootfs.ext4”的根文件系统包。
8 |# n3 S$ `8 N+ Z) r3 d6 J19.6.2 烧写到EMMC
: q# M3 o! b9 D& M* S5 L5 i! j打包完成以后就可以使用STM32CubeProgrammer软件烧写到开发板EMMC中,烧写方法在18.6.2小节详细讲解了。/ p" {9 a( |. \; r0 ?- y) L; U
19.6.3 EMMC启动测试6 ~9 @- p9 Z2 c2 U# Q) A' V
烧写完成以后就可以从EMMC启动测试了,需要设置uboot下面的bootcmd和bootargs这两个环境变量,命令如下:/ a- H# q$ p) m! b, x# y
setenv bootcmd ‘ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000’$ S; A% R7 f! K: |! p
setenv bootargs ‘console=ttySTM0,115200 root=/dev/mmcblk1p3 rootwait rw’
$ v& r* B* I( H7 v+ k  H" R0 Zsaveenv7 ~3 r  A, ?4 o5 e) j2 g) W
boot. N' a+ D8 b9 _- L
启动以后如图19.6.3.1所示:1 j. C( J+ O; D/ I0 N# Q3 C

4 A7 K7 Z6 \- A4 ^, V 07cb5b1118724168887e17a7cd7beeec.png
) l4 Y' t8 u0 J& z/ [2 N
) q3 q0 e! A# k) P# f0 R+ H9 q5 s图19.6.3.1 从EMMC启动
5 m+ X' W# b0 f6 _# e' E: ^从EMMC启动的话默认是不开启网络的,需要我们自行开启,输入“ifconfig -a”命令查看当前开发板所有网卡信息,如图19.6.3.2所示:0 g' B* u! j/ @7 T3 v$ V3 n7 _; Y1 L0 F

/ s/ v0 N# V1 t d82847b1f8af470aa6c01f5b1ca0fc0c.png 9 k/ O; X& N3 K$ G5 ~' c" C

) j: u7 e2 d* r( i; q& M图19.6.3.3 当前开发板所有网卡! h* }5 K1 `6 n. Q" a( Y; @8 y
从图19.6.3.3可以看出,当前开发板有两个网卡:eth0和lo,其中eth0就是开发板的千M有线网卡,lo是回测用的。但是eth0这个网卡默认是没有启用的,大家输入“ifconfig”命令可以查看当前正在工作的网卡,如图19.6.3.4所示:5 b% K6 }& P5 H) x) @

; l4 S% n9 M2 b1 J. `, s/ s/ w deede749402b41f6b84f45cc8b75b803.png & F' |/ E8 ^' |2 E

' ?, [8 K  u( ]6 G! u5 Y) \图19.6.3.4 当前系统启用的网卡
1 m, S% f4 C% C% l& O4 v从图19.6.3.4可以看出,当前系统就只启用了lo网卡,eth0网卡并没有启用,所以我们需要手动打开eth0网卡,输入如下命令:
% J5 s& O* B7 x5 A/ M7 yifconfig eth0 up //打开eth0网卡" T& l3 T2 b& G) d. }
输入上述命令以后就会打开eth0网卡,如图19.6.3.5所示:
+ z6 ]* o8 k: a" c* N2 J5 u/ T) ^. b/ ~( M: e7 c& ]* z
a5f4c7b250f94ce68c4ed7e523389e90.png # f7 a& w/ v& q" K3 |
% O2 z- p. B5 X$ ^2 a, T
图19.6.3.5 eth0网卡启动, N) g" C. z2 }3 F7 I3 e
从图19.6.3.5可以看出,eth0网络连接成功,网速为1Gbps。注意!如果你的开发板连接的路由器或交换机是百M的,那么网速可能为100Mbps!3 X1 d6 A. s2 p3 H' q$ A- L
再次输入“ifconfig”命令就可以看到eth0网卡打开了,如图19.6.3.6所示:
4 ~, C( B' a& p$ C9 |  X2 y- T4 W& n. T: I+ M* [
6add80f0eac6497f87da54229e6da01d.png
+ H5 A1 s0 N0 z4 M- }) X
1 m7 u7 f3 @: A$ m图19.6.3.6 eth0网卡打开- U$ j: ^" n. P1 c
从图19.6.3.6可以看出,此时eth0网卡已经打开了,但是此时开发板网络还不能使用,因为我们还没有配置eth0网卡地址信息,如果开发板没有连接路由器,而是直接连接的交换机或者电脑,那么只能手动设置eth0网卡地址信息,命令如下:% ~" m$ Y. e7 f" R# k; }1 E
ifconfig eth0 192.168.1.250 netmask 255.255.255.0( A& t: c0 ?- Y% x7 Y* S% B' N2 z
如果需要开机自动设置静态IP地址,那么就可以在/etc/init.d/Sautorun中添加如下两行:
1 @( t+ }, y% eifconfig eth0 up //打开eth0
! ^% z8 ]2 }  w$ b7 cifconfig eth0 192.168.1.250 netmask 255.255.255.0 //设置IP地址! g" F2 k+ Z1 n. U& L2 ?
修改完Sautorun文件以后执行一次sync命令,确保修改的内容写入到Sautorun文件里面,而不是写入到缓存中。最后重启开发板,此时系统启动的时候就会自动打开eth0网卡,并且设置静态IP地址。2 g8 x2 g- L$ V
如果开发板连接路由器的话就更简单了,不需要我们手动设置静态IP地址,直接使用“udhcpc”命令从路由器获取动态IP地址即可,如图19.6.3.7所示:9 i7 o/ p' W! s0 Z% d3 I

' p3 z( ~4 s8 |& x1 H5 T 90bac717d3df4015952e4ee1faea5603.png
9 n  g' M5 D# T- q1 f" e
: I- Q- H) }* x图19.6.3.7 udhcpc动态获取IP地址
* ~3 U4 X' }" i) D! r$ v从图19.6.3.7可以看出,开发板通过udhcpc命令获取到了192.168.1.157这个IP地址。
- m* b% i  y: I7 I& N————————————————
1 X! M: c1 {# }9 l5 T# C1 F版权声明:正点原子+ r6 k8 D! z9 W' {
: j: P. p) M7 H! m: L1 }2 Z  ~1 z! T
46350c5cb85744c2ba12dd7e2d2953f7.png
赞 收藏 评论0 发布时间:2022-9-24 21:51

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版