EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
为了给客户的测试和开发提供便利,飞凌嵌入式的开发板产品一般都支持多种操作系统,以基于全志T507H处理器设计研发的OKT507-C开发板为例,它支持三种操作系统,分别是:Linux、Android 和 Forlinx Desktop(Ubuntu),这里提到的Forlinx Desktop系统是飞凌嵌入式在Ubuntu base的基础上构建的桌面操作系统,完全兼容Ubuntu18.04,相对传统的Linux系统而言易用性更高。
3 Y* }" ~$ E) U- l" x
1 ?( H: [, K( @![]() 1 n B+ I) _+ z& Y3 ?
Forlinx Desktop(Ubuntu)系统基于Ubuntu官方为嵌入式设备制作的操作系统-Lubuntu,该操作系统具备apt-get、ldd等常用的命令,若需要安装软件则直接apt-get在线安装即可,不需进行交叉编译移植等繁琐操作。但是每次重新烧写镜像之后,之前安装的软件就得重新安装,比较繁琐,如果需要批量操作则每块开发板都需要去apt-get安装,这样会大幅增加工作量,很不便于批量化生产。 $ \! n7 t. W( `9 z( A
能不能把软件一起打包到镜像呢?这样每次烧写完就不用再去apt-get在线安装了。答案当然是肯定的,这就涉及到文件系统的定制了,那么接下来,小编就为大家介绍在Forlinx Desktop(Ubuntu)系统上定制文件系统的操作过程。
0 S. E8 m2 F% d, S9 t1. 解压文件系统 首先,找到OKT507-desktop-release源码的文件系统所在的目录,然后将文件系统压缩包解压,路径如下: OKT507-desktop-release/ubuntu
( y9 N4 o& }' B![]() ! L5 Y. R, ~; V m
解压后,可看到文件系统目录OKT507-linux-ubuntu,进入到此目录后可看到如下文件夹: + E: E* v1 k' i" T- _$ O
![]()
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 8 ]" W0 C, B K1 x
3. 修改配置 ① 将QEMU的qemu-arm-static拷贝到文件系统目录OKT507-linux-ubuntu,如下: sudo cp /usr/bin/qemu-arm-static usr/bin/ 4 ^2 d% _) h. K# Z9 i2 O
/ {7 V% P( @ ?
![]() . {; }; b9 N6 N0 Z3 j: `0 N
② 拷贝PC主机端的DNS配置,因为待会我们安装程序时要用网络: sudo cp -b /etc/resolv.conf etc/resolv.conf
, O7 m4 u0 N' D" M/ |![]() , |% n* N% l q
/ {( T# p! C3 s7 X B$ k: B
③ 修改下载源: sudo vim etc/apt/sources.list ) Y5 P# H/ W; }, h4 V6 O
添加 deb http://ports.ubuntu.com/ubuntu-ports/ xenial main universe deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main universe
8 d2 m+ J |5 q9 W6 ~![]()
: C! M7 |' p" S' G7 {# t2 u5 f' y
, h. c9 g5 Z" [; J" g8 z. r+ s7 ^# d
4. 挂载文件系统 因为我们这里是通过脚本的方式挂载和卸载文件系统,所以需要编写一个脚本挂载和卸载文件系统。 ① 新建一个脚本文件命名为ch-mount.sh,附代码如下:
; _8 A& w9 B7 P/ v4 @# @5 U' @6 _4 T% ?1 N1 i0 G% k. P
- # b/ v) i2 _( u$ ?( f" t8 P5 e/ J* j
. u! T& m3 R$ d- Y; l$ ?( a- }' u n4 }, s
# h+ \: h! L9 Q+ J
- 0 h9 Z( ]& {2 B Y# c$ {' i" h
' L9 h( Z# {: H0 d7 d. B
#!/bin/bash
' m* [4 f4 M) f2 {# p: Z' u; @! D6 }9 g. N
. d2 p' g7 X( Q8 [& E/ K. l& I3 g, r$ ` h5 B! n- d# f* w, y) ]; y
function mnt() {
# z( ]% s" d# f0 q5 P: [( M7 O+ U( z
- 0 h `2 I/ g5 ~2 c' h
6 \6 l) _. I5 E
echo "MOUNTING"* {- j; L: ?3 g% i; E7 J" k
% n: G, p9 Q' z2 a/ f: r: L: Y - : ~' G2 U/ _9 [/ {
' @+ X. F' C. C) rsudo mount -t proc /proc ${2}proc0 T2 K4 `5 {% l9 r: O
6 B( v! W& L1 _" M @3 T* b) p
8 w+ r+ S9 {; e5 X, e o; v- U7 Y" @! ]$ O+ v7 Q7 L) d7 }
sudo mount -t sysfs /sys ${2}sys
% y6 \6 Z' v$ h0 e% d- H% b; I5 k d% B- R1 h
- * b: Z* ]9 F" d) P$ j
' M5 S4 f, D! ~9 y8 H8 x; r" |9 B# E4 vsudo mount -o bind /dev ${2}dev
3 _" K; z) K1 I, b8 \$ i
4 x) T7 Z2 v1 ]: V# Y5 q5 o - 0 z7 V! E: F* b1 g
n1 r. p" u$ T7 }
sudo chroot ${2}
( K6 l, M% {9 U5 h& E! n
4 e' }/ S8 x; j$ u
# z. {" C- w+ W8 k- @" c! o, M. F5 ]9 E/ L5 t5 P+ B
}; E* K- {9 l( i& |
0 n! d# ~& U8 m6 V$ A# ?* v
( I" ? }4 \8 M5 F& A; k3 d7 Z3 c( E7 |
function umnt() {
& f* a5 X) I2 z* o7 P+ ~
( J9 x; @" l* Y/ {
$ f5 Y, z: L3 t3 p( _! t/ X; M! ]1 W J3 p+ w
echo "UNMOUNTING"
0 \2 x% k; T2 O5 V+ `7 W4 f
4 @0 `7 ]3 I% M9 \+ g- 9 m/ q! u0 u2 |# M; M- G+ L
3 x" J7 h! p7 J. J+ y+ ]
sudo umount ${2}proc, A2 ?/ @( V- P: I. b
K! s4 U) @7 v+ ?6 g - $ p4 v# n) ~/ \) ?
* ^/ M4 R! h" F3 x w( u8 Rsudo umount ${2}sys
* K# {# G o7 n. m; `$ t
; Q( v+ _6 |1 k- s8 N0 R - 8 t- U' ~) \7 o
6 \* ~# T5 x/ |' O" Isudo umount ${2}dev
4 P: L5 T- h" @( _! ^% C/ e5 S; H
: G7 d& _2 t7 I( T6 [+ O2 M8 W4 ? - 8 S0 ^' F; D: q/ E) ^! L
# b1 O; {: T9 G" u, n
}3 d- ~* ?" {7 k1 t4 k4 M! i
7 l* r5 Z: O9 k$ }/ u7 H
- , i6 w8 Q6 }" T" ^
2 y' ~ _" K6 y3 R, O, Gif [ "$1" == "-m" ] && [ -n "$2"+ _9 r `9 E$ O
, x, S5 Y0 _( f
- + B C& Z: V2 f8 T0 r: @ L; L
# m3 Q b% m7 ?] ;4 K4 D/ D* o3 o' b' | H% q3 X
9 X) Q- l \; e. l, O
- , K* p$ Q! x. ?
, M o# w" B% y$ b! o. k
6 c$ b2 q0 S) M! G4 W6 {0 n+ a, p/ p3 M: C. ]- O
. F! l1 ^: f9 d- l- x
0 Z% H+ S0 J; |: p( m B; e" F+ Mthen
0 U( @; Y5 H9 O1 O
/ a1 X( L+ u$ \- 4 q2 g9 ~% o0 @2 z
. j$ p$ s4 J; |* O0 P- h( ~mnt $1 $2" `* z8 V: x" _
: j1 K. w( `; |0 L, f8 t' w7 Y
1 b/ V; C [: W f; O. B* G, K( M* @' W2 f4 J
elif [ "$1" == "-u" ] && [ -n "$2", S/ V8 J: }9 L7 E: E7 o2 b
8 H# k* X8 ~; V( k* K6 W2 M
- / g+ m. ^/ D0 H) `8 w$ U
& L q0 }; @0 E# }
];! B3 e$ E% U4 T8 g' R5 Z3 T- u: H
1 e4 n* O7 ?7 I) a - # @7 h/ C3 S/ ~4 T' p
6 z/ m8 E* q0 ]! k! b: n, Q
then9 a7 L2 `' A C5 V
7 |% F& f I. Z. S# w6 x( | - * Y' x; _: B/ ?% F2 S0 G
. e; }6 j5 m) H; F. C
umnt $1 $2% c9 G% A+ Q* [& e5 k4 W
' d+ p# E1 P, L/ k2 }7 N- Y
- : Q0 m+ C9 M( c8 {( b2 M5 L; E5 A
7 _, K, m* R5 x F& A9 z8 R
else
$ X5 i& q0 z9 m1 t0 X. U: \
' s0 W" k0 T0 k+ d, P2 n9 O
3 h- q0 c) \# m$ K+ F9 |; u
& [0 ~ t* J7 S$ W% @1 recho ""
+ |# e+ y' C! h# W/ `+ N4 Y1 j3 t9 Y2 @0 u* F5 W9 Y( H7 q
: {. `9 u! M5 K, O
2 w+ s. B1 @, f/ l% gecho "Either 1'st, 2'nd or both parameters were missing"; @; C* F% ~2 K6 s* @6 k
2 j( k+ y/ \ P0 w
" }) _0 ?- _9 \
: p1 u1 I) V# Y" I, gecho ""
7 p! @ Y3 E2 c) }* I/ t
8 G! k: t7 u! G, b1 U) I# D/ |
! p/ [7 G% @" k- K: T8 l' Q1 u, I' B3 a! C
echo "1'st parameter can be one of these: -m(mount) OR* F$ N- w; E# I
5 ~" g6 w9 Y W- [, _' [8 d9 q& s
4 ~) E. b0 F9 c; B9 `# g& I2 r2 G4 t' n T5 x) \, G" r8 E* ^3 Z1 X' l* P
-u(umount)"! u$ I5 M% _1 _# G3 `: L
) X, L0 I" B9 b
/ T {4 o9 i- R+ i# w1 y& s
' Z r% F0 F2 f) t W' |echo "2'nd parameter is the full path of rootfs2 Q1 l% y! Z0 r6 D& B
$ }. a i3 B6 M
" ?2 M. `5 v' A! j8 H1 e1 i" d
0 Y7 W7 S# d1 g; c, r% Udirectory(with trailing '/')"
7 s/ L% X! t4 v2 g& l
' _" X! Y7 o4 V9 t) R' U7 l
s$ @" h& O. G; u
5 S7 \1 ?5 C$ {: N6 y3 d r, zecho ""
/ B0 T8 z* _# M$ v j
7 x7 D* V8 K; k1 ^$ E
2 p8 b& q$ I p7 _; O% ~' E) E( Y6 {' N
echo "For example: ch-mount -m /media/sdcard/"7 t% R" o9 C. S) q
$ a0 x0 f; z! A) N( C0 m- ' U, g3 M. X8 O4 ?0 ^
4 U0 H$ e1 Q+ S" M: x# R. I& |% Lecho ""
# I2 a6 ^/ ]8 e6 @% a7 n4 C# _ n$ }0 Z# Y& {
2 B: n% G+ y, n- `, L1 y" J# V5 L7 \& J* _
echo 1st parameter : ${1}
6 Z, r5 m% M5 e1 c' m# Q O( A0 v1 C8 k
( y1 P6 M0 n) j1 \% @( }) u3 X' k" X. q- _$ Y
echo 2nd parameter : ${2}
5 G8 o8 I) |7 @: ]4 w3 r' R9 ~3 l3 u+ ^
- * s8 m% j- E( m/ v
6 l7 ?/ q: w, }- Nfi
! E% h" L; k+ |5 b5 E) L9 K
l8 I# `) b. K9 s
7 w' w+ ~1 K& U/ o# v
![]()
; z' f: e7 ~' B( _0 d1 B5 j) G# |) j6 b D* p' t! M
1 ?& _( g- n2 Y9 n% ?② 设置这个shell脚本可执行权限,如下: sudo chmod 777 ch-mount.sh
③ 挂载文件系统: 执行ch-mount.sh脚本 指定参数-m,挂载成功如下: sudo ./ch-mount.sh -m ./
![]()
! D; W2 Z- j7 q& H: m6 q* U6 K5. 安装软件 前面我们挂载了文件系统,已将文件系统挂载到了QEMU模拟器,接下来就可以安装我们所需要的软件了。 ① 更新下载源: apt update 注意:更新下载源可能会报错,这里需要注意一下,因为tmp文件夹权限不够,chmod为其赋予权限。 如下: chmod 777 /tmp
② 安装软件: 至此,便可以安装所需软件了,在这里用apt-get安装自己所需软件,根据所需安装。我们这里来安装一个minicom串口测试工具。如下:
1 ] l0 w6 p. y* h![]() 7 ^/ W/ W6 @) f% m/ ?
③ 安装完成后,exit退出QEMU。 ④ 执行ch-mount.sh脚本卸载文件系统,指定参数-u,卸载成功后打印如下: ) L5 t9 D n( }2 I
![]()
3 Z3 Z* X/ B2 a5 x U' |! A
+ I( t0 H4 b+ k1 h, K# V
注意:我们exit退出后,只是退出了QEMU模拟器,并没有卸载文件系统,一定要执行脚本卸载文件系统。
. A9 B' Z& }" y% J7 \* | u- c6. 打包文件系统 ① 完成前面的步骤后,用tar命令将当前文件夹下所有文件压缩,命名为OKT507-linux-ubuntu.tar.gz。如下: sudo tar -cvzf OKT507-linux-ubuntu.tar.gz ./* `/ W0 M+ x1 `! S, U
② 压缩完成后,为文件系统压缩包OKT507-linux-ubuntu.tar.gz赋予权限,如下: sudo chmod a+w OKT507-linux-ubuntu.tar.gz ! C3 } a8 u' q, p! p
![]()
6 J. B* R. H6 V( z; ]1 N& u6 o1 m, v6 K0 }& f
③ 将刚打包好的压缩包替换到上一级目录下的旧的文件系统压缩包。
; Z! H: m. Q, d( g2 L4 C! E![]()
+ r. s4 r; c) ~. t; `
- i4 `1 q3 ?/ R# _* k% n* n④ 重新编译打包后生成新的镜像烧录开发板。 ![]() 8 h/ x/ x: g5 P; l$ O8 r# Z* P4 s
/ G/ O3 c8 y0 y( _9 T7 h: \8 P
% {7 ]0 {4 B- S/ j, ~7. 测试方法 烧录到板子后,在终端启动minicom,验证下是否安装上。如下:
U8 y0 M- D* g![]() * y! H/ ~* v! o+ i8 @: D
从上图红框可以看出,通过终端命令启动了minicom,说明我们在QEMU中安装成功了,至此Ubuntu文件系统定制就做完了。 " c! M/ ? w0 i; j# y t5 o+ N
通过这种方法可以个性化的定制属于自己文件系统,安装自己所需软件,也可以根据自己需求将出厂不需要的软件用相同的方式卸载掉,这样既能减少工作量,又利于批量化生产。
0 m/ R: n* [$ Q+ r |