EDA365电子论坛网
标题: 手把手教你在Ubuntu定制文件系统 [打印本页]
作者: 罗罗诺亚 时间: 2022-12-15 20:26
标题: 手把手教你在Ubuntu定制文件系统
为了给客户的测试和开发提供便利,飞凌嵌入式的开发板产品一般都支持多种操作系统,以基于全志T507H处理器设计研发的OKT507-C开发板为例,它支持三种操作系统,分别是:Linux、Android 和 Forlinx Desktop(Ubuntu),这里提到的Forlinx Desktop系统是飞凌嵌入式在Ubuntu base的基础上构建的桌面操作系统,完全兼容Ubuntu18.04,相对传统的Linux系统而言易用性更高。
" \! o) p+ h% b
x: C. p: k& y! t

6 g6 w3 N7 }. F3 S5 j; N- ?Forlinx Desktop(Ubuntu)系统基于Ubuntu官方为嵌入式设备制作的操作系统-Lubuntu,该操作系统具备apt-get、ldd等常用的命令,若需要安装软件则直接apt-get在线安装即可,不需进行交叉编译移植等繁琐操作。但是每次重新烧写镜像之后,之前安装的软件就得重新安装,比较繁琐,如果需要批量操作则每块开发板都需要去apt-get安装,这样会大幅增加工作量,很不便于批量化生产。
% k9 J- o. p2 |
能不能把软件一起打包到镜像呢?这样每次烧写完就不用再去apt-get在线安装了。答案当然是肯定的,这就涉及到文件系统的定制了,那么接下来,小编就为大家介绍在Forlinx Desktop(Ubuntu)系统上定制文件系统的操作过程。
( l/ J2 {5 R( R1. 解压文件系统
首先,找到OKT507-desktop-release源码的文件系统所在的目录,然后将文件系统压缩包解压,路径如下:
OKT507-desktop-release/ubuntu
5 J% [) q$ F) p6 e

9 ?; F1 \6 M9 J解压后,可看到文件系统目录OKT507-linux-ubuntu,进入到此目录后可看到如下文件夹:
9 @! v8 U/ B( i- o1 k

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
7 Q1 v6 G' Y5 H$ K" |8 {) O
3. 修改配置
① 将QEMU的qemu-arm-static拷贝到文件系统目录OKT507-linux-ubuntu,如下:
sudo cp /usr/bin/qemu-arm-static usr/bin/
1 x R! S; d: M8 o* S+ F1 y9 ^, Q: \+ A, V

5 d. e) d9 v4 R; O6 f& \! T
② 拷贝PC主机端的DNS配置,因为待会我们安装程序时要用网络:
sudo cp -b /etc/resolv.conf etc/resolv.conf
& Y, T# m% u# U' x5 {: l
3 G; i8 X6 E% M- n; h/ n1 [
8 H* I9 G! k* b3 c; C6 }3 f# [& @③ 修改下载源:
sudo vim etc/apt/sources.list
8 P, R% S# X9 \1 k3 a" Q添加
deb http://ports.ubuntu.com/ubuntu-ports/ xenial main universe deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main universe
6 S, J& N/ d0 U2 g. r/ I/ c8 Z/ ?6 b
" P! e3 W0 I7 Z1 `6 u. z7 _
! Z" }! y0 _7 b; u2 h2 q% Z/ o8 r3 M! a2 u; v6 v
4. 挂载文件系统
因为我们这里是通过脚本的方式挂载和卸载文件系统,所以需要编写一个脚本挂载和卸载文件系统。
① 新建一个脚本文件命名为ch-mount.sh,附代码如下:
$ a) b* ^- y- s; G" ~9 V8 E3 K! u% D+ y+ E0 ~* s
: L! x O- w; S G: d# Y8 l! ]* h( f/ {( J) ?" @
" I$ @2 W6 w% V. J1 {( v- W
; P2 i$ Z1 V7 u! |! |* r
- d$ A2 Y, `6 ~
+ o& n. I5 T! Q0 j0 ^" F% E5 F#!/bin/bash2 \; e4 e* A. ^, Z( e. m, s
; M* ]6 R Z- G9 h' h' s+ ^
- m# `$ M. F5 p. E: G# ~+ ~6 e3 X" `: i6 H$ v; \ \# E8 V% S8 n
function mnt() {! V* A8 P T& P1 `2 Y! w
! x) U& M9 y+ a& }- I( G
- " t/ _; k. m+ p3 N+ x6 q
* D$ u5 S$ q9 [( K, L
echo "MOUNTING"2 X% Z4 C" ^1 ?0 n+ B
6 e' |/ P7 Y; t5 e3 C( Z' {
) L' b1 V- V4 H. e) _- E
4 T' f1 y; v3 p& S! esudo mount -t proc /proc ${2}proc/ v8 V" G3 z& T: e7 Z/ p8 e
: `# h+ h. c3 g# U% z
- " I! @9 N0 N: O- a ?0 K/ N8 K$ @ i
+ g: O! E' V+ I O
sudo mount -t sysfs /sys ${2}sys
( o0 s* S5 b$ ~# i
9 O/ I5 E6 h& p; M7 h - $ f( {; M( m$ b& \
8 i: [/ j( t$ T: S' }5 x. Esudo mount -o bind /dev ${2}dev+ d8 {! T8 c( j6 j8 E6 y6 S; }
9 s7 v Y& J: q2 L7 }" Z - 0 }; m$ t$ o2 o4 l
$ P: q+ g4 b# i9 v; ^# m% R# \
sudo chroot ${2}# i+ P; m | ^
# S8 E' w9 Z. d% |3 e
- + F1 Y. b+ Z6 s( z+ F! Z
; ^: M8 X9 q5 O4 L
}8 P7 I/ e, W* w, [ K
, O/ E$ g' h; F. \2 N e
5 c' d' g4 E( ?7 @' h5 \. _$ n3 g3 z0 Y* ^3 x/ K" |- o4 ]
function umnt() {4 n9 J, W7 U* F% i# u
$ M. [+ h: U" {$ }+ C& h
+ C2 x \$ \' `
8 A. n+ x, F: A1 r W& _% mecho "UNMOUNTING"
+ p# o: R1 I! J( s" V) t
5 o0 c. a; X2 U% T3 ], C8 l2 p- * C; `3 b- o. ^! y
. ?1 j) j2 ~3 \0 s; k% Q
sudo umount ${2}proc
$ l6 t" g& c) _) U1 T- ?( o" R7 {2 n) g/ C5 U
, Q3 K- e! i+ _/ L4 C Q
7 C9 \$ P0 m) M/ i/ |) u! J$ s$ [sudo umount ${2}sys% t: b5 R( v; t, P
: a, S9 M- I- }- & h+ ?0 G) G/ U$ K6 z# {
4 Q$ ^; A% ]6 z( `) C8 \ wsudo umount ${2}dev
; X5 D* M2 V# `. H" e* w) t9 J
/ }* l6 s/ E/ X8 f X/ X - : S5 q& X5 n/ q$ i
& U v/ z8 a! u- y z7 S. {% s
}
7 _; m1 B# {" w2 V' ^4 L6 ~3 E1 a5 A4 r
- " W$ z) c5 p: t0 q4 _ k- f# U, H& p
, E" ?) k3 t4 S% Zif [ "$1" == "-m" ] && [ -n "$2"% O* K/ U. {! i
9 S0 l4 Z/ {) D2 x
- % G1 e1 Y* s/ J, \8 P7 b. N
: U- Q5 H% h2 H5 C6 _( U/ \
] ;
# X/ r# \- p$ G% G1 ^+ z- p& w. A, O1 _2 k
6 T& b' a- q0 l- L9 X; ?! ]" H6 j7 {; N. x+ x* f+ N
5 N7 S1 @* D3 Y* x8 |5 @( f( f; w" o* ]) X9 P9 N
7 p& b# V. K) c! H9 P! y
8 K9 Q0 d( ^% x( y! xthen
% _, ]/ n% v: V4 s1 E
& J" D- T, j) @& J1 Q( c f* Y- 3 e6 u7 d8 i% j+ \
; Y: c2 t2 j0 Z. L
mnt $1 $2( r# m- C8 D0 @7 x$ f. R% G D
( \0 [6 K2 I1 v - 4 ]( r1 e4 C) _/ H; Q1 D) K) C& _
% Y- Y. H# t3 G) u
elif [ "$1" == "-u" ] && [ -n "$2"
[- U+ N, W! J+ }+ H; j3 c" i* K' b5 v. U% L
$ l/ A$ }1 _$ C$ e2 A
% B; R) ]# Z4 a" D* J* p];5 p0 i$ n" ]- L+ ]: i5 g+ j
, v7 T6 f7 O! w4 O- `2 W D0 E0 w
6 v5 c; [) a% U7 h$ X2 |: C
4 Z ~- X2 p0 Q7 n( f/ qthen
/ i& w- p6 T8 j- r. R4 \. A& w% D; W5 U
. [. A ], U; v9 ]; U8 s- ; M$ u1 u, G& R) P6 @8 C
( f: r3 m: {; H1 T
umnt $1 $2
+ R s' v _0 m$ m4 w3 g6 c+ z0 p/ h9 K2 [, X1 \4 i5 K
* `5 T3 g2 A0 p8 y! c5 r" H) e& G8 r. d9 S) ^
else+ n8 G( x& s+ e7 B
6 V% _. s2 A4 s# }) i
- : c% G, Q3 t; M5 ~' L
7 i$ S3 C) Z0 S$ \echo ""
( h! M- I" N5 z4 Q4 R w i
* I) g) [1 {+ w- A
4 \. {' A4 C. `2 J% ]/ L) B9 Z
echo "Either 1'st, 2'nd or both parameters were missing"
3 C9 }' a! D% V6 h% w7 q
( A7 H8 Z5 B5 Y3 j4 a7 \( a- 8 Y7 P/ E, `5 ^3 F. O
2 C0 N' N4 b: o
echo ""2 ~! O' ~# `0 w( a! y2 A
4 K# ]2 e# l' v - , O3 h0 b' K! a" K
! }# U5 w/ L" t3 V% z- G
echo "1'st parameter can be one of these: -m(mount) OR4 a0 \( i% F R/ u9 f. W& F/ m( W
5 m/ g" g7 }$ {1 K - 4 T4 D1 p6 ]# p! K6 {8 w8 f1 j4 k' H
3 O2 J+ O, X) d5 y5 w( A4 E
-u(umount)": q: W- Y& W3 w6 e$ Z ?0 F
- \9 {; a* O" m/ f' z! R
3 ~% |. [% w3 ?/ O& g2 p2 Q0 O2 h
7 _8 J+ a Q1 j* becho "2'nd parameter is the full path of rootfs- r& ?" x6 a+ s. G% [6 N1 t/ D8 E
! w0 \( E; a$ N) ?
- R/ T" `0 g, |' o7 I# c" P* Y, d3 Y
% C4 v! v/ Z' ~+ ~directory(with trailing '/')"
+ v$ m; ^" {7 @7 q' @$ r1 D1 V' L ?! s1 N- ^- o D3 `- @
- 8 R$ r0 a4 B- {0 C
) I {. a. {0 n3 ~3 t) }3 b' E$ A
echo ""
4 e: I6 s/ B) H! Y, X J' T" I5 |+ k% F6 ^" N4 n, |
- - T$ C. u* q, f' G
0 a7 V8 w, ~8 b. i# u- h! H
echo "For example: ch-mount -m /media/sdcard/"$ ^! u# F9 B) I) F7 s% O: u" o( A+ v
3 p+ i: g/ c$ |) E# Y: R+ a
- f B; Y2 u% Q! |" ?
/ j3 \- a# _1 G7 l* _echo "". D% K0 Y- v }- t2 H4 T
. |) B% O6 D$ y8 ^ Q- ( L4 b' F( J1 c1 V
: N0 l$ U. B. v/ B, `6 T
echo 1st parameter : ${1}7 U9 }, g d9 E4 Q6 Y
, H* S+ B1 {3 c/ ~
- " v" C! e8 m- j/ r# q/ _( V# `" |
. A+ j. }- T' [echo 2nd parameter : ${2}
6 O: C! x( d5 F/ q# k6 f. J! U6 F0 O" `: O
' [3 W6 Q Y s7 s! L0 W
+ k8 m# X. J- {6 J1 _/ Z* lfi
: S1 f& ~7 A) s' V, w( ^3 l+ j8 A* ~( G+ e1 V
8 c8 O: ^8 M% w# w# J9 w! S: q

7 [( G$ y/ k* i2 B) d" W8 k% ?* N7 ~# R/ h) w" H: J4 I
/ m! i, w0 n( {' N3 c% R, Y3 X: E② 设置这个shell脚本可执行权限,如下:
sudo chmod 777 ch-mount.sh
③ 挂载文件系统:
执行ch-mount.sh脚本 指定参数-m,挂载成功如下:
sudo ./ch-mount.sh -m ./

% D3 ^ I" s+ ]1 H; O1 U
5. 安装软件
前面我们挂载了文件系统,已将文件系统挂载到了QEMU模拟器,接下来就可以安装我们所需要的软件了。
① 更新下载源:
apt update
注意:更新下载源可能会报错,这里需要注意一下,因为tmp文件夹权限不够,chmod为其赋予权限。
如下:
chmod 777 /tmp
② 安装软件:
至此,便可以安装所需软件了,在这里用apt-get安装自己所需软件,根据所需安装。我们这里来安装一个minicom串口测试工具。如下:
) N/ X, @, J2 C" K. g+ ~% J! ?' D
- n7 R5 ?9 a) v& x8 h. a' P
③ 安装完成后,exit退出QEMU。
④ 执行ch-mount.sh脚本卸载文件系统,指定参数-u,卸载成功后打印如下:
/ F4 q8 |& V1 L5 H9 B
# o' a1 p3 u. ?
7 O/ d& G" p9 o [# F
注意:我们exit退出后,只是退出了QEMU模拟器,并没有卸载文件系统,一定要执行脚本卸载文件系统。
. ^! n5 F3 M/ \5 y8 `' g6. 打包文件系统
① 完成前面的步骤后,用tar命令将当前文件夹下所有文件压缩,命名为OKT507-linux-ubuntu.tar.gz。如下:
sudo tar -cvzf OKT507-linux-ubuntu.tar.gz ./*
( n) z' B3 b4 l5 x② 压缩完成后,为文件系统压缩包OKT507-linux-ubuntu.tar.gz赋予权限,如下:
sudo chmod a+w OKT507-linux-ubuntu.tar.gz
+ z3 I3 v3 G9 N: G" r6 @2 h, ~( P
! i4 V5 r4 C4 |8 p
5 }) g. ]+ _ C- z; h, m③ 将刚打包好的压缩包替换到上一级目录下的旧的文件系统压缩包。
* r6 S( K1 B: S" ?% Y+ r% F& O( ]

& w7 M% u8 {3 J
4 F) D8 F2 i5 W* I5 a: n3 t④ 重新编译打包后生成新的镜像烧录开发板。

8 @* {: ^' E! B2 P2 Q- V
3 O+ ?6 }- w* N2 O5 [, e: Y6 N9 I1 A1 z
7. 测试方法
烧录到板子后,在终端启动minicom,验证下是否安装上。如下:
2 p6 d3 V% z5 }

8 h8 M9 `% |" ?4 u8 {. \从上图红框可以看出,通过终端命令启动了minicom,说明我们在QEMU中安装成功了,至此Ubuntu文件系统定制就做完了。
: [. o+ z4 f( R, u( p: O4 J通过这种方法可以个性化的定制属于自己文件系统,安装自己所需软件,也可以根据自己需求将出厂不需要的软件用相同的方式卸载掉,这样既能减少工作量,又利于批量化生产。
' N3 V, E- \5 V
作者: hfiwioq 时间: 2022-12-16 09:52
这种开发板用教程,基本上就可以配置完成,Linux在学校实训的时候用过感觉不错
| 欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) |
Powered by Discuz! X3.2 |