EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
为了给客户的测试和开发提供便利,飞凌嵌入式的开发板产品一般都支持多种操作系统,以基于全志T507H处理器设计研发的OKT507-C开发板为例,它支持三种操作系统,分别是:Linux、Android 和 Forlinx Desktop(Ubuntu),这里提到的Forlinx Desktop系统是飞凌嵌入式在Ubuntu base的基础上构建的桌面操作系统,完全兼容Ubuntu18.04,相对传统的Linux系统而言易用性更高。
+ I- a- ?. o4 h: n* C# b4 i% B: [4 K T! V8 H
![]() # r9 p4 o( V; Y5 z4 m
Forlinx Desktop(Ubuntu)系统基于Ubuntu官方为嵌入式设备制作的操作系统-Lubuntu,该操作系统具备apt-get、ldd等常用的命令,若需要安装软件则直接apt-get在线安装即可,不需进行交叉编译移植等繁琐操作。但是每次重新烧写镜像之后,之前安装的软件就得重新安装,比较繁琐,如果需要批量操作则每块开发板都需要去apt-get安装,这样会大幅增加工作量,很不便于批量化生产。 ' w2 j$ U; }$ X$ Q2 t1 J9 R8 m
能不能把软件一起打包到镜像呢?这样每次烧写完就不用再去apt-get在线安装了。答案当然是肯定的,这就涉及到文件系统的定制了,那么接下来,小编就为大家介绍在Forlinx Desktop(Ubuntu)系统上定制文件系统的操作过程。 $ S% k h% E& L5 }8 z# Y( V* C
1. 解压文件系统 首先,找到OKT507-desktop-release源码的文件系统所在的目录,然后将文件系统压缩包解压,路径如下: OKT507-desktop-release/ubuntu
" a F0 m$ X7 Y& g6 [( T+ p2 G![]() . d0 @$ ?+ P: l8 j
解压后,可看到文件系统目录OKT507-linux-ubuntu,进入到此目录后可看到如下文件夹: : O# j) w5 ~7 ~4 K) N/ K5 ?- A
![]()
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 % P; H0 }. a, H% W: p' o9 l: N5 f
3. 修改配置 ① 将QEMU的qemu-arm-static拷贝到文件系统目录OKT507-linux-ubuntu,如下: sudo cp /usr/bin/qemu-arm-static usr/bin/
. O, q# V0 x4 ~+ ^. i2 x# {+ M& o! y0 I1 E; O; A' N1 V
![]()
3 ]) b$ l$ f2 S6 {② 拷贝PC主机端的DNS配置,因为待会我们安装程序时要用网络: sudo cp -b /etc/resolv.conf etc/resolv.conf 1 q6 U' I4 q) s, F# M* r ^
![]() & Z1 u' Z$ l8 F+ m# V5 y3 y, ]
/ j. Y' j+ o @③ 修改下载源: sudo vim etc/apt/sources.list r9 b' ^( x( L" [
添加 deb http://ports.ubuntu.com/ubuntu-ports/ xenial main universe deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main universe & L. |3 `9 h/ _( U; u5 A6 O
![]() " z1 ^& A, v. r7 R* r# Z! Z
/ I/ ?- J2 ]! O8 z N+ B8 W: I
; g0 F9 ]$ f0 s& [
4. 挂载文件系统 因为我们这里是通过脚本的方式挂载和卸载文件系统,所以需要编写一个脚本挂载和卸载文件系统。 ① 新建一个脚本文件命名为ch-mount.sh,附代码如下: - ~2 k" L4 ~: |3 p5 S. n3 k
4 U3 z. u# i" {2 f- r/ r. Q
6 x/ T$ c0 k$ }; Y' L
4 k; Q, \$ ]3 J! c$ [; x
# f0 V4 a; {3 w6 E' ?: X6 T+ ^: ?
! a0 _3 F$ [! M9 V
6 K9 `/ w* O" \; \; k1 Q# o- i3 k* a: Q9 p
#!/bin/bash0 t$ Q) F' Q9 n* M3 C2 a( a
- J/ b. k& M1 m% v( K! I- 4 s: Q5 o0 C; |, i. ]) B! M
8 Y; y; P9 a* D4 O. n
function mnt() {
$ Z& c* N6 c6 Z6 g/ q) w/ K# ~0 v3 b& n2 l. J6 t+ V" {$ ~ x( H
- 8 D8 M* `( H/ |" M$ Z
1 ?" P1 ]3 w+ J% v. e
echo "MOUNTING". B# I- A# I$ y9 L0 K5 |4 W
4 M% g ?2 Z9 Y6 [$ c+ B
- + N6 y6 O6 Q+ K# e
' _0 m6 t. \: Z8 x- ysudo mount -t proc /proc ${2}proc6 S) V# w7 J0 I8 P
, c, p# w3 r9 k. ^0 }7 [" D - 8 V) X9 Q, c B/ r* ^$ t2 o) f
7 ?0 Q" H+ k9 H- X0 P8 n! z1 msudo mount -t sysfs /sys ${2}sys1 c! e' ~: E5 Y8 Y$ i. J0 G
' a0 {( z6 c5 i+ P4 e8 k - . s- e( N0 Q: ?9 f( M3 E& @
, v0 K! y1 N+ A0 Y" Ksudo mount -o bind /dev ${2}dev
2 Q% j- \) S$ y! z4 S8 H9 A7 w7 t$ i4 Q5 V# h2 V: G
- 6 Z$ }2 D' [/ l) n6 @6 t( y( U
: [! R- I8 Q# |8 c
sudo chroot ${2}9 w+ v6 L# y% \# t
' h9 \& ^6 K1 T. E; o3 K' n% ] - 8 D" c) T' Q! t' K
1 Q6 I# t+ s, u' V) |: B}
3 q1 [( w8 Y4 u, G. @
/ F% m: n( l% [* y! Q
5 L/ B) ~1 L) B( z) k7 y
6 W3 N- ?' Q4 e/ Lfunction umnt() {4 }3 Q* |9 w2 i5 ?& p
/ ]$ S! g. \5 @6 f) f
9 j1 N6 K* [6 l
7 N4 ^6 e# o5 Y, H" c& Becho "UNMOUNTING"
3 E& D1 N* ~3 |" P, s( X
: d$ {. |2 {! x" l- 4 V; @, b' M9 t
- b0 _& m' i4 ^2 n& }# _$ ~
sudo umount ${2}proc
. Z: P# H6 P- @5 n1 F! Q7 K3 K3 ]9 q8 @
- d# u P% z, i8 `
4 {! X- U& r4 j% x0 `( k/ r) @) esudo umount ${2}sys- r6 o% R6 {, V3 q4 @# c# D
2 z$ y3 C5 g* l( n7 Q' C
5 v" p, w6 E; Y' H+ e) Y0 H/ w" @
5 l3 Z4 v; G3 R5 m( a& l% ysudo umount ${2}dev) h5 F+ A0 @/ d( H5 Q/ w( D9 `7 b1 U
* P6 z$ P; D; e I- q
8 Z9 O+ w4 ~ Y+ R+ C% S# G) x" M, M- j# e
}
2 k l' H0 K& B) M) ~, P: ?
3 b$ K9 i k2 V; C/ m% U+ y* I- . R( G3 U6 i3 I) b# [ C# i
# O; [7 v$ z9 n2 iif [ "$1" == "-m" ] && [ -n "$2"
7 Q0 r% q! o. z, z1 J6 w; Z. f# e1 f3 A% C5 ?# s4 D$ r0 m
- 5 }# T; t2 k' q6 u; T P: L
7 c$ n+ T4 i9 U/ v, Z; w
] ;8 I W5 A" r3 q: ?# A- i
0 J0 N2 l! @: G
4 o) Q1 T! `# Y/ j6 j0 L2 d9 b% |% q. N; z# `
# K7 m* B$ ~' _( I x% _+ k% t, `
% W4 p+ b8 v/ a$ }* N5 }# m
5 h- O. j. F! D/ g* u/ t7 R3 g7 ~! z# V0 P* z; _0 _' r( @7 ?
then/ e# X: K: T4 P5 ?& P, L
S' A0 u$ S, f5 E
- ; J N- L# `, q( X3 ^! @
6 _: D5 A- A1 q* x
mnt $1 $2 i. c) ?3 a" m/ R
% M0 `" L1 x( z
& Y4 j( o( x8 P2 N
* B1 R) h( ^$ i1 V4 }elif [ "$1" == "-u" ] && [ -n "$2"& I5 A/ g$ m# `
/ _8 F/ e J; h- k. _
6 E6 R a8 [+ n) J( R! H! d
! v3 c) v$ F/ _6 ~6 v: H2 ~];3 P) n! n n7 G' u$ |+ F$ ^) {
* w; O3 I/ L$ W2 }3 ]+ ]9 d! ~* g
" I: c4 `. ~; |- W8 J" u/ u, ^1 ~& `: s0 N
then
; }8 L9 Y* \* ^ m) e
6 Z3 E, X, f6 i7 P$ X3 p- - ?. d6 q/ D$ |0 }1 [2 i
' `5 T: _2 F) k8 A& b# K" vumnt $1 $28 {' ]# R! ?! f, A$ @+ E
5 B' S( R. U) y# h3 z, T1 v
1 |) U3 u0 h$ x, I1 V7 }1 T A! C3 I6 w
else/ T/ R, A* r$ v
- J+ ?) y3 @# `$ ]+ \% \
; X% H5 D4 y" |# M+ z2 R+ x( O2 P1 i
echo ""
3 C- u# v5 ?# S' O3 W# j; t* U: K. z5 d; F
0 z$ p2 q* Y5 B# I# w, w% B0 e/ B+ i" k3 L1 P0 r
echo "Either 1'st, 2'nd or both parameters were missing"7 n; m: g/ K3 g6 B& v2 T4 I7 n9 Z
. \5 K0 {3 L6 t5 i0 M
: e! z% g2 P& m# ]' c0 F( U& r+ B: o* [5 S* F
echo ""
' u E1 v: F: Q2 o+ [) [
% u) F, }; e2 h6 P- + ?) R& b. h% L' K, f0 Z k
, n8 C1 p6 A0 O: ~: Techo "1'st parameter can be one of these: -m(mount) OR" k* J) Q6 T% N, p8 G* `+ Q( \
I( W- V6 {6 I7 R% U& k
* n: Y$ t) H* G2 t9 c
: { S" N) V" w) O4 Y# |$ }-u(umount)"( [1 z' i0 |* w3 f3 r
1 D( r1 c8 e; V; B3 U' o. J% A
5 v P9 z& y1 u+ F' [
4 _% K9 v, k( z& Lecho "2'nd parameter is the full path of rootfs
6 I- g5 n) J' ^1 e: |
5 `6 {3 }+ T9 a" _% ]& _; C* v- * h% Y1 h1 @9 l+ J9 a5 w
. \5 l5 @: `9 p( Y. U: G/ bdirectory(with trailing '/')"' E$ R& c- A+ H
Z! h0 T3 Z0 F! u2 N
/ ?2 H2 H; E) h3 Z X% M2 G% ]% y. P
& K8 g0 b3 z5 m+ Gecho ""
0 n! U- Z0 d" m, ~
2 m+ H7 g" ^9 q! M' z! H* H
5 F5 o; G2 M: M) l7 L R4 i; ~# p
3 B" J0 B# i5 j1 c0 Necho "For example: ch-mount -m /media/sdcard/"
2 t& B. s }8 g( x# g; S; _) Z! `. H4 O V
- 3 ?+ ~7 W O; \# u1 `
r& }$ N3 b% a; x1 n* [
echo ""
9 I* j7 H4 g q3 O: e6 T* Y5 r$ X
- , ~) t g5 t3 }$ v, B# e) A1 s
! E1 y, I0 h" C \6 V9 H- U9 P
echo 1st parameter : ${1}5 U9 l' v" b8 K& x" s0 ^
9 M* T4 q4 O1 Y3 }5 T7 |7 R- i
# M$ C$ C/ l/ l) U. h2 h
0 j1 i& Q, C' O7 w. e' necho 2nd parameter : ${2}
2 {+ j2 m2 L1 Y/ p1 Y
2 F K' g- i+ B7 ]* ]5 b
* E, a' h* S3 _" u
8 s0 _$ z; `; ? Kfi1 [; S% l5 k t' `0 C
1 \7 O' ~. m+ K# O0 s# H" _
7 U# p/ Z, m- G. u/ |, f% O
![]()
' J! k- j/ w4 z
' h% `) F9 Y& e( c6 ^8 E+ Y6 i
& j7 ^. X" D9 `: o; Q② 设置这个shell脚本可执行权限,如下: sudo chmod 777 ch-mount.sh
③ 挂载文件系统: 执行ch-mount.sh脚本 指定参数-m,挂载成功如下: sudo ./ch-mount.sh -m ./
![]()
9 ], s+ R$ H1 c4 t+ T. L5. 安装软件 前面我们挂载了文件系统,已将文件系统挂载到了QEMU模拟器,接下来就可以安装我们所需要的软件了。 ① 更新下载源: apt update 注意:更新下载源可能会报错,这里需要注意一下,因为tmp文件夹权限不够,chmod为其赋予权限。 如下: chmod 777 /tmp
② 安装软件: 至此,便可以安装所需软件了,在这里用apt-get安装自己所需软件,根据所需安装。我们这里来安装一个minicom串口测试工具。如下: , S. ^6 ^% x' R. L! a# V3 e W
![]() 6 x, {) B8 W2 |, t: g
③ 安装完成后,exit退出QEMU。 ④ 执行ch-mount.sh脚本卸载文件系统,指定参数-u,卸载成功后打印如下: ! p3 d" v$ T" t
![]()
% [1 W$ g7 [/ \# a/ i J" J( S2 u
3 m! j, T, D( }- J注意:我们exit退出后,只是退出了QEMU模拟器,并没有卸载文件系统,一定要执行脚本卸载文件系统。
8 T. u" l1 D6 {$ S! O/ D6. 打包文件系统 ① 完成前面的步骤后,用tar命令将当前文件夹下所有文件压缩,命名为OKT507-linux-ubuntu.tar.gz。如下: sudo tar -cvzf OKT507-linux-ubuntu.tar.gz ./* 6 G& N- S2 b: X! n, T# m8 p7 B
② 压缩完成后,为文件系统压缩包OKT507-linux-ubuntu.tar.gz赋予权限,如下: sudo chmod a+w OKT507-linux-ubuntu.tar.gz & i. g3 K" G! W
![]()
! [% @% O# G. [- i. q/ ?) c9 U
* ~, i$ I$ n+ L' G% M- Z
③ 将刚打包好的压缩包替换到上一级目录下的旧的文件系统压缩包。
7 [1 P, M2 [! g* N- P. _![]()
) E3 ?; s7 g# k
! C! y$ o% B' M+ @' v/ }& ?
④ 重新编译打包后生成新的镜像烧录开发板。 ![]()
/ S* L' V5 L# u: ~
2 z7 _! ~) X, D1 X5 I7 g! O
' x) C$ `2 H) T1 y9 `( X# p3 d1 F7. 测试方法 烧录到板子后,在终端启动minicom,验证下是否安装上。如下:
3 [* J! \( y0 k% x![]() ! m3 w; o) z2 z6 A. S
从上图红框可以看出,通过终端命令启动了minicom,说明我们在QEMU中安装成功了,至此Ubuntu文件系统定制就做完了。 ( K1 z3 V# C" L/ ~" j" C8 Y4 A
通过这种方法可以个性化的定制属于自己文件系统,安装自己所需软件,也可以根据自己需求将出厂不需要的软件用相同的方式卸载掉,这样既能减少工作量,又利于批量化生产。
+ u7 w9 ]( N; k5 [2 }% W; R |