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

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

[复制链接]
STMCU小助手 发布时间:2022-9-24 21:51
Buildroot根文件系统构建
, `+ |) J4 L4 r& a: w上一小节我们学习了如何使用busybox来构建根文件系统,但是busybox构建的根文件系统不齐全,很多东西需要我们自行添加,比如lib库文件。在我们后面的驱动开发中很多第三方软件也需要我们自己去移植,这些第三方软件有很多又依赖其他的库文件,导致移植过程非常的繁琐。本章我们来学习一下另外一种更加实用的根文件系统构建方法,那就是使用buildroot来构建根文件系统。2 k! J% e3 j1 T8 H: L5 E9 [, P

, ?" [3 U4 c- L5 i9 u19.1 何为buildroot?! m8 W) a) B1 Q+ z8 n& L( z
19.1.1 buildroot简介) S, m3 D3 C# r: Z/ N+ z5 G
在上一章我们讲解了如何使用busybox构建文件系统,busybox仅仅只是帮我们构建好了一些常用的命令和文件,像lib库、/etc目录下的一些文件都需要我们自己手动创建,而且busybox构建的根文件系统默认没有用户名和密码设置。在后续的实验中,我们还要自己去移植一些第三方软件和库,比如alsa、iperf、mplayer等等。那么有没有一种傻瓜式的方法或软件,它不仅包含了busybox的功能,而且里面还集成了各种软件,需要什么软件就选择什么软件,不需要我们去移植。答案肯定是有的,buildroot就是这样一种工具,buildroot比busybox更上一层楼,buildroot不仅集成了busybox,而且还集成了各种常见的第三方库和软件,需要什么就选择什么,就跟我们去吃自助餐一样,想吃什么就拿什么。buildroot极大的方便了我们嵌入式Linux开发人员构建实用的根文件系统。
/ p$ Z  Q/ p2 ?从busybox开始一步一步的构建根文件系统适合学习、了解根文件系统的组成,但是不适合做产品(主要是自己构建的话会有很多不完善、没有注意到的细节)。buildroot会帮我们处理好各种细节,根文件系统也会更加的合理、有效。因此在做产品的时候推荐大家使用buildroot来构建自己的根文件系统,当然了,类似buildroot的软件还有很多,比如yocto,一般半导体厂商会选择yocto来制作系统包,但是由于国内的网络环境,yocto编译起来会有很多问题!
1 t* @0 g0 W# \  `2 H* Vbuildroot和uboot、kernel很类似,我们需要到其官网上下载源码,然后对其进行配置,比如设置交叉编译器、设置目标CPU参数等,最主要的就是选择所需要的第三方库或软件。一切配置好以后就可以进行编译,编译完成了以后就会在一个文件夹里面存放好编译结果,也就是根文件系统。) P- D  a$ K# ]4 j  P
注意!buildroot制作的根文件系统也是放到ubuntu的nfs目录下的rootfs文件夹,因此如果rootfs文件夹已经存放了前面busybox制作的根文件系统,那么请大家对其做一份备份,然后清空rootfs文件夹。
) b, f) o; `, w( t1 c( U19.1.2 buildroot下载0 O2 A* Y( z& M" z
buildroot源码肯定是要从buildroot官网下载,打开以后的官网界面如图19.1.2.1所示:" d$ x. Z7 q# w  q
9 N$ e( @* B4 [5 D6 d: [- m
001322bc85944841a7d581ad015795c7.png 5 j/ O7 g' j/ C: p- ]6 c, ]% Z" b
6 J! a, z$ Z7 ~8 h' z, G
图19.1.2.1 buildroot官网界面
' y( ^/ b9 _  k' y: j# Y点击图19.1.2.1中的“DOWNLOAD”按钮即可打开buildroot的下载界面,如图19.1.2.2所示:4 ], n( l; f/ |9 b
1 k! n  s: l$ L( X" t1 A
0eb95dbfc3ce4380b219fa059a155304.png $ i$ [9 {2 Z. e
, E( ~- p6 T5 X: V9 u/ _* W# {2 `
图19.1.2.2 buildroot下载界面
/ W) R5 W, p' z/ E  |% U4 @# h' _可以看出,在写本教程的时候最新的LTS(长期支持版)版buildroot为2020.02.8,分为.gz和.bz2两种压缩格式,这里我就使用右侧的.bz2压缩格式的源码,选中以后下载即可。但是笔者在此前测试的都是2020.02.6版本的,为了保险起见,我们就使用2020.02.6版本的。我们已经将其放到了开发板光盘中,路径为:1、例程源码-》7、buildroot源码-》buildroot-2020.02.6.tar.bz2,一切准备好以后就可以使用buildroot构建根文件系统了。
" F+ a8 D! ]& G: n4 o; ?1 s19.2 buildroot构建根文件系统1 G6 T8 x6 ?" C! s- h
19.2.1 配置buildroot
9 `: m: x. D( _9 E6 ?1 P, w将buildroot源码buildroot-2020.02.6.tar.bz2拷贝到ubuntu中,拷贝完成以后对其进行解压,命令如下:; g& F2 r' X1 F1 }) K
tar -vxjf buildroot-2020.02.6.tar.bz2& M/ T5 }/ t& R3 {' E
解压完成以后就会得到一个名为“buildroot-2020.02.6”的目录,此目录就是我们解压得到的buildroot源码,进入到此目录中,此目录下的文件如图19.2.1.1所示:4 R6 e0 r) i2 u
. L4 l/ h0 [% N# c4 S) p8 V+ b8 P
e09fdc369dc74675a054b494781b1974.png
) _5 }& Y% ]* p
$ G8 e( b; W+ u( h8 z图19.2.1.1 buildroot源码文件
$ n3 I% U/ L, W& N4 X5 Dbuildroot和uboot、Linux kernel一样也支持图形化配置,输入如下命令即可打开图形化配置界:& _1 P+ P0 |0 I# H* ~, p; W/ |
make menuconfig+ N* [7 h( n6 `# t0 X
打开以后的图形化配置界面如图19.2.1.2所示:
) T+ @* F* m+ H2 @8 E' {
" g; @1 Q6 A# r f184427c2078444c8266ca6ff3cb954f.png
* ~" n' n2 A; _7 k$ j: ]7 H3 |$ u/ K& s9 V% y6 Q! M
图19.2.1.2 buildroot图形化配置界面/ F0 s/ ~# N- l* k+ R" h. q) ^
接下来我们就依次配置buildroot,配置完成以后就可以进行编译了。
) N- G" \& ?2 B$ S3 e- q1、配置Target options" \3 M8 V9 |5 H# h9 Y* f, Z" A$ G
首先配置Target options选项,需要配置的项目和其对应的内容如下(“=”号后面是配置项要选择的内容!):3 \7 v4 ?. x0 P- C" C: r% H/ Y/ q$ R! i
Target options  Y, q+ ^/ k5 f, c
-> Target Architecture = ARM (little endian)
/ h, G4 r, B6 w( b. r6 b! w, Q- g-> Target Binary Format = ELF
. ~; B. l9 H5 `- y  `-> Target Architecture Variant = cortex-A7
+ y0 v2 b& u! O6 r-> Target ABI = EABIhf
7 \) ~- h$ v9 _" n# G5 r-> Floating point strategy = NEON/VFPv4: y6 c' z' _& B% X; v
-> ARM instruction set = ARM
  j) ?- h0 l$ v配置完成以后如图19.2.1.3所示:
! u5 b, }! Y+ i4 g. ]- S& e+ o) j6 f, I
* [& R( \1 g* ?" H; D, ~- ^+ Z 8df9d24ba86e4e9091891aede33ef59d.png 6 `, G( b1 D# J" D2 h

  n; N: G) X5 H; q( L图19.2.1.3 配置好的Target options选项
8 h1 H; [& i( f2、配置Toolchain& d( ^0 {7 L4 P# z: K( ^2 v, l
此配置项用于配置交叉编译工具链,也就是交叉编译器,这里设置为我们自己所使用的交叉编译器即可。buildroot其实是可以自动下载交叉编译器的,但是都是从国外服务器下载的,鉴于国内的网络环境,强烈推荐大家设置成自己所使用的交叉编译器。需要配置的项目和其对应的内容如下:
( j% T& {8 r' C- ~& a4 ^5 fToolchain
6 L$ W0 G4 N; l- ~6 F-> Toolchain type = External toolchain
+ O: P: x+ R+ B, ]4 A* h-> Toolchain = Custom toolchain //用户自己的交叉编译器+ l% b/ s4 m* D$ f
-> Toolchain origin = Pre-installed toolchain //预装的编译器! W% @- N1 X+ d6 @7 T- n; X$ v
-> Toolchain path = /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf& S. H/ `8 m2 m* ^/ S
-> 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。
5 i/ {/ d- h. s/ J* Q1 }( hExternal toolchain kernel headers series:这个设置的是交叉编译器所对应的linux内核版本号,gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf所对应的linux内核版本号为4.20,因此这里需要设置为4.20.x!大家一定要根据自己所使用的交叉编译器来设置,否则编译的时候会报版本不一致的错误。8 Y2 ^/ V) ^  e* D
3、配置System configuration4 L% f. e  p9 m0 F" I
此选项用于设置一些系统配置,比如开发板名字、欢迎语、用户名、密码等。需要配置的项目和其对应的内容如下:
: L6 V9 W- Z4 t; t  `1 G" M& g; CSystem configuration2 g4 {  t7 `% D# `4 S. B: G# ~( S: h
-> System hostname = ATK-stm32mp1 //平台名字,自行设置/ d5 |- g2 w2 f2 [4 c$ y8 N) l4 W4 R
-> System banner = Welcome to alientek STM32MP157 //欢迎语+ `1 W! E% N% S( O0 p9 m
-> Init system = BusyBox //使用busybox
" _# G% ]; W0 o$ y7 A5 L* `-> /dev management = Dynamic using devtmpfs + mdev //使用mdev
, z1 n! p6 Q1 \  c$ `8 h/ _-> [] Enable root login with password (NEW) //使能登录密码
, b! c7 z' T* u  X1 _5 @" I-> Root password = 123456 //登录密码为123456" R! ^/ c% g7 B7 K
在System configuration选项中可以配置平台名字,登录密码等信息。可以看出buildroot里面可以设置登录密码,但是作为实验,不建议大家设置登录密码,否则开发板每次重启都要输入密码,不方便开发。
- z- G4 l7 h& t8 Y4、配置Filesystem images
. Q! c( l1 c9 r此选项配置我们最终制作的根文件系统为什么格式的,配置如下:
4 \# g9 B, U$ C2 y7 _1 ^! L-> Filesystem images
3 [1 e* Q* e8 f-> [] ext2/3/4 root filesystem //如果是EMMC或SD卡的话就用ext3/ext46 X- |) ]1 h2 |5 Q) t( M2 B9 J# z5 z
-> ext2/3/4 variant = ext4 //选择ext4格式
' f9 Q& T/ N7 q. p: V( z-> exact size =1G //ext4格式根文件系统1GB(根据实际情况修改)! W% c( N) z: A" e* \
ubi image containing an ubifs root filesystem //如果使用NAND的话就用ubifs& b9 K- z5 T- |; k$ z4 w
可以看出,buildroot可以直接制作出ext4格式的根文件系统,但是一般我们会自行往根文件系统里面添加很多其他的文件,所以产品开发完成以后需要自行打包根文件系统,然后烧写到开发板里面。不管是针对EMMC的ext4格式的根文件系统还是针对NAND的ubi格式的根文件系统,都要设置相应的大小,比如这里我们设置的ex4格式根文件系统大小为1GB。( K3 l2 ~! A9 u2 f
5、禁止编译Linux内核和uboot
3 F$ S" |) V) L( ibuildroot不仅仅能构建根文件系统,也可以编译linux内核和uboot。当配置buildroot,使能linux内核和uboot以后buildroot就会自动下载最新的linux内核和uboot源码并编译。但是我们一般都不会使用buildroot下载的linux内核和uboot,因为buildroot下载的linux和uboot官方源码,里面会缺少很多驱动文件,而且最新的linux内核和uboot会对编译器版本号有要求,可能导致编译失败。因此我们需要配置buildroot,关闭linux内核和uboot的编译,只使用buildroot来构建根文件系统,首先是禁止Linux内核的编译,配置如下:
$ \3 T: o, ^% q/ }8 r8 a( a. X3 ]-> Kernel
3 J2 [9 m4 u. R% _2 m1 |-> [ ] Linux Kernel //不要选择编译Linux Kernel选项!* o& I, ?! z% m7 r% a
如图19.2.1.4所示:
- d# A5 B9 v& S
1 R4 Z8 J$ [4 Z- z2 G 9d51820c9f514e048666ce620196ab52.png
. G" ~! V$ p4 Y* [. N
* w! Y4 d  G7 Q2 L/ C0 `* Z图19.2.1.4 不编译Linux内核
' {& ?9 q& T7 P+ u接着禁止编译Uboot,配置如下:
$ b4 s% Y5 R! j8 W5 C; r  T-> Bootloaders6 d! O* F% x* i( r" K
-> [ ] U-Boot //不要选择编译U-Boot选项!
6 @* X" R& g, E+ Y8 w如图19.2.1.5所示:* [0 p/ l2 c2 _, B* F3 [( U
1 V& n& `1 I: f  y& Y
3523f4a8a29d47bb8559b96059fe1803.png
, D  J/ B8 s# k3 E0 k: B! j8 `) q! j
& z/ b& `, ?8 |5 p图19.2.1.5 不编译U-Boot( a" m) H8 m# l+ W
6、配置Target packages
* E2 Q, C* C' U; x5 f$ O3 p. Q此选项用于配置要选择的第三方库或软件、比如alsa-utils、ffmpeg、iperf等工具,这里我们先只选择内核的模块加载相关软件,配置如下:, `' {1 y! c6 z+ k3 K# |
-> Target packages" b1 n9 N# R& @0 b3 e8 t
-> System tools
5 h6 `2 N  @) ^% g. a7 ~6 i) w! ^9 \ kmod //使能内核模块相关命令
6 _3 S; ?8 ]; Q7 M上面的配置是使能内核模块相关的操作命令,比如depmod等,如图19.2.1.6所示:9 x8 d; o+ i) f, K
6 s) b% X+ _2 _8 G3 d3 n- z
8a6b49f40b5340e091d39bf19f08ec3e.png " L. X' v& s7 S9 O# |' |) Z5 O8 ]1 X

& G$ Z' M8 z4 Z' S图19.2.1.6 使能模块操作相关命令4 A. O# z( k" ^& j# O* n4 t
至于其他的第三方库这里就先不选择了,先编译一下最基本的根文件系统,如果没有问题的话再重新配置选择第三方库和软件。否则一口吃太多会容易撑着的,编译出问题的时候都不知道怎么找问题。
6 D% t$ M6 Z8 F. G4 W& k  j7、保存配置项
" V) ~' q7 f) m( o) ?和uboot、kernel一样,通过图形化界面配置好buildroot以后最好保存一下配置项,防止清除工程以后将配置项给删除掉。buildroot的默认配置项都保存在configs目录下,配置完成以后选择,然后输入要设置的配置项名字,如图19.2.1.7所示:
& T; f, G' z5 c9 `9 x" O6 L7 ~3 z) z4 I
# i; d# W/ {6 l: M* V$ _ b803bcaaecb64031a10dbc33ace5dd08.png & V2 V4 \9 Q' e# d
7 Q3 I# ?% I6 \- S* N7 r* l
图19.2.1.7 保存配置项
  C1 }; c5 V+ V! Q5 ^% e我们将配置项命名为“stm32mp1_atk_defconfig”,以后要重新配置buildroot的话就可以直接输入:
1 z6 R: r, ~* h) `+ m" Bmake stm32mp1_atk_defconfig
* x* z! w& M! b保存完成以后就会在buildroot的configs目录下看到“stm32mp1_atk_defconfig”,如图19.2.1.8所示:& e5 v( ^; E2 }& N1 q

2 m% c2 X" N, d0 j4 d4 D6 _1 D 036f151c6f7940e6b230c05098155d70.png / m: B' s' Z/ e7 g2 ~( y) M! V
* n$ ?: x$ w+ y# X, O0 b0 k
图19.2.1.8 保存好的buildroot配置文件
3 u0 z8 ?9 r/ }+ V5 o) D  m) x19.2.2 编译buildroot1 \( F* O' Y1 o( U
配置完成以后就可以编译buildroot了,编译完成以后buildroot就会生成编译出来的根文件系统压缩包,我们可以直接使用。输入如下命令开始编译:
  q+ d9 }, y5 y% Csudo make //注意,一定要加sudo,而且不能通过-jx来指定多核编译!!!6 H7 _; _) n$ [8 j  Y
buildroot编译的时候会先从网上下载所需的软件源码,有些软件源码可能下载不下来,这个时候就需要我们自行处理,这个后面会详细的讲解。
6 z  }) ]* g+ S! tbuildroot编译过程会很耗时,因为所需要的所有软件要先从网上下载源码,很多软件都是从外网下载的,速度比较慢,在加上电脑配置的不同,整个编译过程可能需要几十分钟甚至数小时,请耐心等待!
; n& T1 `2 [7 B1 l! x1 @buildroot因为要从网上下载源码,因此可能存在有些源码无法下载或下载很慢的情况,比如如图19.2.2.1所示:
! A; ^* q/ v4 W4 y3 K$ X$ k" h0 T2 |& E7 P% p
60b47930851640dea7df4f9c2d801210.png ! }0 ]! Z$ D* r

) S: n, a8 R# E& u* a% c$ S# K图19.2.2.1 下载cmake-3.8.2.tar.gz4 ]" K/ s, O% i- H' v) ^
可以看出图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压缩包,加快编译速度!
. W/ o2 C9 H+ C; b等待编译完成,编译完成以后就会在buildroot-2020.02.6/output/images下生成根文件系统,如图19.2.2.2所示:
* o/ v: E* P: c* t" W# Y! x# F& s% m# T# G
5732a740da9d416fad491930b736c920.png $ J4 v- G: d* B) G

- v; q+ o: w1 G  ]% S. l7 a" v4 p8 U图19.2.2.2 编译生成的根文件系统
5 C' i8 c/ }) M/ [4 T! `% |从图19.2.2.2可以看出,编译出来了多种格式的rootfs,比如ext2、ext4、ubi等。rootfs.ext4就是可以直接使用STM32CubeProgrammer烧写到开发板中的。但是我们后面的开发都是通过nfs挂载的方式,所以我们就使用rootfs.tar进行测试。将rootfs.tar拷贝到在nfs目录下的rootfs文件夹中并解压,命令如下:
) c. {- Z3 \( P* w! E* I6 lcd /home/zuozhongkai/linux/tool/buildroot-2020.02.6/output/images
( M; T2 B3 D$ t8 n+ L! E# ocp rootfs.tar /home/zuozhongkai/linux/nfs/rootfs/ -f //拷贝rootfs.tar: T. |! c9 B. ~6 b, z: U( Y
cd /home/zuozhongkai/linux/nfs/rootfs/ //进入到rootfs目录下
, q8 s* j5 j1 r8 N, Z  f  ztar -vxf rootfs.tar //解压缩rootfs.tar
4 }7 i8 E8 C+ x7 i) Q7 I) d3 arm rootfs.tar //删除rootfs.tar4 }1 g/ m9 p; z7 x7 H
解压缩完成以后的rootfs目录如图19.2.2.3所示:
3 `1 T, t" C. Z5 Y- c  g7 I( m: P1 ]' |1 u6 d: b1 A( ^' c
53bd89a6209747bab4a92fc0448e2e1e.png ( H; w8 K3 W9 b4 C$ z* B

% }7 l! l& @5 P1 N3 L图19.2.2.3 使用buildroot编译出来的根文件系统
* @. `4 s+ [, b' Z2 v" u, K图19.2.2.3就是使用buildroot编译出来的根文件系统,我们可以通过nfs挂载到开发板上,然后对其进行测试。
( N+ O& [/ y8 B5 ^3 Z# }7 |  T8 N19.2.3 buildroot根文件系统测试
' z' D: r* E' f9 p3 M! u" X1 c# bbuildroot制作出来的根文件系统已经准备好了,接下来就是对其进行测试。测试方法也是通过nfs挂载的方式,启动uboot,修改bootargs环境变量,设置nfsroot目录为Ubuntu中的rootfs目录,命令如下:
+ |$ h& w3 J' U3 isetenv 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’’
3 ~; b# R0 d4 {7 Q  i0 ?$ Z: y% \设置好以后启动系统,进入根文件系统以后如图19.2.3.1所示:' B% u3 B% C; q% G
: ^& a, n) e; W  \
cd377803917d4c7482439af278cc3eb1.png
, [) x1 g6 \/ D% g4 i/ W8 L( z- X3 y6 y$ |
图19.2.3.1 buildroot根文件系统
2 e0 @6 t5 z: p在图19.2.3.1中,首先要进入到/lib/modules目录,但是默认没有,因此需要我们自行创建此目录。buildroot构建的根文件系统启动以后会输出我们前面设置的欢迎语“Welcome to alientek STM32MP157”。然后需要输入用户名和密码,用户名是“root”,如果配置buildroot的时候设置了密码,那么就需要输入密码,这里我们没有设置密码,因此输入用户名就行了,如图19.2.3.2所示:+ L$ M( G* r" Z* e7 T  c7 K& L
6 N2 c; z0 J+ O1 D# k( v& A( [
663156ee80ed462d99ea42481f94f466.png ; o( `: C6 s! f  r( j

0 [# E& Q$ l$ T6 ?图19.2.3.1 buildroot根文件系统文件
" C- L" P8 r3 t& P可以看出的buildroot构建的根文件系统运行基本没有问题,但是这个根文件系统是最简单的,我们并没有在buildroot里面配置任何第三方的库和软件,接下来我们就配置buildroot,使能一些常见的第三方软件。
  K! o. \! I. O! S% N' q$ g. G19.3 buildroot下的busybox配置
3 Y4 x. Y# ]7 u7 D19.3.1 busybox配置& T  y( V7 u2 ?7 [4 X& w
buildroot在构建根文件系统的时候也是要用到busybox的,既然用到了busybox那么就涉及到busybox的配置。buildroot会自动下载busybox压缩包,buildroot下载的源码压缩包都存放在/dl目录下,在dl目录下就有一个叫做“busybox”的文件夹,此目录下保存着busybox压缩包,如图19.3.1.1所示:% V$ q# O) |' G* A
4 [1 X: b4 Z8 [1 o3 f
6f3757d0742b49fd8fb7938666002888.png ! ]0 j) C, j1 o# q- L5 H
# b. m" t) Z5 U" P4 _1 C
图19.3.1.1 busybox源码
* {' P" i3 G4 G, p4 S$ o8 m, H5 |可以看出,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所示:1 U7 O6 e8 ^5 v% u) T
; P! Y: G2 |7 e# `( ^8 {) R) l
5ebdeddfdfd24196af966c5acaebfdf4.png
& {" D5 x' E3 A% G8 u" D7 ~5 k% E. `' {( Y4 m. m2 f6 O- Q
图19.3.1.2 busybox源码
2 {/ [8 C- \  q  i$ M9 m如果大家想要修改busybox源码的话就直接在图19.3.1.2中找到相应的文件,然后修改即可。我们现在是要配置buildroot下的busybox,因此肯定要打开busybox的配置界面,在buildroot源码根目录下输入如下命令:
/ x2 Z+ O( ~5 K0 p) ?. k" F! Usudo make busybox-menuconfig2 h; r# V3 p0 N7 D# ~
输入以后就会打开buildroot下的busybox配置界面,如图19.3.1.3所示:
5 W( T8 N7 L% B) c$ x7 a+ x6 W" q/ X# S/ G: q' C. O6 k
621c4cac11b34297a491529214894118.png
8 u) ?" I7 d9 a3 H- K, m  ?# v8 @
" r7 D7 }2 y% i  q0 y) d% a图19.3.1.3 buildroot下的busybox配置界面% m' Z- @. i1 @7 D* F$ O3 e) p( r
图19.3.1.3就是我们最熟悉的busybox配置界面了,大家想要配置什么就直接操作就行了,或者参考第十八章即可。1 o  E. I, w* |" K8 F( c( K* E& g- A
19.3.2 busybox中文字符的支持; e* _( Y5 {' s$ `3 _
在第十八章我们讲过了,busybox对中文字符显示做了限制,因此必须要修改相关的文件,具体修改过程参考18.2.2小节即可,这里就不再赘述了。8 t$ d* m" F7 H6 Y0 U
19.3.3 编译busybox
1 O) v* N# T" x8 U7 H7 r配置好以后就可以重新编译buildroot下的busybox,进入到buildroot源码目录下,输入如下命令查看当前buildroot所有配置了的目标软件包,也就是packages:
# W3 j) C) f: i, _sudo make show-targets
! J+ H0 B$ m: C4 [/ U6 n9 m: q结果如图19.3.3.1所示:
! H) K" g# m- y7 I" X  ?
0 \3 v! o6 V, H 4569161f616a456fb6a62ed1ad8d8905.png + f9 p( ^# Z5 n3 @% m' R
! I1 Q) V  q, \2 i. l' N4 ~
图19.3.3.1 当前buildroot下的所有packages
" r8 w3 E& t) ~5 T. \' u图19.3.3.1中列出了当前buildroot中所有使能了的packages包,其中就包括busybox,如果我们想单独编译并安装busybox的话执行下面命令即可:2 Q( a" \+ Y/ |# U7 t/ v0 A- O
sudo make busybox) Y/ b3 d  l- ?( W& W7 w
上述命令就会重新编译busybox。编译完成以后重新编译buildroot,主要是对其进行打包,输入如下命令:7 \0 G- W5 O+ n; D' }1 O0 z0 i
sudo make# Z3 ]. \$ z/ g% ?1 B9 u
重新编译完成以后查看一下output/images目录下rootfs.tar的创建时间是否为刚刚编译的,如果不是的话就删除掉rootfs.tar,然后重新执行“sudo make”重新编译一下即可。最后我们使用新的rootfs.tar启动Linux系统。5 D0 L" E* X5 o
19.4.3 使用自己的busybox源码7 i5 I: l0 D. o; }
buildroot会自行下载busybox并编译,但是有时候我们不想要buildroot自带的busybox,我们想要使用自己配置好的busybox,比如第十八章我们已经配置好的busybox。这个可以在buildroot中实现,只要进行相应的配置,指定要使用的busybox源码目录即可。这个要自己编写buildroot的local.mk文件,在此文件里面指定busybox目录,在buildroot的configs目录下新建一个名为“local.mk”的文件,然后在里面输入如下格式内容:
/ p/ P: D4 w2 w, ]XXXXXX_OVERRIDE_SRCDIR=‘具体路径’
$ V  z# Q5 X% s, C- A* U0 Y比如指定busybox路径的时候就使用:
2 @; S+ T% T# _3 h$ o6 D" x" yBUSYBOX_OVERRIDE_SRCDIR=/home/zuozhongkai/linux/busybox/busybox-1.32.01 j1 @, Z7 D% [4 A/ [
local.mk准备好以后就可以配置buildroot,使用local.mk,打开buildroot的配置界面需要配置的项目和其对应的内容如下(“=”号后面是配置项要选择的内容!):) i" T3 m5 [& x+ r+ \- D
-> Build options
( Z6 ~$ F. e  _3 P  n# K9 P-> location of a package override file = ./configs/local.mk 指定local.mk所在目录
) R4 h6 U6 G8 ^6 O如图19.4.3.1所示:( k  d1 D+ n. q0 a
' ^3 R& n8 {/ ?" {6 S$ j0 M2 F
cad8405c498046a894871d20b714e7c8.png 4 O" v- @7 c# v4 q* }0 Z

& t1 M0 G. t+ I5 b图19.4.3.1 设置local.mk
; Z4 B! n& J& a7 k$ [图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所示:
* i+ Z! Z7 }/ A4 P9 C- p4 b; n% U9 t
6 W3 p, Q0 I" v+ R c44ebd32e2b141f9b92da1881d35d543.png
8 \. Q1 I$ o& p6 o9 s" m
+ D5 ]+ g9 F) ~. P- M图19.4.3.2 使用自定义busybox源码  d6 z# P2 a4 I) s
从图19.4.3.2可以看出,此时buildroot中的busybox版本号变为了1.32.0。为了方便开发,建议大家使用buildroot自带的busybox,也就是1.31.0版本的。
% A2 r+ Z! H# `4 O19.4 buildroot第三方软件和库的配置
, G& r4 h$ y# y5 ~0 x上一小节我们通过buildroot制作了一个最基本的根文件系统,本节我们来学习一下如何配置buildroot使能一些第三放软件或库,比如FTP和SSH服务等。6 D  m7 A7 H) q" w, _5 r9 V
19.4.1 使能VSFTPD服务& v4 e) J. C' r6 U, k+ m# R
我们可以在开发板上搭建一个FTP服务器,这样我们就可以使用FileZilla软件直接向开发板拷贝文件,或者将开发板中的文件拷贝到电脑中。这里我们通过使能buildroot中的vsftpd软件来完成FTP服务器的搭建,配置路径如下:
1 j6 v6 G- G9 ^9 h  d6 o-> Target packages
) |/ r0 y* k- j5 f. t. {-> Networking applications
2 F+ }3 X9 m8 D- s; G% T$ r* f  U; M" ~" J7 m3 W; f5 i
vsftpd //使能vsftpd, N0 D5 G/ m7 Y, P
如图19.4.1.1所示:
( y0 z5 k3 O  y- N: I
) g' \0 H6 j! u5 X* b& [7 v. [ 4c3af9c7ae4f4f2981f3f581837f1ada.png , O+ x. ^) B8 {* e& s

# J- M# a/ I2 h: P6 |# s: p图19.4.1.1 使能vsftpd
7 w$ R0 B8 ^+ V, \, `$ {! f19.4.2 使能SSH
7 h$ g* |: U) |+ F8 ^0 D有时候我们需要远程登录开发板,这个时候就可以通过网络登录,要用到SSH服务,OpenSSH是SSH的开源免费版本。直接使能buildroot中的OpenSSH即可,配置路径如下:0 F1 n1 H' L( k% E# X
-> Target packages/ |; p. G. S; W. ~
-> Networking applications
# T% S# x5 O1 F# W" x  Q8 J) I+ T8 l, o/ c/ c$ |0 \
openssh //使能openssh
4 d- W0 v5 ]* b如图19.4.2.1所示:* n! g+ c2 q0 t: G8 z+ Q

; y$ |* ^6 g; Z3 e+ `( j d42fb4a4d7774faca56f776032b3f726.png $ k& X# w. x( c& M4 ]7 z, ?
5 I. f( P% w$ P9 t$ G) l
图19.4.2.1 使能openssh3 G6 m6 o9 u. o) V, A1 j4 z
等待编译完成就可以使用新的根文件系统进行测试了,将ouput/images/rootfs.tar拷贝到nfs目录下的rootfs目录中,然后重新解压。注意,以前自己添加的文件并不会被删除掉的,解压命令如下:
8 X2 g' Q2 v4 q; e! _& O4 w3 c* ]9 ]tar -vxf rootfs.tar. S0 W2 G' H/ g6 W( O" ]5 ~0 l  p
解压完成以后就可以使用FTP和SSH等相关的软件了,由于FTP和SSH都是通过网络进行数据传输的,因此需要先配置网络,如果是通过nfs挂载的根文件系统,那么网络已经初始化完成了,因此可以直接使用。如果是烧写到EMMC里面的,那么就需要先配置网络相关功能。- r: I) k7 R* t  A) U- R1 Y4 m
关于VSFTPD和SSH的测试稍后再讲解。
( G/ n1 \) ~. T19.5 buildroot根文件系统测试
- K1 H4 \* \+ S* R- j% Bbuildroot的根文件系统制作好以后就是测试工作了,基本测试内容和18.5小节一样,这里就不赘述了,我们重点讲解一下其他的测试内容。
3 q0 O6 e7 i! w: Q, ]19.5.1 depmod命令测试
" \9 }# B9 o5 d, }depmod命令非常重要,我们后面学习Linux驱动的时候需要使用此命令分析模块的依赖性,此命令需要在busybox中使能,路径如下:
, a% V, D1 t' l* T, N! z* u0 @-> Linux Module Utilities6 ]  ]$ l9 s- A1 p
depmod //使能depmod命令8 j/ C6 g1 J6 B, o' S3 v
如图19.5.1.1所示:: E2 y0 w+ e5 K" c- o* u: Y

( z% O3 ]# w, f7 t- x  E! G* q 57b78ffdcace4acda8ce42b3bceddab0.png
( }6 z0 B/ B+ k
7 o3 B4 P5 d# x5 W! ~8 o/ \图19.5.1.1 使能depmod命令5 a3 c+ I/ p' l- {8 A6 L
默认情况下depmod命令是使能了的,但是如果大家输入depmod命令以后发现不存在,那么就自行重新配置一下buildroot下的busybox,按照上面的方法使能depmod命令并编译一次即可,最后使用新的buildroot根文件系统启动,输入depmod命令,一般会有如图19.5.1.2所示错误提示:
% K) K4 E0 {, i+ C- X
# D) \) t6 t% ?* K 508112ea71e94549a7270578cc8f2760.png # ^( l( x; H! k2 I6 _; F5 T

' f2 Q% H8 G1 |" A/ B% C/ f2 a图19.5.1.2 depmod命令错误提示
4 Y  P* }8 l" F  c, d) @从图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目录下,既然当前根文件系统不存在这个目录,那么就手动创建此目录,命令如下:
# o0 A$ ?6 c6 C. t+ cmkdir /lib/modules/5.4.31 -p  C# ^1 _+ a3 {
创建好以后在执行depmod命名就不会报错了,并且depmod命令会在lib/modules/5.4.31目录下生成三个文件:modules.alias、modules.dep、modules.symbols,如图19.5.1.3所示:
( b, \4 U1 D$ i, l5 n" u4 N/ t4 z, `' r: m5 E' K
[attachimg]50**[/attachimg]& _, b! O. e3 X$ W6 P

( z  T7 P2 m) L/ F8 _; P图19.5.1.3 depmod命令产生的三个文件3 q8 M5 t& q5 L* D- H
图19.5.1.3中这三个文件不需要我们去操作,系统会自己使用这三个文件。
! B8 o0 a5 k: g19.5.2 vsftpd测试
* l/ i, @' h# D接下来测试一下用vsftpd搭建的FTP服务器,在测试之前要先进行一些设置,首先需要对vsftpd进行配置,打开/etc/vsftpd.conf文件,将下面两行前面的“#”去掉:2 L+ j7 Z1 _1 K$ P8 m
local_enable=YES //取消掉前面的‘#’& n9 w3 z4 t( h' T' h$ a
write_enable=YES //取消掉前面的‘#’( g7 g; ]8 H: L4 e- m: n* z
接下来需要修改/etc/vsftpd.conf文件的所属用户,默认为sshd用户,我们要将其改为root用户,输入如下命令:) \9 U" f1 a+ ]- e" F
chown root:root /etc/vsftpd.conf //修改vsftpd.conf文件所属用户7 z* }- G9 x; [9 n
必须修改vsftpd.conf的所有用户以及所属用户组,否则vsftpd运行的时候会报错!修改以后的vsftpd.conf所属用户以及用户组就都是root了,如图19.5.2.1所示:& @; m) S% r/ P6 u8 J, T9 S
  Z+ v4 b, l8 k
5dbd6dc87d444aed8e80d04b65a62fc8.png
( w% b! X. F2 M* h: D- [: R/ V: O( C9 a* b; h! T
图19.5.2.1 修改后的vsftpd.conf所属用户和用户组5 u. ]8 a& c0 i/ M4 `: q
最后在开发板上使用adduser命令新建一个用户要来完成FTP登录,如图19.5.2.2所示:
! a: I% ^* J3 j/ u* _+ E
- x0 G+ J: _* j  M8 x& a' y bf11a771ac954177a4636e8c35e077dd.png ' |( P3 h$ z" c4 @

. s- D7 h, A* y' [5 r图19.5.2.2 新建“zuozhongkai”用户
0 l, v: D- D! b5 a! Q创建完成以后就会在/home目录下存在“zuozhongkai”用户目录,如图19.5.2.3所示:' p% @% u3 B- L& Z" S& C$ o
% D1 S5 F3 f1 b8 D" N6 C- _7 y
888b9be870e74ae2b43a6a3cb72341aa.png
* @- u! f- a( t- \
& B- }0 N9 v- h1 v  h2 ^图19.4.3.3 zuozhongkai用户目录
2 Q& }, q( {: |  V& f; w" a( A设置完成以后重启开发板,vsftpd服务默认会使能!启动log信息如图19.5.2.4所示:
+ |. Z! f* J: d9 M; s6 k) Z$ p4 ]* d0 A2 |' F
69ae209c14ab49cd9ffdb651d1d0684d.png
& }3 }5 x' z8 x) Z( I+ w/ D. R5 K& j# A, E* G0 h
图19.5.2.4 vsftpd开机自启动# w4 P- X* g# b/ o6 O6 p# Q
从图19.5.2.4可以看出,开机以后vsftpd默认已经启动了,大家可以输入“ps”命令查看一下,结果如图19.5.2.5所示:
0 t0 V4 l  `5 K; X7 u) h5 Q8 U8 V& [2 `+ s4 W
282e7e92ddbf4440b8f9a284446dcd21.png ' d/ l5 r/ s) a# ?3 W: ~1 e7 ^
7 ]7 q/ b3 Y9 [7 u: f4 T# b
图19.5.2.5 后台运行的vsftpd软件2 z5 [: o7 e, V: a6 O+ _
至此vsftpd服务已经正常运行了,我们可以使用FileZilla来登录开发板,用户名使用前面创建的“zuozhongkai”即可,如图19.5.2.6所示:
1 Z$ Z- p8 K' H/ b9 Q2 k
) p' W, v, o( _/ M/ K% | 78b0cb3a0c9a44d4ab82c00dc831ef65.png , u* J# o0 w$ @' @& P$ P5 m8 Q; B0 O8 k

' a$ d9 E5 o2 `  B图19.5.2.6 设置FileZilla
9 G7 x1 {5 b% @5 e  L. |8 U设置好以后就可以连接了,连接成功以后如图19.5.2.7所示:
" J# G1 e" ]1 m% Y
' x* k$ i1 n' k+ B: ? 7d5e4791ec78462e99c6c3165d875180.png : f7 O5 q" |; b7 `  m$ C

. q5 t5 ^" v' |: |9 y图19.5.2.7 FileZilla连接开发板, H' a8 z$ u. }8 ~# k
至此,开发板FTP服务就搭建完成了。
1 _% ?' ?0 ?$ g4 T. F4 y3 ]19.5.3 sshd测试
: J( T7 }7 b2 @SSHD不仅包含SSH服务,也包含scp指令,SSHD不需要进行配置,只需要创建一个登陆用户即可,前面在FTP设置中已经创建了一个名为“zuozhongkai”的用户,所以这里就不用再创建用户了,直接使用“zuozhongkai”这个用户即可。SSHD默认会启动开启,然后在后台运行,开发板linux系统启动的时候会输出SSHD开启信息,如图19.5.3.1所示:- T8 C0 J. C! f1 E  d7 Q; p/ ?4 Y

( F" S9 x) \( }6 N: u 22f6d34c94a04c048a8612599b2e8fd7.png
$ c8 U6 L7 `- b0 a& m4 [, h/ N3 M" u$ M8 x
图19.5.3.1 SSHD服务自启动
* ^5 e8 U/ J/ _+ s0 b$ j从图19.5.3.1可以看出,SSHD服务开机自启动了,如果SSHD启动失败并且提示“sshd: /var/empty must be owned by root and not group or world-writable.”,此时我们需要修改/var/empty目录所属用户以及用户组,输入如下命令:
' o7 K% e& P8 e5 echown root:root /var/empty" t' f' ?; r, v; Z- i- ?
完成以后重启开发板即可,进入系统以后通过“ps”命令来查看sshd后台服务,如图19.5.3.2所示:1 k0 N9 Y& e2 u4 s: R: S
0 ^8 C5 A4 r) s0 D5 K+ Y/ g
e6b7482f6c1541dbb877c84bdf823730.png . G9 |7 t# f( `& e2 x

! D# _8 q+ R* Q1 N1 [5 L图19.5.3.2 后台运行的sshd' J5 H# d& B" C& E) R9 P
sshd测试方法很简单,使用MobaXterm软件通过SSH服务登录即可,打开MobaXterm软件,点击“Session”按钮,在弹出的“Session settings”界面上选择“SSH”。打开以后在“Remote Host”栏填写开发板的IP地址,勾选后面的“Specify username”,并且填写登录用户名,比如:zuozhongkai,配置完成以后如图19.5.3.3所示:
9 x$ A( M5 O9 Q# x0 z( e: T4 j: p& k5 W
35ae5adc3d3346f195a21adb3b38217b.png
7 i/ ]4 ^( ?8 g; x- x/ A  x8 V: Q3 i+ z' i: b( G2 q) `" G( Z
图19.5.3.3 SSH配置
) W6 {0 U6 P" t: E+ U+ ?配置好以后点击“OK”按钮,此时就会打开ssh会话框,并且要求你输入用户密码,如图19.5.3.4所示:6 F: s4 ~" H+ b' [% K

0 h% z: u6 W& `( _- ?' p, K  t 8356eb8feae74d65bd0d753d14c810d8.png * L8 j4 k( E% c/ v7 T  ^

9 M+ ]. o$ t) Z4 h4 G图19.5.3.4 SSH登录1 W4 c* t2 N+ @0 x5 Q
输入sshd用户密码,可能会弹出是否保存密码对话框,选择保存即可。如果密码正确的话就会登录到开发板上,如图19.5.3.5所示:" q0 X& s+ C( F1 c7 [2 V

) }0 |  g2 J/ k 04441b8bdc864fba92b2927a4705ab58.png $ O) l$ {* X4 }0 K; ]6 `3 c0 P

* O4 H! t/ R% [1 `  }" n1 k9 k图19.5.3.5 SSH登录成功9 Q+ q+ k) [# g/ e3 o. ?' ]
同样的,我们也可以在ubuntu下通过ssh命令登录开发板,输入如下命令:/ e; ^! g, h# S
其中“zuozhongkai”为登录账户名字,192.168.1.250是开发板的IP地址。用户名和开发板IP地址之间用“@”符号链接起来。第一次与开发板建立连接的时候会让你进行确认,输入“yes”就行了,如图19.5.3.6所示:
" M3 v; _8 i! M$ d: m
0 e. c+ V& W# L# E& r 4066c2e4ad974eea8d5526e8679e13ea.png ) `$ Q3 F- [/ Y8 J2 M7 D' z1 S2 {

* I# c; N- a5 a5 ^图 19.5.3.6 确认建立连接2 [- x6 R6 E. ?3 \$ t% z3 `
输入“yes”以后就会让你输入“zuozhongkai”用户密码,如图19.5.3.7所示:
$ H1 {2 a1 ?$ _; g- J. h9 ]8 F. N) w图19.5.3.7 输入zuozhongkai用户密码
. I6 h, V9 M& f- i6 R, N4 d1 p如果密码正确的话就会登录进开发板,可以对开发板进行各种操作,如图19.5.3.8所示:4 ]& ~0 I& l- q4 |) G' f3 @

# C' X3 c" k. n& q! ^ 282f44730cba481595cb2abf336f1169.png
$ S: v+ k4 w  c( U
( _; c% J0 a) M9 G; g图19.5.3.8 通过SSH对开发板进行操作/ a1 s% `- p/ w' ^. _7 r
输入“exit”命令即可退出SSH会话。
" }7 `3 x( D1 c% F8 b0 m  l* f19.5.4 创建自启动文件
5 @# G$ @" O7 K9 c5 l3 _前面在测试busybox的根文件系统的时候都是直接在/etc/init.d/rcS里面添加自启动相关命令的,但是buildroot构建的根文件系统中就不需要直接在/etc/init.d/rcS中添加自启动命令了,默认情况下buildroot构建的根文件系统中rcS文件内容如图19.5.4.1所示:
% H3 b0 q2 ~1 l0 @9 |
" Z# R, @1 o8 v% m" g+ A* y* v* R 20513e90d57d4f47bfe14cf37470a901.png
* `2 R4 n4 `9 G) T# P* W
4 A. c/ M! L) |3 B图19.5.4.1 rcS默认内容" [2 e+ ?* s. V" E! h' L
从图19.5.4.1中可以看出,rcS默认会在/etc/init.d目录下查找所有以‘S’开头的脚本,然后依次执行这些脚本。所以我们可以自己创建一个以‘S’开头的自启动脚本文件,比如我创建一个名为Sautorun的自启动文件,命令如下:: s! ]* _+ B% N6 k, W) |+ A
cd /etc/init.d/ //进入/etc/init.d目录
7 c# B+ V% z& }) X6 N0 Ttouch Sautorun //使用touch命令创建Sautorun脚本9 N5 N3 J" y( @; k
chmod 777 Sautorun //给予Aautorun脚本可执行权限% n. j( ^  ?7 j
最后在Sautorun脚本里面输入要执行的命令,比如要开机自启动test这软件,那么Sautorun脚本内容如图19.5.4.2所示:$ ?# ^  S  z' y0 Q! A) [7 i6 F
9 Q- Q6 N8 F# t8 F+ Y* x
80153f3f868143c68aa62d91a831c41a.png
' i2 `' C) Y1 j9 v
9 t" p# r  \8 y8 R) z) Z4 |图19.5.4.2 Sautorun脚本内容
6 X6 R7 H5 ]; D5 B设置好以后重启开发板,此时Sautorun脚本就会被rcS调用,进而运行test软件。
  n9 n  D5 }) U19.5.5 显示路径( O! L0 {. M$ m, B
这里我们重点说一下另外一个问题,我们使用buildroot构建的根文件系统启动以后会发现,输入命令的时候命令行前面一直都是“#”,如果我们进入到某个目录的话前面并不会显示当前目录路径,如图19.5.5.1所示:
3 R6 }9 n5 R' i5 H# W
1 w# u+ W$ T3 \% R0 ` 313b7a55f7fe4da595e7f024050dd031.png # y' b& z& ]4 _( P, ?0 K, I
+ F2 a# _7 o4 g! r; [7 r* t
+ P: ^- L  J2 i$ G9 J
图19.5.5.1 目录路径未显示* l; }' j6 v2 U! M0 J
从图19.5.5.1可以看出,我们当前所处的目录是/etc,但是前面的提示符一直是“#”,这样不利于我们查看自己当前所处的路径。最好能像Ubuntu一样,可以指出当前登录的用户名,主机名以及所处的目录,如图19.5.5.2所示:: ~8 j- A' @4 U
% ~, r* E$ r( D6 C8 j& N( Q
fbb0cc4785204b0590c1313aad3efe5b.png
# M: E& Y$ Q9 D- y* j  Q) b. u) u; F/ F" x: N
图19.5.5.2 Ubuntu shell命令前缀信息
" v5 n3 @8 N% N. w& g2 d我们现在就来设置,实现图19.5.5.2中所示的效果。我们要先了解一下“PS1”这个环境变量,PS1用于设置命令提示符格式,格式如下:
* O9 v9 f8 ]1 dPS1 = ‘命令列表’1 m. t' g; S+ j9 z; w3 P
命令列表中可选的参数如下:' Z, x* w" L& s0 K4 P  S
!:显示该命令的历史记录编号。; v% ]4 [& ]; h
#:显示当前命令的命令编号。3 j/ H: u, G( `( e3 f& S
$:显示$符作为提示符,如果用户是root的话,则显示#号。* `7 @( K* t# _+ A
\:显示反斜杠。
6 C- i, V! u3 P  r* u; y\d:显示当前日期。
. w* t3 `. P5 g) i& D1 P, \- t- h\h:显示主机名。. z6 [- n, O7 I1 [$ ]
\n:打印新行。
6 H3 r4 a. n# `2 ?7 @\nnn:显示nnn的八进制值。9 n  C  o! c$ n& `9 H& @/ q/ W
\s:显示当前运行的shell的名字。" _# s0 ~8 f6 D- h7 R0 r
\t:显示当前时间。$ ]) c9 x' c& G, n8 h9 {
\u:显示当前用户的用户名。
1 k' q: m! t* \\W:显示当前工作目录的名字。
3 M5 y3 {+ h9 J\w:显示当前工作目录的路径6 S' g, [, v* _, h
我们打开/etc/profile文件,文件内容如下所示:' v" i- d9 Z/ _, D/ ^" H" q

/ A0 V" O9 [8 a; W
  1. 示例代码19.5.5.1 /etc/profile文件要屏蔽的内容: U: ~9 O' _5 D1 Z" H0 p5 ?6 J+ s
  2. 1  export PATH="/bin:/sbin:/usr/bin:/usr/sbin"
    3 J% M; b' q7 a+ y* C+ l
  3. 2  
    $ U- Y! j! x" g. h& K0 |4 w
  4. 3  if [ "$PS1" ]; then' B, d% c6 z6 ^- H0 Z$ U
  5. 4          if [ "`id -u`" -eq 0 ]; then/ `( b9 m8 T- d6 L9 ]: ~' E
  6. 5                  export PS1='# '
    ) f7 \% ^+ }, t& j* t" ~( `
  7. 6          else
    7 `0 s. k" T$ c, ]$ f
  8. 7                  export PS1='$ ', |2 Q7 o. B/ z+ {9 G0 u9 g+ o
  9. 8          fi6 J5 q, @8 a; a: B4 ]
  10. 9  fi3 q  i' e9 G: q1 r& ]
  11. 10 : ?4 {/ d0 P3 P% V1 u2 I
  12. 11 export EDITOR='/bin/vi'
    & @/ g0 R" g3 \( @
  13. 12
    ) j; n" }8 _8 F: [  d1 V$ |4 ]
  14. 13 # Source configuration files from /etc/profile.d
    $ \7 p$ y/ [# Q! n" ~
  15. 14 for i in /etc/profile.d/*.sh ; do
    1 a$ u2 r1 C  v3 X6 X0 z  e
  16. 15         if [ -r "$i" ]; then
    3 ?# h' I: @4 C; }  ~2 o& x8 v
  17. 16                 . $i- I  @! C8 m% m/ c
  18. 17         fi& G1 Q' S/ C% [7 t# W
  19. 18 done! O( W8 X; |. S% ^6 N7 j
  20. 19 unset i
复制代码

  ]3 Z: a8 o# g' a3 L/ M第3~9行就是设置PS1环境变量的值,我们可以直接修改这部分代码,但是不建议大家这么做,因为我们及时修改正常了,但是后续如果重新编译buildroot并解压以后,/etc/profile文件又会被重新替换掉,我们又得修改/etc/profile。# k! s4 n2 `6 C; A9 h& P- _$ i
第14~17行,从这里可以看出,/etc/profile文件执行的时候会遍历/etc/profile.d目录下的所示.sh脚本文件,然后执行这些.sh脚本文件。所以我们可以在/etc/profile.d目录下创建一个自定义的.sh脚本文件,然后在此脚本文件里面添加PS1初始化代码就行了,这样即使后面重新编译了buildroot也不用担心此.sh脚本会被替换掉。
9 z7 H* {' R' d: m" E& S在/etc/profile.d目录下新建一个名为“myprofile.sh”的shell脚本文件,并且给予此文件可执行权限,命令如下:# f' a1 E9 G( t5 C" w" l% \

6 ~4 \7 {# d: z/ @
  1. cd /etc/profile.d/                                //进入/etc/profile.d目录
    ' k/ I/ B5 k' S
  2. touch myprofile.sh                                //创建myprofile.sh文件3 n- E* f6 j7 H5 Y0 {3 i: V
  3. chmod 777 myprofile.sh                        //给予myprofile.sh可执行权限
复制代码

( T3 A- U5 A+ Q$ x" V/ g最后在myprofile.sh里面添加如下所示内容:" T; V/ T. H' o. G. c5 q# i' R
示例代码19.5.5.2 /etc/profile添加的内容: l" h$ `9 `2 l9 Q

" ~$ F2 K( r/ D  W1 q
  1. 1 #!/bin/sh
    ; I0 L/ {# A& U, Y+ n, n8 z0 Z8 s
  2. 2
    + |. S* |7 N. W9 Q( Z0 J
  3. 3 PS1='[\u@\h]:\w$ '
    5 v4 d7 U4 K5 \- {) t
  4. 4 export PS1
    # [" C* u0 r4 Q
  5. 重点是第3行,也就是设置PS1环境变量,格式就是:- {; D  f# `9 S, ]& W
  6. [user@hostname]:currentpath$:
    0 V" V" d" f0 _5 M+ V, J* g5 }
  7. user:用户名。  F8 x5 }; X  g9 _+ h/ J  |
  8. hostname:主机名。
    ) `& l, H) J; D! ^+ ^
  9. currentpath:当前所处目录绝对路径。
复制代码
; k. }" ^: M- j$ D  k6 Q) R
设置好以后的myprofile.sh文件内容如图19.5.5.3所示:! g" u. q$ C. }( A2 v, u
5 b+ X1 ?( c6 z1 \; J+ ^
144edaa3bc4146e8aa0fee4980e1a153.png
) s6 L0 x' c& P: q8 f0 `! a# X) V2 K" `) j$ Q
图19.5.5.3 修改后的myprofile.sh文件
1 [8 w+ w! I9 Umyprofile.sh文件创建完成以后重启开发板,这个时候我们就如到某个目录的时候命令行就会有提示,如图19.5.5.4所示:( N  w" R. Y' \4 q. |4 t
) Q8 j) O) k4 ]: k7 J9 i
0b4d9f459e5345f9a7d0c959cd59e25c.png
* E% L- j6 L' ^, j
0 a( k! U. y/ M% U! [* X! X1 N图19.5.5.4 命令提示符
* w: n: q8 Y3 L7 p从图19.5.4可以看出,命令提示符显示正常了,完整的显示除了用户名、主机名和当前路径。至此,buildroot构建根文件系统就已经全部完成了,当然了,很多第三方软件本章并没有使能,大家可以自行根据实际需求选择对应的第三方软件和库。
. A- p; D5 Q  z: K( x( I% p; f, t19.6 烧写根文件系统到EMMC中; x- R' Z0 Y: y( M. @; m
至此,一个最基本的buildroot根文件系统就制作好了,我们可以将其打包烧写到开发板中。虽然编译buildroot的时候已经生成了rootfs.ext4格式的根文件系统,但是!我们实际上还在自行创建了一些文件,因此buildroot编译出来的rootfs.ext4不实用,所以还是需要我们对上面测试过的根文件系统打包,然后再烧写。
$ L& l, ^8 }& a; d+ i3 `! L19.6.1 根文件系统打包
' k+ h% W! l$ T5 U6 N首先对/home/zuozhongkai/linux/nfs/rootfs目录下的根文件系统打包,打包方法和18.6.1小节一模一样,大家参考18.6.1小节打包即可,最终得到一个名为“rootfs.ext4”的根文件系统包。
, r2 L: o) {" }7 ^0 F19.6.2 烧写到EMMC
* X/ I6 c3 o1 `; x打包完成以后就可以使用STM32CubeProgrammer软件烧写到开发板EMMC中,烧写方法在18.6.2小节详细讲解了。& `1 P. {3 g# n* S% e5 ^
19.6.3 EMMC启动测试+ Z7 g& A" [# I# d5 q* E6 f
烧写完成以后就可以从EMMC启动测试了,需要设置uboot下面的bootcmd和bootargs这两个环境变量,命令如下:# P5 ^9 F! |* Z) e
setenv bootcmd ‘ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000’& e; s' f- `) |8 f
setenv bootargs ‘console=ttySTM0,115200 root=/dev/mmcblk1p3 rootwait rw’
1 W' G& Z6 n) X, E9 Y1 k% m7 Rsaveenv2 v8 J% B- x+ n- T# N# y3 h6 n
boot
0 L, D0 \8 ?# u2 S8 w启动以后如图19.6.3.1所示:- X+ C4 `) [- [( V' A% I+ f: E
: h9 t# G2 I3 I
07cb5b1118724168887e17a7cd7beeec.png & f; |( m( g/ q. G3 _) V
1 m, F, M0 f# f& o  ]7 L
图19.6.3.1 从EMMC启动( s( `- s+ Q0 q( I+ X: D
从EMMC启动的话默认是不开启网络的,需要我们自行开启,输入“ifconfig -a”命令查看当前开发板所有网卡信息,如图19.6.3.2所示:
6 r- z: f: ^8 T) O* h. x; w, t" Y9 H/ F1 [) ^- r
d82847b1f8af470aa6c01f5b1ca0fc0c.png
) J. A9 ^2 w" c# D& J+ j3 V& E6 a
! s* e& H$ p* a: i: J" w$ H& {5 ^图19.6.3.3 当前开发板所有网卡8 H/ W5 m0 F' w" y' \
从图19.6.3.3可以看出,当前开发板有两个网卡:eth0和lo,其中eth0就是开发板的千M有线网卡,lo是回测用的。但是eth0这个网卡默认是没有启用的,大家输入“ifconfig”命令可以查看当前正在工作的网卡,如图19.6.3.4所示:8 e# h) G8 }) v9 ^, \
9 s$ `9 k, J, d3 e4 s, d% E3 c. N
deede749402b41f6b84f45cc8b75b803.png # p! ]; E& J, a/ o4 \' e' |2 X, ?: w
1 T- H. u* n' P7 ]
图19.6.3.4 当前系统启用的网卡
7 p* Q$ P/ T" B从图19.6.3.4可以看出,当前系统就只启用了lo网卡,eth0网卡并没有启用,所以我们需要手动打开eth0网卡,输入如下命令:
# K, ?8 U+ @5 M" Q/ N% Pifconfig eth0 up //打开eth0网卡
* q# o3 z# ^* H, B输入上述命令以后就会打开eth0网卡,如图19.6.3.5所示:
. x4 _7 S! b) T) a6 y
7 W/ {& ]0 p; |1 t! b- j2 g a5f4c7b250f94ce68c4ed7e523389e90.png
( |. ]; I. _: H" w; ~# H3 h" Q2 x/ w
图19.6.3.5 eth0网卡启动1 H: j$ a% R& ~" q3 X: U
从图19.6.3.5可以看出,eth0网络连接成功,网速为1Gbps。注意!如果你的开发板连接的路由器或交换机是百M的,那么网速可能为100Mbps!" g9 a. O% ^# S0 I" P- w0 m6 O
再次输入“ifconfig”命令就可以看到eth0网卡打开了,如图19.6.3.6所示:3 m8 _  k1 D  R/ o& D' d
' H6 \( s0 M8 y3 P
6add80f0eac6497f87da54229e6da01d.png 8 S! A, m; [, j6 g5 m, i
+ Q6 H' ~3 I! m5 B* t: s3 _8 S
图19.6.3.6 eth0网卡打开
: U+ F% ~; P0 u3 V0 R3 o0 }1 H从图19.6.3.6可以看出,此时eth0网卡已经打开了,但是此时开发板网络还不能使用,因为我们还没有配置eth0网卡地址信息,如果开发板没有连接路由器,而是直接连接的交换机或者电脑,那么只能手动设置eth0网卡地址信息,命令如下:
* A# ]; M4 B( B" W3 F# `3 O% Uifconfig eth0 192.168.1.250 netmask 255.255.255.0" D8 G3 g+ J+ O
如果需要开机自动设置静态IP地址,那么就可以在/etc/init.d/Sautorun中添加如下两行:: @; g! u) r3 U. R/ Q0 ]
ifconfig eth0 up //打开eth0
2 }% I# V# B( i& a7 [- v8 @; difconfig eth0 192.168.1.250 netmask 255.255.255.0 //设置IP地址
% ^0 n! {2 I( a2 b0 _' f5 \8 x修改完Sautorun文件以后执行一次sync命令,确保修改的内容写入到Sautorun文件里面,而不是写入到缓存中。最后重启开发板,此时系统启动的时候就会自动打开eth0网卡,并且设置静态IP地址。
: Z9 _2 C& H) U0 W: E9 |! v4 K4 X如果开发板连接路由器的话就更简单了,不需要我们手动设置静态IP地址,直接使用“udhcpc”命令从路由器获取动态IP地址即可,如图19.6.3.7所示:
9 z! r. S8 K3 H. W4 Y1 b" Z" v! s" k9 N
90bac717d3df4015952e4ee1faea5603.png ) T& |6 x9 W" D+ U, U

, D! g8 M3 U+ f/ ~4 O+ ]# ?' L图19.6.3.7 udhcpc动态获取IP地址
5 k8 t9 z9 c- `. s从图19.6.3.7可以看出,开发板通过udhcpc命令获取到了192.168.1.157这个IP地址。0 F6 c# Y, P5 e3 I  u# d
————————————————/ u8 `4 D4 a; |( ?, B7 @1 w7 P0 r
版权声明:正点原子
0 A$ ^  P. \8 {" U: `' g9 P* l7 a7 ]; k. @# |, v( I
46350c5cb85744c2ba12dd7e2d2953f7.png
收藏 评论0 发布时间:2022-9-24 21:51

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版