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

stm32mp1 linux最小根文件系统制作教程(stm32mp157开发板实操)

[复制链接]
STMCU小助手 发布时间:2022-9-28 21:53
关于stm32mp1,ST官方提供的系统太庞大,开机速度慢,占用空间大。基于这个问题,我们整理了Linux5.4.31最小根文件系统的镜像及对应教程,希望对stm32mp157开发板使用的用户有所帮助。
) R: ]: C: z) l3 q9 ~* {2 Z) s$ J
2 E5 x, P7 H9 Y0 N0 X3 z- k0 m' k1. 根文件系统开发实验6 A) w, z8 {; V
1.1 实验目的& d: I* B9 H' b& [0 a  Z% u" r
熟悉Linux 文件系统目录结构,创建自己的文件系统,通过NFS 方式测试。
9 j- F& I9 ^0 ^9 S% x
" p: G1 U0 K7 P" N- N1.2 实验平台
/ G& z& S  E, L/ {华清远见开发环境,FS-MP1A平台;
5 R, s& _8 |6 @: B- c
$ x6 e1 R+ U" T& w1.3 实验步骤3 O! Z' |! @7 D$ J# o% |% @
1 . 根文件系统制作$ F5 ?, E5 @* W+ M
  h) z  E) b$ w$ c
可以网站下载busybox-1.29.3源码用于制作Linux文件系统,为了方便,已将源码放进了光盘。9 Y$ n( P# B- g

6 d0 f" u2 y7 X1 n" P$ Q安装交叉编译工具链。
, P  b& [& l, z& C+ G- Z6 s% e) C; [/ @7 Z( j, A
  1. linux@ubuntu:$ sudo apt-get install gcc-arm-linux-gnueabihf
    : M% v0 T( T8 F8 K, Z( s6 }4 g
  2. linux@ubuntu:$ sudo apt-get install g++-arm-linux-gnueabihf
复制代码
8 Q+ H8 x  H! n% {9 i/ b
验证开发工具是否安装正确,显示版本信息如下图所示。
5 ?- M* a4 U$ r. L
! y2 y; ~7 e2 Tlinux@ubuntu arm-linux-gnueabihf-gcc -v" _, b, ?0 j- O6 P0 P' K( i; I
8 V: V2 Z3 s7 @; n4 |' ~
675185f94749531eab2e8521089de8ff.jpg / U: }3 G: |4 B7 z
, P7 L. Y  d! d$ |1 m& S8 X; K
建立源码目录
  1. linux@ubuntu:$ cd ~- f) y2 w7 v2 z- {
  2. linux@ubuntu:$ mkdir -p fs-mp1a
复制代码

9 R4 g! \5 ^, G; V$ |$ a将busybox-1.29.3.tar.bz2拷贝至该目录。' k7 d) H+ L! s- I+ C

, |- v( Y+ Y4 m! Z2 y! {
  1. linux@ubuntu:$ tar xvf busybox-1.29.3.tar.bz2             //解压源码5 ]/ T$ l: }  @8 E
  2. linux@ubuntu:$ cd busybox-1.29.3
复制代码

  s( \( e, {! K- ^9 W配置busybox 源码:- s7 V$ e/ x# E8 y) ~4 |
( @8 O: n  V9 \- W: Y  ?
将顶层目录下的Makefile文件中的CROSS_COMPILE字段修改为“arm-linux-gnueabihf-”
( l- I/ T0 t# j2 v: O
! P/ z2 m8 ^, z$ m, S% b 749659e7ce33f577357bb122e7b69017.jpg
9 A1 Z) ^2 {9 _9 E  }; Q  t& D, }5 v0 S8 v& D' z; Q6 v6 E% G
可以使用如下命令配置源码- l# {$ V6 p  N, q, ^. ]9 ^3 R

) I+ q7 D2 n  glinux@ubuntu make menuconfig3 ^7 `& ]9 Z( R5 y9 k

" P  o" U$ K; A3 F7 c1 V  h 5aad1940d79d9db5e446b1ae07552dea.png 5 @7 X% l/ c& K$ }: r& E9 A

% G2 d6 V( ~9 U$ _. C/ K% t编译源码:) h3 N/ Z8 ]& ?7 x
; @4 Q' Z+ G6 b# U# B
linux@ubuntu make6 F* @5 L7 i7 ^# G+ {! x/ B9 ^
安装:! a" }3 c& j5 s4 I
! q, `# V6 \/ F
busybox 默认安装路径为源码目录下的_install
) K& N: F' V5 h; {4 e; x
/ Q  ~, g* n% g$ S; Klinux@ubuntu make install
. [/ l- ?! T4 v. Y8 {3 ^+ w9 w" s$ i( _+ U
进入安装目录:
; @5 m4 G  y4 v* U4 ~. y; O. A# ~) n6 r: c
  1. linux@ubuntu:$ cd  _install. ]* P% l2 s$ I! ^
  2. linux@ubuntu:$ ls
    % t, E0 l/ l- b8 A. E; i- N
  3. bin  linuxrc  sbin   usr
复制代码
9 B) _: j, O: I6 |! b9 b
创建其他需要的目录:5 K/ X# ]4 I/ M* S- }! ]
6 D+ d: V# Z; G. A# h- I# l
  1. linux@ubuntu:$ mkdir   dev   etc  mnt   proc   var  tmp   sys   root
复制代码

& z) X" K1 ^8 v1 F添加库:# Q6 V- V5 f! B- m
7 g7 p* q& a3 A% E
将工具链中的库拷贝到_install 目录下:- }, M/ Z- Q# E7 ^& l/ q

0 p/ O" @7 x0 ^, V9 P. dlinux@ubuntu cp /usr/arm-linux-gnueabihf/lib/ . -a/ V# ?7 u0 O& A8 c4 e. O: P% j2 Q( H' w

. ]: p7 L" E; e! m删除静态库:
3 u% b+ M2 Z+ v! w8 W1 v9 Z& _7 y$ `  ^! I9 U1 C
linux@ubuntu rm lib/*.a   
( }+ R& E% R" t/ Q$ z    5 Y+ M+ ~2 r, S% q2 V
添加系统启动文件:9 Y7 A6 K8 M7 Q- g$ \1 s+ [6 H( l- f

8 @0 N+ N2 W; R8 }6 N6 F' G; A在etc下添加文件inittab,文件内容如下:# Q& F: \4 b; _0 \
1 H4 r+ c( d- @2 i. \$ J
注意:修改文件均为_install目录下
9 `+ i& `/ ]% @( w7 f; T8 M3 Y6 w2 U8 G: d
etc/inittab0 e' m7 k" d' e" G* O+ p

. S( y9 l6 C  K" K' K- ?* b
  1. #this is run first except when booting in single-user mode.
    ' d. a! b* b" h8 c/ L
  2. ::sysinit:/etc/init.d/rcS
    - m+ x! f# E; O% T/ L6 F  v
  3. # /bin/sh invocations on selected ttys: d- Q1 i9 Y- y) R8 l
  4. # start an "askfirst" shell on the console (whatever that may be)
    : z" i3 i  @: e! c8 z% {" g
  5. ::askfirst:-/bin/sh
    , k; A% h% |9 q$ k, J
  6. # stuff to do when restarting the init process
    . r' n/ ]3 Q2 n4 s
  7. ::restart:/sbin/init; Q& j& T, i, H6 S- L; q& G7 x
  8. # stuff to do before rebooting/ C* V7 v5 `( _$ U& l% \
  9. ::ctrlaltdel:/sbin/reboot
复制代码
& A+ F* O9 _  I7 B! n7 Z2 Q5 P
在etc下添加文件fstab,文件内容如下:1 c9 J, J' v. y7 q

- e3 |( l' c- V" t2 }/etc/fstab
- ?  s+ l$ w! l  g: Z0 N
. P$ b9 t+ j. [& {3 B. B
  1. #device        mount-point        type        options    dump        fsck        order6 s2 Y, D7 p7 [* h1 a% I
  2. proc         /proc                proc         defaults        0                0( `. A% ~% V; r* y1 _; C% i: O
  3. tmpfs        /tmp                tmpfs        defaults        0                0. C( L1 D# D9 z$ V9 n( e/ m
  4. sysfs        /sys                sysfs        defaults        0                0- D, ^& `% X9 b# k, [! i
  5. tmpfs        /dev                tmpfs        defaults        0                0
复制代码
. k( q, x6 X2 X3 d% x0 o7 M
这里我们挂载的文件系统有三个proc、sysfs和tmpfs。
& t, z& c0 V6 _! n8 _- Y2 `" Q% a: y- Z7 a
回到创建的文件系统处,在etc下创建init.d目录,并在init.d下创建rcS文件,rcS 文件内容为:
4 P/ V& O& q: T. g2 R/ p3 S/ ~+ ?5 Q- J7 u5 O+ K2 ?
etc/init.d/rcS# h$ |+ g6 K6 b. I' K

' ?7 J, ~8 f' b7 L5 H! H5 z
  1. #!/bin/sh# Y* v- P5 X; A) C. O! m, I6 Y
  2. # This is the first script called by init process; S% J+ ^& e7 W9 K1 s7 Y9 L$ Y
  3. /bin/mount   -a$ T6 [9 G, i$ N3 B' x
  4. /sbin/mdev   -s
复制代码

  c6 G/ C' E: d) z为rcS 添加可执行权限:: O) b* X- b, b7 i+ d  V

. ?/ {: X4 G- F/ d3 W7 o7 W/ f! Wlinux@ubuntu chmod a+x init.d/rcS
: k; p3 e  n1 R2 d- c6 e) a8 C0 `1 W% z
在etc 下添加profile 文件,文件内容为:- {" q  d6 {% p. E: R6 q

7 J! M4 l' G/ B# y' [" A9 t4 xetc/profile
8 o& ~& X0 ^# W: [2 C! ~# G2 d, ?
- Q$ R- l9 ^2 @5 I
  1. #!/bin/sh
    / x( T1 V* I- X4 i
  2. export HOSTNAME=fsmp1a5 ?9 l" w! t$ X1 n% D' a: N* q
  3. export USER=root; Y! j( W% L7 w' W. _, I: H8 c
  4. export HOME=root
    3 r2 o* y2 J/ j' N  l. z& N4 C9 b1 X
  5. export PS1="[$USER@$HOSTNAME \W]\# "! t) t8 `0 w( U
  6. PATH=/bin:/sbin:/usr/bin:/usr/sbin
    ' a+ h1 H8 T2 F+ F7 x5 x
  7. LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
    2 [2 Z" W0 e# p
  8. export PATH   LD_LIBRARY_PATH
复制代码

' I- l: W# ~0 C8 N2 D2 . NFS 测试# f- [# b2 M7 G7 T4 U: V/ i* `

$ j7 W. t( U0 d3 c' T4 i删除原先的/source/rootfs:
' _8 y2 S, x+ R) W2 F4 w8 y
  ]/ a/ ?3 D* b5 q6 p6 [2 C, C
  1. linux@ubuntu:$ sudo rm -rf /source/rootfs
复制代码
; D$ `2 I+ g  t$ I+ M0 }
将我们新建的根文件系统拷贝到/source/rootfs目录下
' y" u1 m; a7 e# e% N- F* i6 [, H3 u$ l4 W2 a
  1. linux@ubuntu:$ sudo mkdir /source/rootfs
    ; M% O. `. h- L+ q1 T8 n" D
  2. linux@ubuntu:$ sudo cp _install/* /source/rootfs -a
复制代码

: I1 t0 y3 o. E* {% M5 ~+ i修改ubuntu主机中的/tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17文件添加nfs启动选项$ m# h$ V% L4 u2 i
7 S5 Y* u$ p" x  w
  1. # Generic Distro Configuration file generated by OpenEmbedded- M$ J, B2 e! x
  2. menu title Select the boot mode# T- [3 x/ d9 }, w: k* L
  3. MENU BACKGROUND /splash.bmp9 A! r' B# K5 m' h
  4. TIMEOUT 20
    " ]( m* `$ f% H) o* h
  5. DEFAULT stm32mp157a-fsmp1a-emmc
    , k6 V6 _4 l8 }
  6. LABEL stm32mp157a-fsmp1a-emmc4 E) \$ B1 t7 h7 a; z. x
  7.     KERNEL /uImage& a2 d/ F8 Z0 r" ]6 ]9 N: ^5 E
  8.     FDT /stm32mp157a-fsmp1a.dtb
    2 h$ o! h: r0 O5 L2 t
  9.     APPEND root=/dev/mmcblk2p4 rootwait rw console=ttySTM0,1152007 [7 Z/ I# w  ^- Z' k% F# N! y
  10. LABEL stm32mp157a-fsmp1a-nfs
    # F# P; |$ a- m' F* M
  11.     KERNEL /uImage
    ( [9 k% C- k1 l% X, ?
  12.     FDT /stm32mp157a-fsmp1a.dtb
复制代码

* g* d8 G, l8 _9 C    APPEND root=/dev/nfs nfsroot=192.168.11.251:/source/rootfs ip=dhcp rootwait rw earlyprintk console=ttySTM0,115200/ H$ p* u7 r: c: v- Y; X
上述配置中共有两个启动项分别为stm32mp157a-fsmp1a-emmc、stm32mp157a-fsmp1a-nfs。其中stm32mp157a-fsmp1a-emmc选项为正常启动配置;stm32mp157a-fsmp1a-nfs为nfs挂载方式,这里需要注意的是nfsroot=192.168.11.251部分的ip需要根据ubunut主机的实际ip填写。
: X! V2 w2 e' {! {  L+ {5 x& M4 V  F7 m( Q4 Z6 s* G) ]! K
重新启动开发板,选择nfs启动选项。+ ?) D( a; T- E; k  s( t

- k5 S0 x) U) H: @1 Q 9d5f22a6b1a1365fc0b204ac701d5f68.png 3 J4 z$ u8 w+ z
; k0 \% Y; S/ n6 v
查看是否能够正常挂载,功能是否正常
- B" D) L4 O. j0 T$ {  {
$ I- `& B) _& C) U 9e3c0c6458e251a87d224ca3b7156ad5.jpg " W9 h0 ]& p; o- T
4 F& G9 x4 h6 T2 v) W3 m
2. 制作根文件系统镜像
2 ]2 {' \) t# s9 t1 m( _上小节已经制作好了根文件系统,并且从NFS已经成功启动。本小节将制作一个根文件系统镜像用于后续的固化和烧录。- B; ?! B% ?- O3 ~3 ^0 q

4 y1 ^6 }) o5 B8 j. G2. 制作ext4格式的文件系统6 S8 P8 Y( U7 t$ q
3 G" M/ r0 k) @- U2 z( C
在ubuntu中制作一个EXT4空文件, 此处设则为300M大小,由于安装的软件较多时,文件系统会很大,用户可以根据情况自行更改。
7 ]$ ~2 ]9 p7 T4 a! N( ~  H
9 X% j% L8 Q4 O. F6 a
  1. linux@ubuntu:$ dd if=/dev/zero of= fsmp1x_rootfs.ext4 bs=300M count=13 F" B& P0 Z2 s' u
  2. linux@ubuntu:$ sudo mkfs.ext4 fsmp1x_rootf.ext4
复制代码

8 N0 J& Y/ u$ o2 Y! d% d2 ?2. 复制文件系统
% m4 q7 r* c) Z" b# ?$ y) G  x, [' ]. h6 m( a" n
将上小节我们移植完成的跟文件系统中所的文件夹都fuubuntu18_rootfs.ext4文件挂载到临时目录/mnt,并拷贝文件系统。
6 J! f0 c' I2 d/ ~; ?1 L2 A" F0 P. |$ |
linux@ubuntu sudo mount -o loop fsmp1x_rootf.ext4 /mnt
3 F6 R& `2 e; \- y" }
' J" F" z8 ?; [如果我们已经制作了前面的文件系统则直接拷贝/source/rootfs/下的文件即可
7 h/ Q9 A5 F9 w/ x5 H* ?( V7 w
; V( ?* Y1 A+ Glinux@ubuntu sudo cp /source/rootfs/* /mnt -a
0 B; c6 Y  l( Y" q( ^
2 Y! }8 O" `% l6 d: `$ O- D如果我们之前没有编译制作文件系统也可以将【华清远见-FS-MP1A开发资料\02-程序源码\04-Linux系统移植\02-移植好的系统镜像文件】下的rootfs.tar.xz文件导入到虚拟机中,使用我们已经移植好的跟文件系统进行制作。- ^6 c0 d- e; _( x7 D) Q

8 c' C4 q1 H0 elinux@ubuntu sudo tar -xvf rootfs.tar.xz -C /mnt7 p( ~" p1 Y/ @+ b9 x9 m

2 N2 V7 j6 |2 A4 T% B: j7 ^5 x! n* V3. 卸载挂载的fsmp1x_rootf.ext4文件# b  B- C& L1 C( ]

. {  p8 B! e) t1 }/ @linux@ubuntu:$ sudo umount /mnt
9 f0 ^! W* [8 k$ _9 l) X  H
8 }/ v0 ?- [$ u7 l此时跟文件系统镜像就制作完成了。可以将这个文件导出到windos下烧录到开发板中运行。
' p2 x/ ]1 m! t! H  K0 T
  l* B( r- I+ s4. 修改烧录文件
  D, ?1 z: r  O. j/ S* o+ A6 _1 o& U& @& |
如果想要烧录到开发板那么就需要修改,烧写文件。这里以eMMC启动的trusted镜像为例来说明。其它启动的修改方法也类似。9 w' J2 h5 ^/ a; C7 u4 U' I
5 q0 b$ X8 ?; E  `! s
修改flashlayout_fs-mp1a-weston\trusted下的FlashLayout_sdcard_stm32mp157a-fsmp1a-trusted.tsv文件将Id为0x23的rootfs分区镜像名由fs-mp1a-weston-openstlinux-weston-fsmp1a.ext4修改为fsmp1x_rootf.ext4。按照《STM32CubeProgrammer烧写方式》章节进行烧录即可。* ]( ~5 A0 u3 m: ^' x7 _0 g; k

0 \+ l5 E+ J: }$ m cb04d1041cbf2c77b0f68b1a46b3736b.png
) {! n8 {9 m9 |+ z2 W- q- Y. g' o8 }& F
————————————————2 X2 i& D2 ]& |4 G
版权声明:华清远见IT开放实验室! v( }, J& b# J+ p# }4 Z5 ~- m
+ ~, |7 {. u5 `7 b2 C

4 z: ^. h/ e1 w" m$ K' g
赞 收藏 评论0 发布时间:2022-9-28 21:53

举报

0个回答

所属标签

相似技术帖

官网相关资源

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