EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
为了给客户的测试和开发提供便利,飞凌嵌入式的开发板产品一般都支持多种操作系统,以基于全志T507H处理器设计研发的OKT507-C开发板为例,它支持三种操作系统,分别是:Linux、Android 和 Forlinx Desktop(Ubuntu),这里提到的Forlinx Desktop系统是飞凌嵌入式在Ubuntu base的基础上构建的桌面操作系统,完全兼容Ubuntu18.04,相对传统的Linux系统而言易用性更高。 7 U8 o* Z% x& Q3 ^& G5 f
( G2 b& Q6 U1 M7 |! m% m6 B# k5 l% W![]() 1 R. R/ ~& _: W" ^# v g6 m
Forlinx Desktop(Ubuntu)系统基于Ubuntu官方为嵌入式设备制作的操作系统-Lubuntu,该操作系统具备apt-get、ldd等常用的命令,若需要安装软件则直接apt-get在线安装即可,不需进行交叉编译移植等繁琐操作。但是每次重新烧写镜像之后,之前安装的软件就得重新安装,比较繁琐,如果需要批量操作则每块开发板都需要去apt-get安装,这样会大幅增加工作量,很不便于批量化生产。
3 w s; x, \: U1 Q能不能把软件一起打包到镜像呢?这样每次烧写完就不用再去apt-get在线安装了。答案当然是肯定的,这就涉及到文件系统的定制了,那么接下来,小编就为大家介绍在Forlinx Desktop(Ubuntu)系统上定制文件系统的操作过程。
/ w5 f* f5 Z$ n, i4 A9 ^1. 解压文件系统 首先,找到OKT507-desktop-release源码的文件系统所在的目录,然后将文件系统压缩包解压,路径如下: OKT507-desktop-release/ubuntu / ]9 Z* \/ g8 X! M6 u
![]()
2 _/ i6 G; s5 r" }- l5 G解压后,可看到文件系统目录OKT507-linux-ubuntu,进入到此目录后可看到如下文件夹: $ x0 m( n3 i5 u [" }1 Z3 c/ y4 q
![]()
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- P, V: W W: W% p4 I" }4 H8 k3. 修改配置 ① 将QEMU的qemu-arm-static拷贝到文件系统目录OKT507-linux-ubuntu,如下: sudo cp /usr/bin/qemu-arm-static usr/bin/ : L6 g# N- i& k) c/ C
# L5 f3 T' |# p& Z9 ]" B
![]()
: ^: I) H7 P, g6 h0 @' v( G② 拷贝PC主机端的DNS配置,因为待会我们安装程序时要用网络: sudo cp -b /etc/resolv.conf etc/resolv.conf
" O; g1 n4 B% j2 O( I- g![]() , z" ]5 N6 L. r
& B! c$ b: _6 z+ I @* q Y& I
③ 修改下载源: sudo vim etc/apt/sources.list ; G; N% w- q4 }4 K* P
添加 deb http://ports.ubuntu.com/ubuntu-ports/ xenial main universe deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main universe 3 ^# u7 V' j$ p" L
![]()
- D" k T* s( E4 e) G+ Y- V. \: G! K7 X7 C1 W8 X. o
/ a- E6 x5 Y: w! ]4. 挂载文件系统 因为我们这里是通过脚本的方式挂载和卸载文件系统,所以需要编写一个脚本挂载和卸载文件系统。 ① 新建一个脚本文件命名为ch-mount.sh,附代码如下:
. f& W# t3 m3 |* N1 x% |6 p4 I! a0 M- b: c$ V$ Y5 X Z* ]% F
+ _2 t# T$ s9 \: m
1 @, v0 \3 f# ]: X+ C/ M3 c6 n$ V& Q5 H* {
8 k: B' i5 ^4 C, v8 T& ^
% z* p1 N% q1 P! @5 T+ T
) f, E, D9 L4 u& Z#!/bin/bash
8 v6 b; ^9 M& U# X
/ G0 Y; @3 s' d% p P4 C J- ; T+ T( @0 d* K9 t
* c$ } A! u5 v' J4 R
function mnt() {
& @; R4 N/ y. O$ y) P; a5 S$ ^; l7 s# E/ q
. d: j( A" E- n" Y
; L4 O8 Z d9 l- n0 Xecho "MOUNTING"( M9 }6 y B3 c" v
3 f$ V3 C6 ^* M0 b2 F7 i- 8 R. r5 d: c% y) i3 k
: p% e' H3 H( G; Wsudo mount -t proc /proc ${2}proc/ S1 ^5 y \ t) L. o
M. c1 v7 x8 \1 k0 e8 _
4 r5 r7 v7 V+ ^
1 [4 Z6 x' g# m* Rsudo mount -t sysfs /sys ${2}sys
|) c( |) ?1 f/ k8 V
; ~9 ]2 ^; P8 X4 v- c. e# A- & [( p9 w* w2 U p# w
@: R! j, `0 g+ f; V; |8 Msudo mount -o bind /dev ${2}dev
8 N% M* z/ _. o [1 e# D0 m5 m% O* g, u) J1 g: l
& ^: [- a; F' D2 v9 h1 ^
/ T g+ N0 G, ]& C) k2 Zsudo chroot ${2}
: F# h: V5 Y6 s2 L' `
. m( Q6 ~; C3 @6 C; X6 ]- _+ d- * a, F. ^; u" y! R5 b
' [0 z& ?9 Q7 }1 A6 o' w0 G, [* e}
2 w( Q% H/ D* f7 q5 {4 |" k, ?
- J; R9 t9 L- E; | - $ y% N, E( w N& l. x" ]
- U$ Z6 C/ @, j( _; sfunction umnt() {4 F) S/ x1 p; t- X2 d
3 k6 B- V8 x7 Z5 y2 _: _ - 4 x; f7 f% ~" Z. }) x
0 G1 d' R6 m+ [5 l
echo "UNMOUNTING"
* N' e3 l. l2 @- o ~% B$ b+ q
- 8 k6 |0 }$ u+ _6 G
! j4 n5 @& c F, O
sudo umount ${2}proc
E8 ]% I: @# }& I+ I; E* j! [( G8 j+ I4 q
6 D) ^" z1 S* u! l, v
$ l& J- f0 F2 o( Z9 j+ a) x; Hsudo umount ${2}sys
4 I% L$ N7 X. s$ T+ B1 F7 s9 n- T3 G, t/ Z1 G2 L
- 2 ]& b0 V1 z) X9 a: b: z
S% ^$ \* x0 o& K' X: csudo umount ${2}dev
/ W0 |6 |$ X5 W. j' j$ U
) T) y, D& O9 c; g0 C% B
2 w& ~; y2 \* \' w% ]8 b
+ ]! H7 J+ B/ ], M- M- C: k3 K3 T/ I}
$ Q9 y% [9 ?" `0 n; m0 W- w" ~, m. ~7 z- C: {1 g1 b1 x1 R6 N
4 ]0 o5 x- M2 N' x, |: |% \6 w$ C/ @
if [ "$1" == "-m" ] && [ -n "$2"/ I: k1 a3 o: l$ C
& D) k7 O2 K$ t r# |0 {" v2 a
- 0 z( M+ M! m2 |- F1 _
& e+ X5 z* m2 J4 P. h# y) u3 C9 u
] ;
7 }5 L a1 t! {0 \
/ q5 I3 G; L6 L: W) B - / [4 J" U: J4 J" z
, }& a3 e: A& ]! z* H7 H& B4 \: G3 H5 q. F- V4 E$ S/ j) s
5 a% b3 x4 @$ R
7 |) ?; m$ N- b* \* s- u9 |7 s w) ]: [. H; @/ J: Y/ ^
then8 k; F- R9 t; `
% k0 V) f% j+ g
% ]4 I0 d6 E: D& ]2 p
( W$ d, U' v. l( s/ Dmnt $1 $24 d' q0 d: Y V h
: i7 ], W8 d# A& C# t. q9 O, ~6 t0 Z
9 G% t0 I3 s k1 m5 l1 Y; }) I8 s
elif [ "$1" == "-u" ] && [ -n "$2"
3 h% P. F! P/ z n' O0 Z0 d0 e | e! Q! g* s0 |( G- t+ w
: N; @6 w$ ]- h7 }% E( e" N1 s& s. P% Z
];) F @% e% {6 Z0 j* T3 V+ m) R
" q7 F6 w+ P/ i. e
- 4 w7 @- K; G" i) i# Q: C& N
* z: b# U( ^) _/ }) {
then: T# E, J1 J" d6 y. z2 H
! N4 y) B' y% t2 `4 |
6 W9 n z3 H5 j3 _% X) L( u
% x4 Y4 M9 o! Xumnt $1 $29 `2 J% f5 F1 @
7 h( r2 y" h1 H% x$ }0 w8 ~6 p
3 R' ^# g6 ~5 @# f Z
6 w# q9 Q- ~, E: o4 T1 melse
+ l4 ~& `, i7 S1 x7 w& X* v, d) F$ z/ h( h' y8 [$ ~2 M
+ [1 ]: l2 d" x+ ? h+ e6 E& f5 Q
/ x! F, ^6 x: m7 t$ J) Y0 cecho """ h3 i; h5 I: D/ `5 B
2 i _1 ~( J. g+ a" R2 }9 v: Q4 Z
- 3 P; L# ]4 B. S2 R& Q0 S& Q7 \
, \0 k2 H& w: H; X6 M9 K; k, B
echo "Either 1'st, 2'nd or both parameters were missing"0 b# @" K0 f# x9 K$ t# @
- x) z' W( A& b' l
% N+ i4 E3 F" M; c
6 _6 t0 n. H, M3 l$ y) C- A$ lecho ""
! [+ y0 Y" I1 E" ~: T
4 @% y5 T$ Q! `* ^2 T. h# p/ T- 6 |1 f% O; J+ G8 U
4 E2 C* @( H, I0 d5 b
echo "1'st parameter can be one of these: -m(mount) OR, l0 T9 j8 D& |* v" H1 {+ S+ x% e
/ _5 ]. H4 B: z - ' _" |: j; w; \; c/ F
6 }1 T1 H9 F# T6 c" s* r6 E/ D
-u(umount)"
4 W" N2 Z! ^6 B5 R$ |+ H H2 M$ O n, @
- 5 x1 F# \# n1 B, R8 i
4 @( `/ [+ f" S5 r
echo "2'nd parameter is the full path of rootfs6 D$ Q* [; L. j
5 |( H6 I, J2 \/ F - % ~9 k+ `7 s1 W% k% k+ i
: e( K8 y; J, `
directory(with trailing '/')"
& j3 e: k) l3 b9 Z# i0 a
k1 Q j6 z# Y8 ?8 H" [ - 3 H0 x$ _7 ~3 e, g
1 z6 }5 W* @- N1 i- lecho ""
, L' D4 u. z4 W) N" U
^; ?! ?. P4 B% ~9 S: ~ - 2 T9 ~6 B; a% d% }. ~9 _
4 s$ X0 `3 ]7 q4 A2 H
echo "For example: ch-mount -m /media/sdcard/"; Y+ L# p/ k0 ]3 d1 c
% J9 @1 j* f! l6 A9 L
: R2 H5 |( t+ n, m
: p0 X0 g- |, Techo ""
; W/ V7 ?5 [- i5 V7 ^7 T1 C
% X$ h: Q( B+ X) C- n4 u1 H! m
3 s; y; o5 N& }) t1 j( p
% X% g$ c, L( [2 r! W1 a4 Mecho 1st parameter : ${1}
' w3 z3 J1 R3 Q4 J& j4 p) E; }9 e- g: T, I& H. z/ j7 c
- " b4 C+ {/ ]+ Q c# w
) s3 l0 s% V2 Z# O
echo 2nd parameter : ${2}
, O* k( t) M6 b( g# u
- u! Y4 o; d/ z. D2 ] - 1 }. {% j! T" k' w/ P& p: L
, C1 w9 b' H8 q5 s- n$ j' `5 ^
fi% ^4 q, J% u* G& L
, Z+ P) j0 Q- W3 [* l( |
2 G/ J2 R# L* r
![]()
' a' J# ]( n# D; c7 B% j; ^9 x/ N, u$ G6 P) Y& d# D
2 Z0 }. M' G1 f& q② 设置这个shell脚本可执行权限,如下: sudo chmod 777 ch-mount.sh
③ 挂载文件系统: 执行ch-mount.sh脚本 指定参数-m,挂载成功如下: sudo ./ch-mount.sh -m ./
![]()
1 f, m; f+ n+ W# O# g5. 安装软件 前面我们挂载了文件系统,已将文件系统挂载到了QEMU模拟器,接下来就可以安装我们所需要的软件了。 ① 更新下载源: apt update 注意:更新下载源可能会报错,这里需要注意一下,因为tmp文件夹权限不够,chmod为其赋予权限。 如下: chmod 777 /tmp
② 安装软件: 至此,便可以安装所需软件了,在这里用apt-get安装自己所需软件,根据所需安装。我们这里来安装一个minicom串口测试工具。如下: 2 F( E" Q4 d% f8 Z
![]() % y2 B8 g8 @5 v* P. l& J: ~
③ 安装完成后,exit退出QEMU。 ④ 执行ch-mount.sh脚本卸载文件系统,指定参数-u,卸载成功后打印如下:
7 ]' U) W$ C9 e/ C- J0 \: Q![]()
7 B4 F: @) }" C, K
, |( s1 n+ ]* r; y% w# m" E
注意:我们exit退出后,只是退出了QEMU模拟器,并没有卸载文件系统,一定要执行脚本卸载文件系统。 * f* g J. o" e' m) o
6. 打包文件系统 ① 完成前面的步骤后,用tar命令将当前文件夹下所有文件压缩,命名为OKT507-linux-ubuntu.tar.gz。如下: sudo tar -cvzf OKT507-linux-ubuntu.tar.gz ./* ! m+ r. S$ K- B# \: V& A( x
② 压缩完成后,为文件系统压缩包OKT507-linux-ubuntu.tar.gz赋予权限,如下: sudo chmod a+w OKT507-linux-ubuntu.tar.gz
! @7 L: A# k8 j" k4 b: G2 c![]()
6 O, k$ } @( ^/ L: a: v% D, \1 I4 O
0 [; N& t( W/ s& G③ 将刚打包好的压缩包替换到上一级目录下的旧的文件系统压缩包。 ; F! Q: U& u" ]
![]()
) A3 o* ?; S: U. I0 K3 Q. O$ Y. h# P0 E4 d
④ 重新编译打包后生成新的镜像烧录开发板。 ![]() ( K2 w9 e) [/ a ~2 v i8 T- l7 K. [% Q
+ y, x7 O2 f2 z& Y* `( I
* _ \! m( f! G! `+ g$ U7. 测试方法 烧录到板子后,在终端启动minicom,验证下是否安装上。如下:
, c: b0 y* r/ B. I7 k![]()
0 A- w. {& _% q9 X3 J k# e4 ^, l从上图红框可以看出,通过终端命令启动了minicom,说明我们在QEMU中安装成功了,至此Ubuntu文件系统定制就做完了。 + t7 B: U% R$ z3 c& \
通过这种方法可以个性化的定制属于自己文件系统,安装自己所需软件,也可以根据自己需求将出厂不需要的软件用相同的方式卸载掉,这样既能减少工作量,又利于批量化生产。 - H- r: x& X X6 Y
|