EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
为了给客户的测试和开发提供便利,飞凌嵌入式的开发板产品一般都支持多种操作系统,以基于全志T507H处理器设计研发的OKT507-C开发板为例,它支持三种操作系统,分别是:Linux、Android 和 Forlinx Desktop(Ubuntu),这里提到的Forlinx Desktop系统是飞凌嵌入式在Ubuntu base的基础上构建的桌面操作系统,完全兼容Ubuntu18.04,相对传统的Linux系统而言易用性更高。
5 f% D8 |( C: R0 y
& q/ C! u- \0 R j0 S![]()
4 w! G) Q$ D: z; B& gForlinx Desktop(Ubuntu)系统基于Ubuntu官方为嵌入式设备制作的操作系统-Lubuntu,该操作系统具备apt-get、ldd等常用的命令,若需要安装软件则直接apt-get在线安装即可,不需进行交叉编译移植等繁琐操作。但是每次重新烧写镜像之后,之前安装的软件就得重新安装,比较繁琐,如果需要批量操作则每块开发板都需要去apt-get安装,这样会大幅增加工作量,很不便于批量化生产。 ( I# O: N8 B+ @. R. @
能不能把软件一起打包到镜像呢?这样每次烧写完就不用再去apt-get在线安装了。答案当然是肯定的,这就涉及到文件系统的定制了,那么接下来,小编就为大家介绍在Forlinx Desktop(Ubuntu)系统上定制文件系统的操作过程。 9 q" Y1 h/ x/ c3 n7 C, D5 m
1. 解压文件系统 首先,找到OKT507-desktop-release源码的文件系统所在的目录,然后将文件系统压缩包解压,路径如下: OKT507-desktop-release/ubuntu
, u2 p" N4 N/ `3 l! v8 W![]()
* Z6 n9 Y& B7 P& z& @2 p* [& N) I解压后,可看到文件系统目录OKT507-linux-ubuntu,进入到此目录后可看到如下文件夹: ! @7 D# q- V8 G" B Z
![]()
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
5 ?7 K9 b- a. h, Z0 t) X3. 修改配置 ① 将QEMU的qemu-arm-static拷贝到文件系统目录OKT507-linux-ubuntu,如下: sudo cp /usr/bin/qemu-arm-static usr/bin/ ! O2 ?# H) h" _+ l3 f" C b( n
# x' d; C: D1 v Q% N
![]() 1 D8 u3 q+ F& f% R# h
② 拷贝PC主机端的DNS配置,因为待会我们安装程序时要用网络: sudo cp -b /etc/resolv.conf etc/resolv.conf 2 z; A+ x4 `8 t1 `* I0 f' n
![]() ! s# j- f" H5 _1 u
; l) Q5 m, [7 Y- K7 b6 B: N, C③ 修改下载源: sudo vim etc/apt/sources.list ) `1 d2 L; v, s! H9 E; X
添加 deb http://ports.ubuntu.com/ubuntu-ports/ xenial main universe deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main universe " w* A5 b* ~. p4 ]' V
![]()
1 s5 J, W! X7 h% W/ }
% Y" Y& K! K$ x( X0 S" G( G
8 ~# T% V, k: L! j$ u( U4. 挂载文件系统 因为我们这里是通过脚本的方式挂载和卸载文件系统,所以需要编写一个脚本挂载和卸载文件系统。 ① 新建一个脚本文件命名为ch-mount.sh,附代码如下:
- A% S( e7 a8 s" l8 o4 F5 h% \2 O! n, u& ] I
0 g$ \3 r% |! b( {3 @
" k/ a8 U/ l& a @8 u* [- ^2 a! M; a7 m' `7 K! i; N" ?/ f7 b4 ?
8 G/ V5 P# ~& K' w2 h, m4 M
) T" R$ S S/ K% R
/ l1 [$ j1 Y! I: m0 h#!/bin/bash! C2 X% N$ ~! T# _0 c
3 [- ]- c9 K, v. V
9 S* s' C$ }9 B& ]5 e, b# `4 V
& c5 m' k' x: R( Zfunction mnt() {+ {4 l. _, A8 {2 l8 Z- n$ m
4 a% R+ {) ]& t- T
, _8 r- q9 S( Q0 j$ z# ]5 h$ m8 H' A6 e% c6 M* o" O. A" v
echo "MOUNTING"4 C% |1 } r9 n5 G; u0 n
6 K. ]" z: J" S0 N( z3 ~
/ B0 I( V, i" {& ]# g
; A% W; p) U9 T; w6 V) nsudo mount -t proc /proc ${2}proc
$ C* J; g, F P8 h9 \ ?7 w: }
2 ]; @ w" J9 W5 u4 O3 U% `# }
p& @. N4 I) X l! i
/ {- r6 n. H' ?) P3 Q$ Tsudo mount -t sysfs /sys ${2}sys H0 ^5 L6 D3 f3 E. h4 d" y
% ^, E- |' @( b4 K- . b; P. P1 ?! f6 j" e
/ Z4 l6 J; c E4 A& G, m
sudo mount -o bind /dev ${2}dev
, Z, X, _: b) `: k+ q& x! B f# q' B' c6 R1 V; Q
) a8 r5 m* R$ ]6 {' Y9 a& r0 @. H+ V% W( \: a
sudo chroot ${2}
. ^) p. o9 R/ N( P, H
& _: v2 Z: p5 S, o i2 D @3 r. l- - D3 t( c6 D/ t N t$ A
2 L9 q$ M6 B2 P% ]}
3 u8 v" D. ]# M8 H: d, ?
; W- i( c3 }( m) Z+ P6 i
7 C% Q% H$ j) p# h' t0 r) _4 L, V) i
function umnt() {
: k5 D0 J% k" h
# W0 ?( T+ C, Z1 y- K
2 Q+ Q% ]. e2 o
; x' V# O' @& V( pecho "UNMOUNTING"2 C7 z) F* D- ^" d
& u4 a* M( D% m U* Y8 l- 4 E5 D/ f' ?$ u
" q6 n8 Y8 K+ e/ F6 ~sudo umount ${2}proc
& r( w0 n6 y+ J6 J4 D W" l) L6 n: o! e" {5 n& B) i( I
- 2 Z( s {, i+ I3 ?( u
- |# ^$ E7 w9 t& s0 K
sudo umount ${2}sys
0 Q4 } @. W9 ^+ \0 f. r1 U# v- U4 R- I( G$ M1 D9 ^, h1 e7 I+ @
- \4 @) \, Z B) A5 L# n
3 z& C$ p/ S1 p1 B+ U0 H8 N1 Ksudo umount ${2}dev4 E( X- J( B( T* Q) C" |
3 A( E8 H. C, \6 j3 G& ^2 w! f
- + C7 L; O M7 N; Z. Y1 g7 I8 q
- P& v# f* a. l2 u8 s}
1 v% N! D7 ?' T4 f% N3 R& u5 h& Z" `3 i7 J
- & }0 v' G. S c/ b
3 N: d- I4 A3 e2 z" t5 v9 Kif [ "$1" == "-m" ] && [ -n "$2"! u: K/ [' S$ `
) {3 H- ~$ J' a7 C9 R3 |+ t
, J8 O* N9 I/ n- T1 t; Z3 _+ ~! m: _2 q% g
] ;
' s( V; R! A: B$ t7 w9 |. q) s' q: e1 [' u2 r
- - L; q/ E- w! T! m4 ^; v( S9 S
6 l% x9 @6 i9 |( G# w- O: E1 j4 |& \
+ d9 u8 l$ E L! G/ ^! y! J
: w# o" ]/ p8 i! Q
4 a7 f @: g, m& Sthen9 \8 U. H6 ?+ @# O
" O, f* u: y6 m9 g/ H- 8 Y4 d; h6 p4 O# Q# M7 U7 v* o$ c. x
* S$ e: X1 z4 Emnt $1 $2' W3 |1 \% K# ?- X8 Y
5 E: p( e. O2 S6 q5 m9 d" ], r
6 C0 u5 R3 \- ^3 s& L; I6 F& R$ n6 ~% {# @3 s. u, t8 t9 T5 D" h( t
elif [ "$1" == "-u" ] && [ -n "$2"
! ?# G2 R% s- z: K" V4 S. b
8 }6 E* {% ]# I
6 v6 s6 p% b N
& s9 ?' b6 {$ S% v];
9 I& d- L; @7 M
( u0 M* l* z# p( G V2 C p
2 t7 n* `) P! I3 Y, Q+ k7 J. s$ ^- q$ U+ n% a' v$ d$ a8 k8 {5 Y
then5 o3 C) j) w: ?5 e
1 Q4 U) b9 e* B
- G7 E4 _0 c& t& ~" \2 H0 d' k" |2 x1 U% X+ f8 p
umnt $1 $2
* g5 z' U% I/ n4 Z- A' Q7 j' y( e7 s4 ]- i! ~
( Z) T- X2 e, x* g" Y& M* S+ T, W- B2 N3 u3 d2 y1 _
else
+ n* o4 \8 O6 G9 A4 Z- P5 C3 `( o2 G% D7 e' {( y9 i% W* B" g
- & T) a: B9 o) a! ?
# A* t6 O7 h4 c; g: ^
echo ""6 y0 `2 I8 x7 }" \, m
7 |9 V# [& P: I9 F0 \, H' y) j$ P
6 G8 \/ P) }* q3 S5 V: @" q0 X: } h4 w
echo "Either 1'st, 2'nd or both parameters were missing") E; D+ O% W2 g5 _8 Z" X. p
0 y: v J- Y8 H( \( |7 c0 I) A9 O
- 7 ^, C+ ] L$ M8 C
& O0 _9 T4 c3 k+ e* G4 \
echo ""
* `7 ~8 m9 C1 \# D+ w, Q8 O+ U: _) r5 o
5 |1 X- b) Y. N; y
( f0 e* `2 U$ v$ B$ o `echo "1'st parameter can be one of these: -m(mount) OR" X) u0 x; q, l: K I
5 ], R0 m7 N" X7 ^- X6 c1 h! ]! S
2 b7 T8 E6 ^+ b
/ K. W4 R( e& b. s# h-u(umount)" \ e; c6 a% f4 C1 ~3 B. A
6 P( q6 t0 b5 S# o
, _8 q+ I# F8 J- C# h. q
+ @. n' [2 x0 s. K$ f1 `/ p5 Aecho "2'nd parameter is the full path of rootfs
5 d" \! v- ~& I% T6 k' v( j! `# g/ m3 g0 ^# {. c
% j' _; [% O/ @; O7 O- S6 Y
+ n7 T: {+ N7 K, A8 Pdirectory(with trailing '/')"
9 K @" v% ?, o4 j( J: R m6 {6 X3 W
( K8 e$ [* G3 A) d5 i
* h' a+ o8 m w" Q s6 i% O# `8 x. b r$ @
echo ""( t& H. ~" `5 g' ~5 k6 x, h
+ b% W+ P2 R9 u
! u) G6 D1 ~6 A$ Z P( K) z) G: T! O" N! C+ V* @( h% x; _. z
echo "For example: ch-mount -m /media/sdcard/"' a: O# E6 r# [9 B O+ g5 T
. o1 b; u+ g, j: ?! K
- ' k; S* J+ P/ p8 B
! P* ]( X6 X ~/ s/ gecho ""5 n; r$ h- Y' \' S2 p
+ N8 R, [, e9 m; s# Z( N4 U7 K) E
7 {7 i9 S! g& _* i, M& c4 N5 ^" N4 w+ K0 C
echo 1st parameter : ${1}
! Y: E) ]5 j2 P! ^9 f/ f
5 ~0 R, a. W* d" Q0 D4 I3 ]$ W+ @
. Q, w" `& d1 r; A
7 w8 n! ?& P6 Z& X$ vecho 2nd parameter : ${2}
4 @8 t5 o7 O1 e2 m* U4 C) g: V3 g3 K: x$ i0 h h
- 8 J1 p8 ]' V- p ~
$ k0 s9 P+ m) w8 E+ K
fi( ?# j r3 L9 B" q$ n9 }9 C, J
- ] r! Z' A1 H( V n6 |4 f* r
5 `8 l4 t5 f0 y$ ^. i1 h
![]()
( R+ m( J* [5 M# \) `+ z5 C
- v% D" C: c' o5 Z$ w- v* q, D1 R8 `2 ]
② 设置这个shell脚本可执行权限,如下: sudo chmod 777 ch-mount.sh
③ 挂载文件系统: 执行ch-mount.sh脚本 指定参数-m,挂载成功如下: sudo ./ch-mount.sh -m ./
![]() ( f* k& k( h4 K1 X$ ^
5. 安装软件 前面我们挂载了文件系统,已将文件系统挂载到了QEMU模拟器,接下来就可以安装我们所需要的软件了。 ① 更新下载源: apt update 注意:更新下载源可能会报错,这里需要注意一下,因为tmp文件夹权限不够,chmod为其赋予权限。 如下: chmod 777 /tmp
② 安装软件: 至此,便可以安装所需软件了,在这里用apt-get安装自己所需软件,根据所需安装。我们这里来安装一个minicom串口测试工具。如下:
# w+ n9 p. d. N) N$ S! C. m* @![]() % _7 a; v! C* K
③ 安装完成后,exit退出QEMU。 ④ 执行ch-mount.sh脚本卸载文件系统,指定参数-u,卸载成功后打印如下: - S) A4 n2 ^; t9 p" @" X6 q
![]()
4 I# E0 j0 W$ h ]# I0 D, v% \$ d; C. L4 e$ Q& p
注意:我们exit退出后,只是退出了QEMU模拟器,并没有卸载文件系统,一定要执行脚本卸载文件系统。
2 B7 _" i8 P i0 g6. 打包文件系统 ① 完成前面的步骤后,用tar命令将当前文件夹下所有文件压缩,命名为OKT507-linux-ubuntu.tar.gz。如下: sudo tar -cvzf OKT507-linux-ubuntu.tar.gz ./* ' V0 H% M3 M3 j2 U/ K
② 压缩完成后,为文件系统压缩包OKT507-linux-ubuntu.tar.gz赋予权限,如下: sudo chmod a+w OKT507-linux-ubuntu.tar.gz
P' F& D7 w9 \9 D# y![]()
( @. g5 M$ J. }, |. k, Q- Z, V3 J; A l0 J0 G
③ 将刚打包好的压缩包替换到上一级目录下的旧的文件系统压缩包。
8 J$ d0 ^; J' h9 t- F. m/ y![]()
W( b1 I. ~6 l: \! ~
- L4 Z) F/ I* R8 F9 _0 ^& c' D, F④ 重新编译打包后生成新的镜像烧录开发板。 ![]()
; {/ E" [2 G* @0 O+ q
( I/ M3 }7 ~1 x$ Z/ R0 x8 M/ B8 i
7. 测试方法 烧录到板子后,在终端启动minicom,验证下是否安装上。如下:
( @3 l2 ]" B& a) G8 h/ M![]()
; m& L. _% k) W7 z- l: f1 @( W从上图红框可以看出,通过终端命令启动了minicom,说明我们在QEMU中安装成功了,至此Ubuntu文件系统定制就做完了。
: X; q2 p3 f# `7 E9 m6 @7 @, U通过这种方法可以个性化的定制属于自己文件系统,安装自己所需软件,也可以根据自己需求将出厂不需要的软件用相同的方式卸载掉,这样既能减少工作量,又利于批量化生产。 6 s2 H; U* ^5 i! ?* q! Y
|