EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
为了给客户的测试和开发提供便利,飞凌嵌入式的开发板产品一般都支持多种操作系统,以基于全志T507H处理器设计研发的OKT507-C开发板为例,它支持三种操作系统,分别是:Linux、Android 和 Forlinx Desktop(Ubuntu),这里提到的Forlinx Desktop系统是飞凌嵌入式在Ubuntu base的基础上构建的桌面操作系统,完全兼容Ubuntu18.04,相对传统的Linux系统而言易用性更高。 + p5 p7 V' \( P4 {. R
1 L( |/ C3 w5 b" K# x6 K
![]()
! x, e. q' J. y3 X$ IForlinx Desktop(Ubuntu)系统基于Ubuntu官方为嵌入式设备制作的操作系统-Lubuntu,该操作系统具备apt-get、ldd等常用的命令,若需要安装软件则直接apt-get在线安装即可,不需进行交叉编译移植等繁琐操作。但是每次重新烧写镜像之后,之前安装的软件就得重新安装,比较繁琐,如果需要批量操作则每块开发板都需要去apt-get安装,这样会大幅增加工作量,很不便于批量化生产。 % Y v& ~' i$ ]( k& {
能不能把软件一起打包到镜像呢?这样每次烧写完就不用再去apt-get在线安装了。答案当然是肯定的,这就涉及到文件系统的定制了,那么接下来,小编就为大家介绍在Forlinx Desktop(Ubuntu)系统上定制文件系统的操作过程。
, k( l' x6 N M, u! P1. 解压文件系统 首先,找到OKT507-desktop-release源码的文件系统所在的目录,然后将文件系统压缩包解压,路径如下: OKT507-desktop-release/ubuntu " T+ w' s6 w, p! v: y) P
![]() ; G( n' {! t5 F8 a" s) w' W
解压后,可看到文件系统目录OKT507-linux-ubuntu,进入到此目录后可看到如下文件夹: $ A3 y0 q0 z% P: S1 ^, d
![]()
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 # S8 a/ H$ V& C* R5 r7 i" P
3. 修改配置 ① 将QEMU的qemu-arm-static拷贝到文件系统目录OKT507-linux-ubuntu,如下: sudo cp /usr/bin/qemu-arm-static usr/bin/
1 A8 ^* f* ]0 P6 `& }# G) n1 u& `* G
![]()
& v3 s/ F( a. U$ N/ b; C7 C; H, O② 拷贝PC主机端的DNS配置,因为待会我们安装程序时要用网络: sudo cp -b /etc/resolv.conf etc/resolv.conf 7 L/ ]& Y8 l& g8 X5 \
![]()
. l# L- j" j* W0 R# M( T
; v0 q: r0 v7 ~7 D/ o6 n% V$ F③ 修改下载源: sudo vim etc/apt/sources.list
/ s/ x1 p- j$ B7 Z! W$ x添加 deb http://ports.ubuntu.com/ubuntu-ports/ xenial main universe deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main universe
1 O- V9 `* N0 A) L![]() ; H! v) V0 L5 o. i* n
2 g2 Y9 G5 d8 D) c$ U! z
+ h6 u8 e' j8 B+ e& q4. 挂载文件系统 因为我们这里是通过脚本的方式挂载和卸载文件系统,所以需要编写一个脚本挂载和卸载文件系统。 ① 新建一个脚本文件命名为ch-mount.sh,附代码如下: - & K0 A. S/ W0 C1 Q
+ N% |7 I, d6 T" i( n
- / S5 z) i% m, L. G" i; p
; S0 ~$ o e5 X; L' m" F2 V& U
# i: I& t+ @, Q
\3 S6 M- \+ t" @7 y. _2 j - + s5 ~# V; g/ v3 Y' ^: z8 o; Q
8 |: T ^3 ?( L6 z5 D#!/bin/bash$ ~ x" l+ |4 J2 `6 d
+ o1 D4 U* B; O9 L% J4 ~6 t8 w7 n1 Z - 3 J, O5 _3 f4 v. H7 K7 N; ^
9 f) p& A) }" q" S6 ifunction mnt() {
4 B3 y) i: T, e( I6 g
/ x4 `- L+ p% \6 [6 U
+ Y4 K+ L: ^" }" p4 `$ T
4 _$ F. f$ z) N N6 o, f6 v' C* ~echo "MOUNTING"
6 S: O. h7 L$ N, a1 \) J9 ~# t) e9 s3 W& w+ N# S, n
: z# A. S. I5 l/ b4 p0 n! d7 I( ~, w; f+ o9 f, T* o0 o
sudo mount -t proc /proc ${2}proc5 h1 K' A0 z9 N' @/ u" f% S& ]
" K( d) Z! m$ l8 A5 |
. b3 F# ~. D1 j& R3 d K' y7 s+ m+ {: n( Y% q0 U0 F
sudo mount -t sysfs /sys ${2}sys% N7 d8 d0 _4 K
0 A% ~7 }+ [1 r( J5 d, V
- - e5 Q1 |7 M' G1 I; T7 q
3 k8 O' ?: }. B. @sudo mount -o bind /dev ${2}dev: n6 K. Y1 [1 `2 G
0 W r7 ]. A& e0 `, k: C$ T( R# u6 m
- ; \+ _3 }! o4 l/ U U
$ Q7 Y! U4 W1 {$ e
sudo chroot ${2}
* S8 D9 I' X* J& v/ `4 N( A# p5 B. ?6 a
) L1 N* F" T. {( o% \7 ]6 |9 T" I
. a0 F+ o' _% B. w T; }0 z/ C}
7 o& b6 q" s1 W
$ [4 R* ^4 f$ a! {
5 S2 d0 N" S# @, a& a1 {; r# X3 n; N% R; f/ i' Q# _% L9 ]
function umnt() {
1 {/ u/ Z5 Q2 J* W; w C2 f; X4 [7 ?7 g. D# ^# @7 c
( ]9 Y# U/ q. S3 {) b& n% k) ]$ x+ [ w/ b7 ^$ P( @
echo "UNMOUNTING"
$ {" Z# I4 V" X' X( z
, K% ]. [. B: Y# ~( }
/ K& x# f7 N5 u' x" ~6 Y$ Y1 \6 i
sudo umount ${2}proc
$ D7 f+ u. \/ V" [3 s5 G2 _" }7 x# i5 z0 f
$ W( ?4 Z- |' t3 ~7 N- X( t* K( p# F! S( o
sudo umount ${2}sys
0 B' y$ Z: ]1 ^
( F7 j0 j- \0 j# G2 j% A. E* `+ z- $ Q- A- r* t" a: x
& ^, B5 G$ I. q4 n, ^sudo umount ${2}dev) q" O3 A9 t5 Y' f1 l
$ p0 p- Y- c# A+ ]! ? - ; u1 M+ Z6 V* {3 z, _
; N+ o7 t* L, Y& f2 m" h: g. R2 M}4 k0 }$ A5 q+ f: ^
8 d# v. B0 q- @) \- f
p+ {9 p. M% I& d( o2 b; e5 S( f Z4 f9 p
if [ "$1" == "-m" ] && [ -n "$2"4 g( j# z( ?" ~2 A3 {! ]
# H( C1 k, M1 M' E- 3 `' R4 G) K/ q/ u6 @' g9 Q
6 P( l( b3 N7 z8 o* f n. }] ;: }6 l3 s5 H% y/ {* C. y
% \& o2 \. H! [' F; I
* ^; m4 u) _0 S9 Y* g: g) J. I
4 l0 u% x, ?+ B4 g! y$ D# H6 u" e+ Y+ c* Y0 o# S
# N6 K) _- @5 d% g5 x5 C
- - S+ }, M- C, b" X
4 o$ i4 b, O4 k
then {4 D0 B( z b# l" M: A
+ f% j( F1 B6 ^; y+ ?
- 9 g1 P8 k, W0 `( w V, u* d2 S& R* t
! K4 D8 ^6 I) q3 u) X) U$ W( V0 H
mnt $1 $2
" A _) V1 t" t- S( G+ `8 o6 w: J: ^9 ^! } O' C9 l2 H2 f- [
- . ~9 C! p. f' v- B
. ` {/ ^9 W; c
elif [ "$1" == "-u" ] && [ -n "$2"
: k. c- N5 \: t" K4 [, _. b u7 ?/ j7 H- g# k% E
# C* Y: n, t$ u) k) B/ y& q9 O4 E" W5 J) U. Y0 U
];) L' H' Z/ f3 b. |
2 G3 A, Q% @2 {( x' |4 a( Q1 j
- " O3 A5 L6 M2 V4 D3 j9 ]; T
6 b4 I& ^' N1 a; H; X
then/ c& |. K+ i) w' P
) T5 Q0 B5 z4 X2 x
- % n+ L- |4 ~9 `1 m) d E
0 ]# q# Q9 q. P7 Qumnt $1 $20 H. Z2 Z" |) a+ ^* C( j& o
( W- s/ D7 q4 d& t8 T
9 J J5 M* c0 @6 D% q! m3 d$ k3 {# U2 y; |: ]6 q3 h
else! m3 g! b/ b) P7 h$ L* A2 M
/ c1 X" w$ ?( R6 r3 s3 T$ v/ Y( P
* c3 O: Z; D2 X
" f. @8 Z/ ^3 h0 V' eecho ""
# D4 |$ L7 F. j6 n9 M3 e$ H: j) D
# |/ T, c, f6 e, x- F
- V: W/ I# o' e" o
8 u: o( u& ^2 Q' b/ ]4 o4 o4 @echo "Either 1'st, 2'nd or both parameters were missing"
1 S/ Z: v, S4 }2 o. N- }/ K/ d7 E5 E) b6 U% U/ b. P/ G
- & e0 S, z) |) [ C3 ]% ]2 ]
4 V5 S3 x* Z. h/ ^" becho ""
o9 k% X3 o( t* A, l( C- Q
% i$ h% w1 x# i: W8 `# {; n. M6 F6 j
3 B. M6 |7 i3 D$ \0 z
$ f: r8 C P% e9 f* ?echo "1'st parameter can be one of these: -m(mount) OR
+ X6 [9 |( W6 Y5 s w7 o: q; o- N4 g
- i. y9 h, A8 f, B
! S& b" [- a) d' K! B. d
-u(umount)"7 y$ u, v. j9 I2 T! Z, y. W
3 g* _5 k: }+ n
3 e1 s V* F( O0 E; E4 H* m
& n& Z% z: B/ M, becho "2'nd parameter is the full path of rootfs' g4 W8 M) z! Q! b3 d
. L' P( i/ I: O: p
7 U4 ^. {8 H' @0 F5 h0 w- b. K2 L7 t/ c1 ^9 S
directory(with trailing '/')"
% I, x+ |, D. b" q3 t! x: D) s- F$ M. t3 `, p L
# G' d9 L7 `/ f* b8 d, [6 u9 Q0 ~! j# v8 B( \ T* i" p
echo ""# B% }! O9 @1 z. j7 ]" O
2 T7 H7 N' t* T% F2 D' F
1 S# y, D' w2 V4 i4 q. {: O1 a- p0 E
) D9 J$ K3 H4 i* I( c7 ^echo "For example: ch-mount -m /media/sdcard/"
3 C6 @3 e! O- G B3 B' X; C1 |) `% N) X+ r5 r' x9 C: m6 b( c: R
0 N6 i0 q+ n2 A9 B: F
2 S- w% V; y V+ uecho ""# _1 V0 i$ n9 e m/ z: z7 V
" {* d0 X# C( V
& C8 W* o% F* f W @- v& K, r3 D7 f" G
echo 1st parameter : ${1}0 v" b5 K: r4 l e+ h) l
7 Y2 e/ n. e! i
' ?' l0 F1 m4 y" d( \ ?. M! f& e2 J* O- v. T; W
echo 2nd parameter : ${2}
: m9 r' k) T; S( b9 V: Z/ j- a2 w% J& w1 V5 P y" e/ J
5 c1 p9 }5 |- M k% ?4 l9 k+ P% Z5 l* K& Y( R3 s' m
fi2 G/ ]4 ]7 @$ c+ [' X5 X/ {( f
# {( T: z/ Q& Y! m1 x' V- Y; c: y5 [; K
![]()
1 {7 J# p3 H+ a9 [6 V( h$ F5 _* q% Q) ^# y7 H) o+ K( z
3 x- d% H5 L2 H. C4 w8 L( Z
② 设置这个shell脚本可执行权限,如下: sudo chmod 777 ch-mount.sh
③ 挂载文件系统: 执行ch-mount.sh脚本 指定参数-m,挂载成功如下: sudo ./ch-mount.sh -m ./
![]()
0 h& D" m/ G6 {; m( ~5 w9 q; e5. 安装软件 前面我们挂载了文件系统,已将文件系统挂载到了QEMU模拟器,接下来就可以安装我们所需要的软件了。 ① 更新下载源: apt update 注意:更新下载源可能会报错,这里需要注意一下,因为tmp文件夹权限不够,chmod为其赋予权限。 如下: chmod 777 /tmp
② 安装软件: 至此,便可以安装所需软件了,在这里用apt-get安装自己所需软件,根据所需安装。我们这里来安装一个minicom串口测试工具。如下: - m6 r6 T1 L1 L- y( U0 c8 Y
![]()
$ y6 ^ V0 O1 O* ^1 d- c4 y③ 安装完成后,exit退出QEMU。 ④ 执行ch-mount.sh脚本卸载文件系统,指定参数-u,卸载成功后打印如下:
4 J2 S; G q% P) U) i![]()
/ n/ ?8 y/ r! I+ ~5 X n, y
+ _3 B0 ?1 g2 C |
注意:我们exit退出后,只是退出了QEMU模拟器,并没有卸载文件系统,一定要执行脚本卸载文件系统。 $ G& A4 I2 x3 k
6. 打包文件系统 ① 完成前面的步骤后,用tar命令将当前文件夹下所有文件压缩,命名为OKT507-linux-ubuntu.tar.gz。如下: sudo tar -cvzf OKT507-linux-ubuntu.tar.gz ./* % k0 c. d9 q. a' l$ g
② 压缩完成后,为文件系统压缩包OKT507-linux-ubuntu.tar.gz赋予权限,如下: sudo chmod a+w OKT507-linux-ubuntu.tar.gz
^% _9 F5 S; L3 l![]()
. {2 f' x- i' h {$ y! Y# a
& l. o+ K+ u/ k5 {+ ]" d
③ 将刚打包好的压缩包替换到上一级目录下的旧的文件系统压缩包。 - K2 e. k; z" }7 l. @8 F; d. ?
![]()
+ F. `4 o! `) F
; X7 [. j4 W9 q ]5 t1 d; C④ 重新编译打包后生成新的镜像烧录开发板。 ![]()
1 P# I$ X! m& d* U- {" ~, I! y t% b# A: Z! n
6 ]( P4 Z& F+ m
7. 测试方法 烧录到板子后,在终端启动minicom,验证下是否安装上。如下: . C7 r- a8 H" H7 {9 Y( c
![]() & x9 B" u. J0 }- v! ?3 }
从上图红框可以看出,通过终端命令启动了minicom,说明我们在QEMU中安装成功了,至此Ubuntu文件系统定制就做完了。
% n: o, W$ x; M通过这种方法可以个性化的定制属于自己文件系统,安装自己所需软件,也可以根据自己需求将出厂不需要的软件用相同的方式卸载掉,这样既能减少工作量,又利于批量化生产。
- v \! d' B4 p9 e |