EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
为了给客户的测试和开发提供便利,飞凌嵌入式的开发板产品一般都支持多种操作系统,以基于全志T507H处理器设计研发的OKT507-C开发板为例,它支持三种操作系统,分别是:Linux、Android 和 Forlinx Desktop(Ubuntu),这里提到的Forlinx Desktop系统是飞凌嵌入式在Ubuntu base的基础上构建的桌面操作系统,完全兼容Ubuntu18.04,相对传统的Linux系统而言易用性更高。 * v6 M1 V' r: O* D: x( y8 Q& L7 Q
6 Z7 @* D. W# [) r$ e6 q) ~. w
![]()
; P6 f; d0 Y! dForlinx Desktop(Ubuntu)系统基于Ubuntu官方为嵌入式设备制作的操作系统-Lubuntu,该操作系统具备apt-get、ldd等常用的命令,若需要安装软件则直接apt-get在线安装即可,不需进行交叉编译移植等繁琐操作。但是每次重新烧写镜像之后,之前安装的软件就得重新安装,比较繁琐,如果需要批量操作则每块开发板都需要去apt-get安装,这样会大幅增加工作量,很不便于批量化生产。
; n0 o4 q/ B8 X1 I/ f; J0 v5 K% z能不能把软件一起打包到镜像呢?这样每次烧写完就不用再去apt-get在线安装了。答案当然是肯定的,这就涉及到文件系统的定制了,那么接下来,小编就为大家介绍在Forlinx Desktop(Ubuntu)系统上定制文件系统的操作过程。
' I' P- K/ c. I7 x! J, Q _1. 解压文件系统 首先,找到OKT507-desktop-release源码的文件系统所在的目录,然后将文件系统压缩包解压,路径如下: OKT507-desktop-release/ubuntu
9 m3 _+ z7 u7 h/ f![]() % k4 n0 O/ ~ F
解压后,可看到文件系统目录OKT507-linux-ubuntu,进入到此目录后可看到如下文件夹: # c x- c, ]6 F F6 r9 [& X
![]()
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 - k2 Y3 l4 i* e' \5 |% m7 e4 N
3. 修改配置 ① 将QEMU的qemu-arm-static拷贝到文件系统目录OKT507-linux-ubuntu,如下: sudo cp /usr/bin/qemu-arm-static usr/bin/ * ~4 f5 i! `' x4 K& E0 h5 A
! _1 E) |) P3 |9 z" m3 K6 w+ u
![]() ( Y7 W4 G5 I2 o1 I. {% ?7 A
② 拷贝PC主机端的DNS配置,因为待会我们安装程序时要用网络: sudo cp -b /etc/resolv.conf etc/resolv.conf $ ?# J- W* ~# ? k9 N; S4 i
![]()
* N7 J1 p: I; s! ^, X+ r' J- g# Z0 w9 A1 {& r5 }
③ 修改下载源: sudo vim etc/apt/sources.list
" I: i7 F* S! @添加 deb http://ports.ubuntu.com/ubuntu-ports/ xenial main universe deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main universe
% C' o q* H0 V1 d![]() 8 q) j& C2 {( z5 o# O
3 N$ S9 F Q/ c# Q" E* E$ ]
5 D$ _! q) ~6 s; H5 G L4. 挂载文件系统 因为我们这里是通过脚本的方式挂载和卸载文件系统,所以需要编写一个脚本挂载和卸载文件系统。 ① 新建一个脚本文件命名为ch-mount.sh,附代码如下: - ; h' i& |$ L3 [6 A* M
$ u0 s4 I7 [8 @/ k7 c; B% ?4 b+ {
' ?& Q2 K/ A! ^1 H m% L+ u
+ w0 X5 R, h7 `8 y, l) A. Y, [" Y5 E5 D6 ^* k0 _
6 {8 D7 v$ Z: n8 e4 ?1 P- x, V- 2 `" o7 m4 h' E2 j+ t B1 Q" N; ~
2 d0 ~: E2 H4 d" j E#!/bin/bash
! X- T2 v' w) a( D( ]$ ~( F* k) |5 |
8 G. k. j1 } H' Q' x* `4 x7 d
6 Z5 r( i% u# S- X3 j/ t# W, Ffunction mnt() {
3 I$ f+ F! ^0 R' Z# l5 B6 }# Y V4 V1 y' l0 S) o
- 8 x, m6 p/ n! c. N9 \" ?8 k. f6 _
& o( S' o! J" u& \echo "MOUNTING"& h2 u8 U( Z% O- z) X& N' O
4 _ d! u' f8 t
! I# n5 }, L& T' p4 ^8 O% o0 a4 y& d
sudo mount -t proc /proc ${2}proc9 \4 u4 a2 y, I. L! Q5 ^, M
# u" n3 G% D* s
" {% i( p Y) P2 R3 u! F+ A
- @3 j: P% v) Lsudo mount -t sysfs /sys ${2}sys
+ u5 z$ M) `4 v& L' B, r, k+ p! ?. T0 z! |5 I( O
# T5 J0 | A% o" x% Z5 N' ?3 x# f# s6 h$ D. i0 |5 w4 k
sudo mount -o bind /dev ${2}dev
" P( H" E. S0 ]4 [4 P/ `7 s0 g& a, r- e5 z4 Z
' m" M5 ^2 m8 w; W+ y/ H4 _ D. A" ~: U1 X
sudo chroot ${2}8 u2 U( L- |+ J4 r, I! x3 F
4 b( t$ z3 Q0 K4 l) i3 c) K- $ x3 o. j/ }, s& k3 J
8 H' t! F, t: ?) ^
}% z, M5 n, G4 q
! v- A9 E( s6 A, _: u/ X) E - 1 `7 K9 W6 {: ?' r5 ^6 z' K T( i+ ~
# Y/ ]) V! ~8 G. M
function umnt() {
0 e8 I7 `0 x* L1 o7 X( [! o# Z
$ I: M* v. s' c; X8 T; s- t - 0 z: }$ L4 a! F& \. o4 J
( L5 R7 G- ]2 \7 `. Jecho "UNMOUNTING"
9 i; d* G8 v; G" U! l9 {) \9 n
: o& k9 J! ^, U - ; t( }1 \( k3 A9 _ {3 o( q& n
: |6 V% ~: u# m6 Fsudo umount ${2}proc
9 r+ Y2 }2 ]3 q6 \' V: T O8 k5 ^3 Q5 y" B
- - a3 Q) E8 @9 t0 V
! C C, F, o O2 Z' L5 ysudo umount ${2}sys
6 Q, {3 k* ~9 A$ w/ y; h4 O5 Y- w- o$ f; E
- % t+ ^4 u& a# ~& _& v8 F
- C; B- y, @8 e* i" h, l6 Ysudo umount ${2}dev( r; E3 N, a- J7 f
* \& Y- `# W* J1 | - 9 U8 a* E5 r# |; m: @+ y
9 a6 A8 D2 I$ h* a8 S# P2 h}
6 x' a: `! ^8 C6 l( t6 ?
: t* k& U4 S5 C; s4 h; U n
, z: I# y( a" _+ R2 J+ w8 q
9 O/ V1 I# v: a* y+ `if [ "$1" == "-m" ] && [ -n "$2"# y7 Y+ O @- U) @: l J
* ~5 ]9 g1 t) A/ C, N* i0 Y- + t0 D' r3 J; x
# P2 b& z7 Q% B8 P3 M] ;6 M" F* T1 ?" ^8 s, A N* O
. ]' o' q6 x/ |+ y# ~
! c1 d m ~7 V* e& w! j1 c
: C* B4 E$ x" ]$ g* a, O8 o( ]1 m# o' Z2 {
& S: D9 I0 B3 K' ?- 0 E2 \$ S8 P! b
, y" G" \6 r! h4 I9 Ethen
3 y6 j0 Y% T: J4 F) n! b
# E4 z1 c3 g. y/ k2 ~) I
3 r, U F; P# B/ f! ]' A7 }
) U; O# A5 b( t# X1 ]* ?6 i$ Pmnt $1 $2
+ u. n! q- q3 R6 w0 I3 j7 X) {9 f) g2 ^* b
$ [, B# J3 e* |8 C) w! z; ]
" L0 F7 Q& S* ^# m5 G. o! xelif [ "$1" == "-u" ] && [ -n "$2"
* m* K8 l; W" }0 F4 b0 I
" O$ N- R8 I. t- Z! f- % |9 f q4 H8 s* Y/ t
6 ]! w- X, W1 a9 E
];* u3 A( L! l" C, B. }
3 ] ~5 z" v$ @( C: u9 L
0 Q8 }# @+ L5 ?4 `. F! A4 M$ t" {4 P' \6 R" Y' n
then! v1 U7 l$ H. s. B0 F# |8 G Y' @
! e% P8 j1 T* u' u" C5 C8 x
- + U9 y3 e! x5 X
3 H5 L# L! j- V$ Y* T* z- G+ vumnt $1 $2
: L& W' D7 |3 m+ a# z9 V, {4 |6 Y' e3 A' v) v# t
- 3 N/ h4 h8 I# G/ f$ n
2 |) p' f5 L [# j9 Telse
/ Q, A: ?2 |1 b2 V4 v4 b' w5 L: ~
- * L7 @* B, M( e" y s, ?
4 N1 Z* t- M: `4 W p A3 u x
echo ""
3 Q0 w [1 p, }0 f7 B, `# @' q/ T0 {! t* s% G1 c
( o. C2 Z+ ]/ i/ ^5 [. @
9 g C' `' H7 n3 L) }echo "Either 1'st, 2'nd or both parameters were missing"
' Q$ e8 p6 g$ c2 b+ ]5 w
' j6 g5 j/ M7 M' B6 }4 g- ) N( R5 k5 Q% x
/ L8 s) T" L- k1 C' W. p1 S9 Yecho ""' B" t3 E* b( P) r" z' b" r% P: A$ n
* U; h/ h. j0 |5 Z3 j - ! P6 f- J+ c+ w$ L& L; M
& T, y: }/ ^* d: ?
echo "1'st parameter can be one of these: -m(mount) OR
: M8 v( x# [; h$ K `: A( a. m6 G: `8 N& p0 j/ B
" }+ Y, \# E" N6 \: |7 s+ k0 s+ d
) b* P4 M' e4 B6 L& H1 e-u(umount)"' y( P8 O1 C, Y9 Z* \7 h5 P
" b8 c+ p5 d: S$ L1 v: m- ; u. {% n6 M+ u2 q# H$ _
. [: m1 b( U- u0 D8 j t! Zecho "2'nd parameter is the full path of rootfs
) I1 [3 Z9 Y' v
# q, \0 u4 V C% e/ s - & f }. ?# o: M# u4 }
8 b, j/ C& U7 O" h0 Wdirectory(with trailing '/')"
$ X- I, }' A% c. b/ i& V
, j- t7 L& [ Z. g, B- X! A$ d
0 c) X" c1 O. A t0 }- `# D. S6 t+ R# t: | ~' W' l! V
echo ""
0 h$ V/ z# j, t. @, ]
% h6 t! h0 Q: X( c5 ]- H7 H8 b9 S
% u: h; ]3 z8 T1 G0 t
8 u! E9 |0 T3 k' k4 y8 kecho "For example: ch-mount -m /media/sdcard/") ~0 F- ~: R/ m, f3 R3 P
( m1 e, h" i8 Z% n- : Y4 H: P& _0 D/ b
1 f f4 Y, b# A# Pecho ""
' t8 d+ F! ^5 y) L5 u) _+ v4 b o1 s2 _( n
) S2 X% I" ]4 C: E) ~- S- S7 M" J' N4 M
echo 1st parameter : ${1}
3 t2 z0 W/ N8 n
' O# x- ?4 P6 t8 L( N6 p
0 ~# f. Z& _+ V
# m4 m' ]1 y+ W) {+ \; ?& [echo 2nd parameter : ${2}4 c. u. t8 Y: Z, E1 f( t2 c
: M! a/ Z+ ]6 I. I/ e; a" p- 6 M0 g/ ^! `+ ~9 r1 s
+ j3 A* }. S4 H/ ^" a, mfi
( t! [7 V6 S. Q' A# c0 h! c) R' q" j5 K0 K% \& ]
8 x" b* l8 O8 y! T- j. g$ J/ \
![]()
9 Z3 U( x; k2 e% g
: H- l8 P: r! a0 g9 H
* ?, ?+ E# v" D6 a② 设置这个shell脚本可执行权限,如下: sudo chmod 777 ch-mount.sh
③ 挂载文件系统: 执行ch-mount.sh脚本 指定参数-m,挂载成功如下: sudo ./ch-mount.sh -m ./
![]()
?; m- n- p* T5. 安装软件 前面我们挂载了文件系统,已将文件系统挂载到了QEMU模拟器,接下来就可以安装我们所需要的软件了。 ① 更新下载源: apt update 注意:更新下载源可能会报错,这里需要注意一下,因为tmp文件夹权限不够,chmod为其赋予权限。 如下: chmod 777 /tmp
② 安装软件: 至此,便可以安装所需软件了,在这里用apt-get安装自己所需软件,根据所需安装。我们这里来安装一个minicom串口测试工具。如下:
# }+ `) v X% X- ~: k, ]6 R" {9 _![]() y, A7 g, L; u* O
③ 安装完成后,exit退出QEMU。 ④ 执行ch-mount.sh脚本卸载文件系统,指定参数-u,卸载成功后打印如下:
1 w' N0 W0 w3 U! l5 B1 L( }![]()
5 t- S+ M5 e( `2 g1 {
+ o8 V( _- j. Z8 e7 h7 T# I7 v( B2 ^/ S
注意:我们exit退出后,只是退出了QEMU模拟器,并没有卸载文件系统,一定要执行脚本卸载文件系统。
* E Z8 O5 Q9 E9 W% `" o+ s: w6. 打包文件系统 ① 完成前面的步骤后,用tar命令将当前文件夹下所有文件压缩,命名为OKT507-linux-ubuntu.tar.gz。如下: sudo tar -cvzf OKT507-linux-ubuntu.tar.gz ./*
) `7 s1 S' E6 J1 X2 J+ j5 f② 压缩完成后,为文件系统压缩包OKT507-linux-ubuntu.tar.gz赋予权限,如下: sudo chmod a+w OKT507-linux-ubuntu.tar.gz
( y: @7 W4 H4 Y; O9 ^* z) l![]()
4 S3 A" [% u3 x3 B+ n; O; D
: S3 O) L8 G3 I/ ], T" }③ 将刚打包好的压缩包替换到上一级目录下的旧的文件系统压缩包。
( m, W5 S% u8 ^' Y* Y* |![]()
1 F4 r' ~/ C8 @/ @
* y: O2 B7 K$ F9 A7 ?* T. {
④ 重新编译打包后生成新的镜像烧录开发板。 ![]()
6 n7 J* g/ d' F v+ a
8 j; o5 V, m0 V: _( L ^' a7 e9 l6 [! c
7. 测试方法 烧录到板子后,在终端启动minicom,验证下是否安装上。如下:
& r5 g5 g% I8 @![]()
) W6 R- A. ~6 ]: {; g从上图红框可以看出,通过终端命令启动了minicom,说明我们在QEMU中安装成功了,至此Ubuntu文件系统定制就做完了。 # P! _$ R' ]/ j- c
通过这种方法可以个性化的定制属于自己文件系统,安装自己所需软件,也可以根据自己需求将出厂不需要的软件用相同的方式卸载掉,这样既能减少工作量,又利于批量化生产。 n2 c7 m# o: y8 N2 S0 N7 X" ]+ n
|