EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
为了给客户的测试和开发提供便利,飞凌嵌入式的开发板产品一般都支持多种操作系统,以基于全志T507H处理器设计研发的OKT507-C开发板为例,它支持三种操作系统,分别是:Linux、Android 和 Forlinx Desktop(Ubuntu),这里提到的Forlinx Desktop系统是飞凌嵌入式在Ubuntu base的基础上构建的桌面操作系统,完全兼容Ubuntu18.04,相对传统的Linux系统而言易用性更高。
+ i3 }% G* V5 @! k; n0 [" x% h
* R, M* ]; o5 a% U. l0 S![]() 0 @ N( I" N: m& D
Forlinx Desktop(Ubuntu)系统基于Ubuntu官方为嵌入式设备制作的操作系统-Lubuntu,该操作系统具备apt-get、ldd等常用的命令,若需要安装软件则直接apt-get在线安装即可,不需进行交叉编译移植等繁琐操作。但是每次重新烧写镜像之后,之前安装的软件就得重新安装,比较繁琐,如果需要批量操作则每块开发板都需要去apt-get安装,这样会大幅增加工作量,很不便于批量化生产。 % d0 ~9 n) h0 T! Z0 W1 P! Q
能不能把软件一起打包到镜像呢?这样每次烧写完就不用再去apt-get在线安装了。答案当然是肯定的,这就涉及到文件系统的定制了,那么接下来,小编就为大家介绍在Forlinx Desktop(Ubuntu)系统上定制文件系统的操作过程。 , [$ b7 q/ T: q# _6 I \4 j- R. ^! ~
1. 解压文件系统 首先,找到OKT507-desktop-release源码的文件系统所在的目录,然后将文件系统压缩包解压,路径如下: OKT507-desktop-release/ubuntu
8 K1 Q- l1 K) B( M9 F- j- {![]() ) _9 y, N- r( q& g6 b2 W) @ o
解压后,可看到文件系统目录OKT507-linux-ubuntu,进入到此目录后可看到如下文件夹:
5 P' ?* q3 R! B9 V' i![]()
2. 安装QEMU 这里简单介绍下QEMU,它是一个小巧的模拟器,可以模拟很多硬件如ARM、x86、AMD64/Intel64等。QEMU用途广泛,比如Xen、Android模拟器等都是基于QEMU的。下面我们开始在虚拟机进行安装QEMU,如下: ① 更新下载源: sudo apt-get update ②执行命令安装: sudo apt-get install qemu-aarch64-static sudo apt-get install qemu-user-static & o/ ^8 j3 |+ G( w" C( ]4 v
3. 修改配置 ① 将QEMU的qemu-arm-static拷贝到文件系统目录OKT507-linux-ubuntu,如下: sudo cp /usr/bin/qemu-arm-static usr/bin/ ; i4 u" G8 }: a7 M% h7 O
1 Z8 Y* E! p# T% |3 H( E+ i, B![]() 6 u$ u) p! j, c9 C
② 拷贝PC主机端的DNS配置,因为待会我们安装程序时要用网络: sudo cp -b /etc/resolv.conf etc/resolv.conf
- f( M5 Q1 A( M0 u* G- }![]()
- q I: R! a |7 w7 X. K( d
8 C2 ]6 [; G' _3 i" q③ 修改下载源: sudo vim etc/apt/sources.list ?' Z$ Y+ {' Z4 R. x5 g) u
添加 deb http://ports.ubuntu.com/ubuntu-ports/ xenial main universe deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main universe ( J/ j+ Y; Y( L; b! O
![]()
; P5 g+ A. N7 H8 P* R; U
n' T" L& W+ c0 [" \) _ W: U6 y; S2 E" V. @% _( M+ @3 Z
4. 挂载文件系统 因为我们这里是通过脚本的方式挂载和卸载文件系统,所以需要编写一个脚本挂载和卸载文件系统。 ① 新建一个脚本文件命名为ch-mount.sh,附代码如下: - # ~7 e* E+ f, m1 ~1 k7 h, J; K$ S
* z" F/ k5 B6 e
6 d. q8 q' v' u* Q
. F: e* g4 m8 q8 b8 r% F7 q4 ]
3 z1 J z. Q4 s' z2 r
3 R9 R3 j4 P7 Y( L, D( C: m0 a h
% {3 `+ `% ?! m5 N9 _3 W, C5 I! e) q% ^% M; g* r+ o
#!/bin/bash- i# ?: R' S" o% z) h
$ a. Y) z3 ]# J3 a! j; N+ a, | f- e- 8 k4 q5 N/ f7 k. L( {% `$ B
% } a0 Q! g/ i3 }function mnt() {
" G R+ K! C) T* P
% ~% G# P: d+ z7 f* h
5 V, A7 c: N# `0 t% i
" y% V) m- m; D' f1 Fecho "MOUNTING"
5 b# R V4 [+ L% t0 w
5 W! |& h% s/ v3 z: b
2 R. x- ]0 j0 P$ I* Q4 m' \" ]6 \9 x, H5 K: |6 l7 |
sudo mount -t proc /proc ${2}proc
# D* o( r3 Y) l
+ `' d" i% o* ]: V7 s
7 ^% D( X1 V+ F( N7 R0 k' d5 n3 |
* w* P# H, Z) v% G! `- zsudo mount -t sysfs /sys ${2}sys
& A# |' q- l4 t3 B3 s
. ^ {# o' M6 ]6 `, s/ T- 1 U( b/ B# e+ u7 m$ g% {
, S& m, }: G/ ^9 {/ Z5 J4 N- t) Xsudo mount -o bind /dev ${2}dev
R3 x* ?5 e; W K T1 }' e, H% `: ]
- , D) L: V' a% ?, Z
3 c/ c! H' i* ^* n+ g% }' y, ` r
sudo chroot ${2}
: R6 |& Z$ A0 k0 F
) z9 O! b4 F; p" N4 R: i# k - + Y6 r3 w6 l; j/ c
) q: K" z, h' K: |! j7 y
}" R7 r: [' m* i
7 I& Q/ ^! o3 v. b' J) h
% e1 E, d7 \; y4 P) _) g1 W) n0 X" B' e- U
function umnt() {* |9 u/ j) D; S. H
9 e( y! W$ @$ F' o8 m- |$ O- h
1 d% u: W6 y/ x) {. h0 g+ {
0 E" F; m& k$ @& J d8 secho "UNMOUNTING") p. I! s% V7 U- l8 Q4 _0 X
6 L W9 T1 ~. h8 x
- 8 h* l7 v$ z4 D$ T) m8 j
& Y1 w- J1 I2 F2 s$ Y# p
sudo umount ${2}proc
4 D V. g4 ^6 Z& x4 t5 }6 R, _+ m# \# Y, P
- & g1 Y7 F9 e% `, o% ~4 g z
/ ? ?: s% y; |6 j6 I: P
sudo umount ${2}sys
; D& u9 k7 ?. p. E5 T# u- S/ W2 |/ r( r& [. X6 V/ U
- 7 Q( H, W# L+ y4 ~& H
9 }8 {8 F8 b1 z' \" f0 F
sudo umount ${2}dev. V( t4 g( m; V, A4 u! h5 s0 ^
3 B- c( e! R; C9 B B
, g; O% w; p3 \9 B# @5 p9 Q" H9 t5 B" q2 ^% \
}
7 E( p+ f3 C2 b2 S) m( ?, G3 Q9 j
) R g% {. T$ A
5 P( E- s u9 w. T' Q q/ o, i
) W* g% q# b/ v( Y7 ^+ b6 z, I: }) R9 nif [ "$1" == "-m" ] && [ -n "$2"0 t( g( n* a, h) h! [( Q
. Q2 P) a$ [5 M% y ~" b; P: T7 `- / S$ H, t8 b& g. M
: f; [& b1 Q; Q0 @- [
] ;
' i. a L {' c
9 \( |8 s8 C: l/ c* x: z3 L
: }* A# k* W1 ]- \. z6 }9 n
; _4 D2 L) \# |; Q+ B3 D- D( C8 I- ~6 t# f4 ~ J V
) ~3 A* ^' a' [! H& l9 ?. W) U
- 0 ?9 h. w I& a( N1 s; ~
# U8 N$ ~& x: b! ?! R: Pthen. u% _ o, Q+ Z9 ^' ?; m) O
: p+ h( s8 ]$ m e$ o3 G2 ~
: J( g) a, q4 r( I \6 c
* D& j- \ y! V+ Y* xmnt $1 $2
7 _6 H, `# E& V- E2 o
" x" y; v, y( j) k& z8 V- , a) f/ Z/ V% t" l1 U
' G+ X9 u: U9 @. Telif [ "$1" == "-u" ] && [ -n "$2"
9 h: R7 J9 a# @4 g# |: ?& p/ m, o! e& M7 T$ b% s' ?
- 7 o# ]9 E% U% C, S8 H
$ B* m/ q8 u0 D! `. e) |$ H
];
& q, l# I7 T: F: W4 W2 w4 N1 t7 E. u/ g: J
- $ ~9 B9 U2 S/ \/ ]4 @& i' w
- l% R; T% M$ K- F: B
then
+ X0 X8 {9 f. ]! G0 x5 g+ S: g* k/ P
$ E* X. K: _) f" {- @! k. o
* S: F' q& [1 `' I0 ?# q) ^/ I* D: k" V4 X1 ~
umnt $1 $2% n# K# ^5 d8 }( j$ |: T1 P+ F
% J0 E! }( U, w1 Z5 _
^! w: q" ~: d# k( b
) ]0 a7 h9 v( P8 s8 nelse
4 Z3 c% e+ R, E1 _7 _8 P7 h( w0 r6 |4 v, u
- $ Q* R0 u( R4 B g, {# Z! {
j) J. r% N7 L& T) ]
echo ""
9 b* n# L8 q# h! ]6 t% `# y+ u: @: }7 K5 C7 _
- 3 ~9 h* K' A2 B" i: f1 A& Y
; r' `, h% D+ ~+ D, {
echo "Either 1'st, 2'nd or both parameters were missing"2 r h5 E- e% R& x8 S6 X8 ?2 o, A
+ p8 c% m; [% a7 ~
: f% P8 T' d( O% B4 {
1 N2 L3 ]) N! }, R$ S Hecho ""9 G) k; \* H+ C- A6 s1 p
4 C+ e5 J- ], K& Z P- * U; w$ n, y) E; A. I
0 R# _" C5 s) Z* ]' fecho "1'st parameter can be one of these: -m(mount) OR
# X* ?5 ~$ V& o. X( I) y: T! F I6 u* X3 c4 i% c
0 w# h& |/ {* l7 i3 j6 q, ^. a! X8 Z* C/ p9 t8 B
-u(umount)"
3 |$ [+ l& \- |0 m
( L _& K4 M/ W+ U) H' b. b6 q# P
0 f% V1 j" w' |, S# P' J% m9 w- | N6 I, p* b# a
echo "2'nd parameter is the full path of rootfs. |: V+ _( {+ W
' K$ t+ ^0 \& M% F3 ?
& H6 V! x/ A* t2 S/ O7 c! J! A
; [" h* \2 Y+ O$ g- B7 V0 }0 G7 jdirectory(with trailing '/')"
* N1 L4 s9 k1 K+ m5 T
5 A( s4 r6 R7 e/ d- - i9 p( U/ M; o4 G8 ]# K
4 ^" [/ r s5 o, K, `echo ""
" c- ]5 H: q0 T+ O$ b
- z" ]- S0 U6 E1 |1 y/ J* j, A
- B, g5 {; l/ _( q% R" Y9 i) X3 x2 F0 K! L5 u
echo "For example: ch-mount -m /media/sdcard/"3 n& x1 c$ G' N
6 {3 V, h7 b' P
, M" d, F4 g8 k# _
1 `. r! {+ {+ Necho ""
" G9 M2 j0 |' s5 T2 }5 n8 }
' }2 k% S0 n0 X9 T4 g
! G3 e8 L, i. U3 {- ~1 O" |1 u7 o* o: \% O2 g6 K
echo 1st parameter : ${1}- \; E* ]( d" X+ Z
9 y" C2 U! H1 e3 G( _- {, H
- * K8 R" j/ S2 J9 r+ d7 w* @
/ P" l( v# Z/ X3 h
echo 2nd parameter : ${2}
4 }6 M6 v) r$ C0 J% \- x
7 A' t, w: t) ~7 q$ }! K R - 0 o* U: R, r* D( N0 }8 M- H" L) E
$ a$ ^# R' k* A# p, D2 u
fi
, S: @ ^+ C( q6 y
1 t9 a" E. J& c2 H3 a! B" e
, b2 Y& r! b( ]
![]()
, m' n& q ?* m' T! ?8 x; x6 s3 j3 ?4 g- O
* e! [7 _1 V' a3 n" i1 M- ?② 设置这个shell脚本可执行权限,如下: sudo chmod 777 ch-mount.sh
③ 挂载文件系统: 执行ch-mount.sh脚本 指定参数-m,挂载成功如下: sudo ./ch-mount.sh -m ./
![]() $ R3 m3 C) K" T: x% ~( N/ N- y" {
5. 安装软件 前面我们挂载了文件系统,已将文件系统挂载到了QEMU模拟器,接下来就可以安装我们所需要的软件了。 ① 更新下载源: apt update 注意:更新下载源可能会报错,这里需要注意一下,因为tmp文件夹权限不够,chmod为其赋予权限。 如下: chmod 777 /tmp
② 安装软件: 至此,便可以安装所需软件了,在这里用apt-get安装自己所需软件,根据所需安装。我们这里来安装一个minicom串口测试工具。如下: 2 ~* a* c. Y1 o' u
![]()
. `+ D" y4 p2 g8 z- O1 b3 |③ 安装完成后,exit退出QEMU。 ④ 执行ch-mount.sh脚本卸载文件系统,指定参数-u,卸载成功后打印如下: 3 n7 a* b" ^( F0 u
![]()
) Q, w5 Y1 A7 D( H
. U) Y0 F n B. C4 l注意:我们exit退出后,只是退出了QEMU模拟器,并没有卸载文件系统,一定要执行脚本卸载文件系统。 ' m8 Y: g6 L- D( I* p& P& V
6. 打包文件系统 ① 完成前面的步骤后,用tar命令将当前文件夹下所有文件压缩,命名为OKT507-linux-ubuntu.tar.gz。如下: sudo tar -cvzf OKT507-linux-ubuntu.tar.gz ./* 4 q8 |5 f: Q, W8 ^2 Y/ |, l
② 压缩完成后,为文件系统压缩包OKT507-linux-ubuntu.tar.gz赋予权限,如下: sudo chmod a+w OKT507-linux-ubuntu.tar.gz
, V8 I" @% _( R; q! u1 }. K![]()
# P; ]. ^ Z: h' M
; M! Q6 w: @: N; z: s! W8 Q③ 将刚打包好的压缩包替换到上一级目录下的旧的文件系统压缩包。
" } Q: V$ I2 j( Q3 h' N4 N( y![]()
( y6 P2 p# V. R* t. U" l3 V- _" H2 u b" ~$ m1 T4 P
④ 重新编译打包后生成新的镜像烧录开发板。 ![]()
2 H) C1 j6 a: k$ z) j5 H& g: Z0 n9 K! s; z0 V: e
, d) ~8 R' V4 m) b l3 x
7. 测试方法 烧录到板子后,在终端启动minicom,验证下是否安装上。如下: / q! h1 W4 X6 J* G! W
![]() 6 K; R2 {+ Q+ x' v- o/ l1 Y
从上图红框可以看出,通过终端命令启动了minicom,说明我们在QEMU中安装成功了,至此Ubuntu文件系统定制就做完了。 / K3 Y2 ^6 {; J1 l& E& n M+ N- Q; ^
通过这种方法可以个性化的定制属于自己文件系统,安装自己所需软件,也可以根据自己需求将出厂不需要的软件用相同的方式卸载掉,这样既能减少工作量,又利于批量化生产。
: k' T W6 U& \4 j |