找回密码
 注册
关于网站域名变更的通知
查看: 292|回复: 1
打印 上一主题 下一主题

手把手教你在Ubuntu定制文件系统

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-12-15 20:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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$ C

Forlinx 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 S

3. 修改配置

① 将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  {: V
    6 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 O
    3 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& T
    5 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. l

7. 测试方法

烧录到板子后,在终端启动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
  • TA的每日心情
    开心
    2022-1-24 15:10
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2022-12-16 09:52 | 只看该作者
    这种开发板用教程,基本上就可以配置完成,Linux在学校实训的时候用过感觉不错
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-9-7 14:53 , Processed in 0.125000 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表