EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
为了给客户的测试和开发提供便利,飞凌嵌入式的开发板产品一般都支持多种操作系统,以基于全志T507H处理器设计研发的OKT507-C开发板为例,它支持三种操作系统,分别是:Linux、Android 和 Forlinx Desktop(Ubuntu),这里提到的Forlinx Desktop系统是飞凌嵌入式在Ubuntu base的基础上构建的桌面操作系统,完全兼容Ubuntu18.04,相对传统的Linux系统而言易用性更高。 6 D3 }4 V" S5 N
+ O2 }. q0 {3 U9 u C4 I4 K) i![]()
5 T. k9 x+ v$ CForlinx Desktop(Ubuntu)系统基于Ubuntu官方为嵌入式设备制作的操作系统-Lubuntu,该操作系统具备apt-get、ldd等常用的命令,若需要安装软件则直接apt-get在线安装即可,不需进行交叉编译移植等繁琐操作。但是每次重新烧写镜像之后,之前安装的软件就得重新安装,比较繁琐,如果需要批量操作则每块开发板都需要去apt-get安装,这样会大幅增加工作量,很不便于批量化生产。 3 m- H/ O/ @* ~: s5 E
能不能把软件一起打包到镜像呢?这样每次烧写完就不用再去apt-get在线安装了。答案当然是肯定的,这就涉及到文件系统的定制了,那么接下来,小编就为大家介绍在Forlinx Desktop(Ubuntu)系统上定制文件系统的操作过程。 + m: |- L1 M* c/ G, u
1. 解压文件系统 首先,找到OKT507-desktop-release源码的文件系统所在的目录,然后将文件系统压缩包解压,路径如下: OKT507-desktop-release/ubuntu 7 l2 N) @, ^' `; B; |2 J! K
![]()
( c+ X2 }9 S: A: B) w' J) G2 P解压后,可看到文件系统目录OKT507-linux-ubuntu,进入到此目录后可看到如下文件夹: / Y% h6 r: s7 w
![]()
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
# B; U) M0 G4 S* e4 S3. 修改配置 ① 将QEMU的qemu-arm-static拷贝到文件系统目录OKT507-linux-ubuntu,如下: sudo cp /usr/bin/qemu-arm-static usr/bin/ / H' t- Q0 B2 L: ?6 x0 d
; S/ |+ V9 C# X8 v) z( v1 F![]() & y: f) _( e- j" q8 B# |
② 拷贝PC主机端的DNS配置,因为待会我们安装程序时要用网络: sudo cp -b /etc/resolv.conf etc/resolv.conf ! E0 ~- H: y7 @+ x
![]() 9 H L$ e: A. x
4 w7 O2 f5 a3 M1 Q
③ 修改下载源: sudo vim etc/apt/sources.list ) J( h+ D9 d) R8 z
添加 deb http://ports.ubuntu.com/ubuntu-ports/ xenial main universe deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main universe , U# S( J6 ]: O# k
![]()
# \' F# b; {6 e; v
3 f. l2 D0 G2 g2 w' a' W8 L# h3 e9 @& {# ]; }9 [- o( b
4. 挂载文件系统 因为我们这里是通过脚本的方式挂载和卸载文件系统,所以需要编写一个脚本挂载和卸载文件系统。 ① 新建一个脚本文件命名为ch-mount.sh,附代码如下:
9 j6 r% y( T6 ^: r% D4 q+ j& q) M! R* a' t8 L4 N+ W) B, E% D
& z/ z u. B% l" k- A |2 Y2 x# U$ c
4 p/ B/ ^9 l8 o) i
5 j; x9 U0 c/ Y- 7 O2 V7 k& {0 P5 `
4 s$ r/ C1 w( m#!/bin/bash" Z: @, R$ L8 t O' L6 T
- ?9 b2 X; \7 C6 A
- % a, ^7 S/ I" Z j3 J& c* N5 S
9 Q% Y# A9 a# e1 Z- M/ v3 w
function mnt() {3 c/ D. a$ f6 u! w
) w2 k/ N q% [% {9 {/ v
- 6 R8 {& m4 }* \, V- I
5 M/ ]) g! G$ V3 [echo "MOUNTING"
: O: }6 x% X, a. I+ N& N i
Q) `! M* J6 D
W P$ y* A2 |) Q
8 W3 r% [ W& A! [# ?sudo mount -t proc /proc ${2}proc
9 n$ p. _& _) E9 C; K- ~3 y5 W% |+ |2 w0 @+ [2 H
- " k R$ u4 u2 I5 t4 M+ M* u* o
6 Z! j! v: P7 E
sudo mount -t sysfs /sys ${2}sys5 L5 _" i3 h6 c1 r/ N' K# D
$ A( y5 b P% X! Z3 f. m3 | - 5 w" ~2 r0 y& H
% K" I" R- E- ?. s
sudo mount -o bind /dev ${2}dev
0 h' W9 j: a+ `* ~4 i9 I0 `0 i4 u! L
7 H# P" D- ^' G+ S
& e6 U; I1 \, U, f# S; ]: y( P* } y* N/ S5 F2 v
sudo chroot ${2}- v4 B+ p3 D& U! ?
) z! ?1 M' @/ c$ R9 C$ K7 ^" D
$ N) Y7 G: n I {: V6 U7 m- R M5 x
}
* e4 Q1 c2 w0 ]0 L! x: `' d( b* }
! H! k+ V, _* z2 C" c- 3 n. p2 T# o1 e8 i B* E
! N5 j) o6 P7 B' S" h
function umnt() {
V( J$ }: j3 l) r: j# t* f3 I4 a* @6 C; ]7 C
- ( h# Z/ [0 ]& C& l( j- a# a- d4 _
# x7 d) {9 t. w- P: recho "UNMOUNTING"
, f! r2 L9 }/ t) \0 L" \9 j# T/ c j; \
- 6 {6 v. a& M) H9 d& Y/ L: R; S
9 J2 \3 I, i* p5 m8 \& P) G
sudo umount ${2}proc/ H( |) x3 q3 M9 `; G: Q2 T, V! x4 [. S
! b1 p v! R4 G7 s# c# |8 H
& v5 N# F+ f9 p- j" s% ~2 O3 U# i- L2 j' x2 E% \" t3 F) p
sudo umount ${2}sys( k9 c4 e9 j! j: ~8 e0 W
- w3 M% D' |1 C8 c% j/ {
- 9 s- {/ ^$ x! ]! ]- Q
; H. v( j$ _& t/ f) \, \) Dsudo umount ${2}dev
! Y) D. t* R& X$ ^
- Z) |# f1 `9 c$ |
; I4 z$ g% s! g0 A0 S6 g
4 h }- q0 d* j! C/ \}
9 ~$ ]* `3 v& z
. N+ z' N- n8 I- & k1 _" e+ i8 p8 @& y
! S0 r- u) v4 ^) B I7 p' p
if [ "$1" == "-m" ] && [ -n "$2"
; ^ s$ G' b) \) N* r R+ `% W) L9 ^* ]
" a2 N6 {) Q6 D0 I' S6 R9 `" E6 ^
2 w4 m# g! a3 Q+ R) G] ;' }2 k7 X& C* r+ H8 |$ I. e: ?/ ]
! S2 ^% ~4 t* C7 S* {% _& q
/ M; R; p, z* x1 D8 x
2 w2 Q; G2 L7 b e
- |0 z4 G. k. f5 I+ i" Q& y) l% o: A) G5 D
* O2 y- j6 }4 o/ n& q- J- ^
& `4 `9 }5 K& p2 c) t7 p7 B' D8 |+ rthen1 C' R* G. t9 S. z, q, h! u- F4 S6 @/ n
c* U: k4 \6 [- / ? f4 o ]% {+ i; X; N; C
9 N9 B/ [" h# A; ~. P) ^mnt $1 $2
, I E' I4 }( E+ G% _
' c* t7 q+ f5 u# y( N% T5 h4 M5 p - 1 h2 w& Y2 }0 ]
( }9 c! U) A: j6 d# h0 @3 Belif [ "$1" == "-u" ] && [ -n "$2"
2 c8 ]* s+ l# N9 V) n
- k; b+ A4 Q1 g8 g2 Q: v A6 {* k - 5 `0 F: a& }; A! x) |7 ~$ Z
2 w' v9 Y, [: [7 X. p];% L4 q/ K6 U' U8 h. K: i8 C( p
9 g9 Y0 x- a7 c3 C! i5 p3 n3 I
; [( ~) l ]* x t
* ~! ~5 m: |$ Q' ethen$ l7 ^( j) \* b& N! r- N, G) M
! }' d0 b( D* Q- U8 r
3 J* S$ t) _& G( Y f7 J" k) d& T5 p8 {: \( _4 ] B; r8 V
umnt $1 $20 G: i3 P1 l/ O' x m8 L+ U
& o) @( j! C( B5 ]5 l v+ s2 y0 @- 1 R+ X! x) V$ C
! w7 Z5 r$ [, I. d" Z, v' eelse1 Q' ?/ u2 [) K. I: L5 `2 r
# t; M# i* Z$ `) @! B
" \( ?/ P: u; d. t
! J" |' D3 \: Z3 S( Becho "": `! I u5 G2 ~" w% C
$ I- c. m- f5 R- , s/ T" ` o7 b: }. n
; W( Z- d& `6 M) k! decho "Either 1'st, 2'nd or both parameters were missing"
, F+ |( r& V: ^
( F8 L6 O$ F8 [. i5 W+ Q1 \ - + g: X& W! Q9 ^# l$ ]7 h
% V0 R4 B: Y% {, H' o! P
echo "". K2 W5 p* k" t
! H1 k. t5 l8 f& ~ - ) B$ b0 X) D1 N# ?6 Q
0 T& `# s% _! [# f8 O+ j8 h
echo "1'st parameter can be one of these: -m(mount) OR8 D3 a1 i8 Q7 p$ c
4 Z% X: F3 [9 V o
# E) I2 p) m- @% K6 A& ^3 Y) `" b" ? U: D" u F) [
-u(umount)": D `1 @, L: y7 f
' x* {' L2 T; d4 R9 \2 E- ' e/ L4 y# B) K- t
3 V: S0 c, [+ M9 k; G5 K" J" `
echo "2'nd parameter is the full path of rootfs6 v. C9 b( N. H) d
7 I" x$ w* g2 K3 R+ T
3 I. @7 ~4 e k8 g& P: R8 I5 g1 u- A( ~" X
directory(with trailing '/')": R9 w8 D% g$ H; W6 |- H
6 N& u& X" q, l |
! V8 S+ q4 q/ T2 p/ r
) X) j/ n z9 y9 Uecho ""4 a: W0 W& B) v! B* y5 e
# P H: a# L" V7 e) F! E/ Z- : D( Q4 o0 u. F+ p3 h
$ ?& m0 i# b$ ^0 D9 Aecho "For example: ch-mount -m /media/sdcard/"9 J) T$ r4 K- S7 ?
1 O7 {" B1 o0 c2 U, f& ~# h
- $ m+ W- } X1 F. v6 @, b# l; p
6 `7 i) l' G, }8 ], D9 U
echo "" D' K; Z$ g! J& `( h4 C. J
8 z: u/ Y% E) z6 {( ^% [ - * Z; P. X( K1 I) t( q5 o" J0 f" z
0 Y; j/ i0 k7 e
echo 1st parameter : ${1}
2 P; |7 W- B9 X0 R$ L3 Q; {
! A7 L8 ^( v, b9 @) p: {
8 D! F4 Y6 Y, R, \/ L
* c* M5 d8 p6 `; I& W; L3 V$ V7 @echo 2nd parameter : ${2}
. g) ~; |: `( R( t, N
4 V0 t: o, z% W- ' L C3 I8 K6 t* B, S% m1 X
" ?/ c: k& h; W! d f1 D
fi3 T! D# I W, M& {: F" B- W
: |1 i" \, p( ]+ p Z
Y4 N0 t# d1 M7 _# z# e
* e+ p( d/ s* \& b, y
, x; v9 F9 s( f; Q5 ?# }3 F
! t4 m: v, p! a; c! y1 C② 设置这个shell脚本可执行权限,如下: sudo chmod 777 ch-mount.sh
③ 挂载文件系统: 执行ch-mount.sh脚本 指定参数-m,挂载成功如下: sudo ./ch-mount.sh -m ./
![]() 3 u- |" i: ?- V- V0 x& t
5. 安装软件 前面我们挂载了文件系统,已将文件系统挂载到了QEMU模拟器,接下来就可以安装我们所需要的软件了。 ① 更新下载源: apt update 注意:更新下载源可能会报错,这里需要注意一下,因为tmp文件夹权限不够,chmod为其赋予权限。 如下: chmod 777 /tmp
② 安装软件: 至此,便可以安装所需软件了,在这里用apt-get安装自己所需软件,根据所需安装。我们这里来安装一个minicom串口测试工具。如下:
0 Y/ W; ~, e8 z# P3 Y; `![]() D8 W# h' E, ?# K9 w9 b
③ 安装完成后,exit退出QEMU。 ④ 执行ch-mount.sh脚本卸载文件系统,指定参数-u,卸载成功后打印如下:
. E- k5 f% S2 v4 `![]()
% i, ~$ ~) E/ u% w6 ^3 q! j% P
, t3 ~9 Q7 M% |1 [ u注意:我们exit退出后,只是退出了QEMU模拟器,并没有卸载文件系统,一定要执行脚本卸载文件系统。 & x! T' V# K9 y( k
6. 打包文件系统 ① 完成前面的步骤后,用tar命令将当前文件夹下所有文件压缩,命名为OKT507-linux-ubuntu.tar.gz。如下: sudo tar -cvzf OKT507-linux-ubuntu.tar.gz ./*
/ b- [# K7 Q) @9 e② 压缩完成后,为文件系统压缩包OKT507-linux-ubuntu.tar.gz赋予权限,如下: sudo chmod a+w OKT507-linux-ubuntu.tar.gz , `% r- c, d$ j2 @$ z
![]()
, S9 ^, x$ d8 q1 `4 v9 u( T( M: y; {" I/ ~8 \
③ 将刚打包好的压缩包替换到上一级目录下的旧的文件系统压缩包。
! H, `- X; |) U, f: K4 u) `![]()
8 \& q( \* Y" r. V8 z M1 u% Y% Z
8 x6 P$ g5 h) a2 {% j④ 重新编译打包后生成新的镜像烧录开发板。 ![]() - t4 }: _1 O1 k3 r
1 f: K1 t" g/ o, O
) i$ t) c+ N- g; n' u. l7. 测试方法 烧录到板子后,在终端启动minicom,验证下是否安装上。如下:
* i% E9 g( u2 Y+ [- ?, P& p![]() ) ~+ l6 u# u& Q; q+ u2 {1 k( w
从上图红框可以看出,通过终端命令启动了minicom,说明我们在QEMU中安装成功了,至此Ubuntu文件系统定制就做完了。
/ o* X- g5 X% p; y通过这种方法可以个性化的定制属于自己文件系统,安装自己所需软件,也可以根据自己需求将出厂不需要的软件用相同的方式卸载掉,这样既能减少工作量,又利于批量化生产。
$ x; p9 ], R! d9 B8 S7 O3 Y |