找回密码
 注册
关于网站域名变更的通知
查看: 316|回复: 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系统而言易用性更高。


3 Y* }" ~$ E) U- l" x
1 ?( H: [, K( @

1 n  B+ I) _+ z& Y3 ?

Forlinx Desktop(Ubuntu)系统基于Ubuntu官方为嵌入式设备制作的操作系统-Lubuntu,该操作系统具备apt-get、ldd等常用的命令,若需要安装软件则直接apt-get在线安装即可,不需进行交叉编译移植等繁琐操作。但是每次重新烧写镜像之后,之前安装的软件就得重新安装,比较繁琐,如果需要批量操作则每块开发板都需要去apt-get安装,这样会大幅增加工作量,很不便于批量化生产。

$ \! n7 t. W( `9 z( A

能不能把软件一起打包到镜像呢?这样每次烧写完就不用再去apt-get在线安装了。答案当然是肯定的,这就涉及到文件系统的定制了,那么接下来,小编就为大家介绍在Forlinx Desktop(Ubuntu)系统上定制文件系统的操作过程。


0 S. E8 m2 F% d, S9 t

1. 解压文件系统

首先,找到OKT507-desktop-release源码的文件系统所在的目录,然后将文件系统压缩包解压,路径如下:

OKT507-desktop-release/ubuntu


( y9 N4 o& }' B

! L5 Y. R, ~; V  m

解压后,可看到文件系统目录OKT507-linux-ubuntu,进入到此目录后可看到如下文件夹:

+ E: E* v1 k' i" T- _$ O

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

8 ]" W0 C, B  K1 x

3. 修改配置

① 将QEMU的qemu-arm-static拷贝到文件系统目录OKT507-linux-ubuntu,如下:

sudo cp /usr/bin/qemu-arm-static usr/bin/

4 ^2 d% _) h. K# Z9 i2 O
/ {7 V% P( @  ?

. {; }; b9 N6 N0 Z3 j: `0 N

② 拷贝PC主机端的DNS配置,因为待会我们安装程序时要用网络:

sudo cp -b /etc/resolv.conf etc/resolv.conf


, O7 m4 u0 N' D" M/ |

, |% n* N% l  q
/ {( T# p! C3 s7 X  B$ k: B

③ 修改下载源:

sudo vim etc/apt/sources.list

) Y5 P# H/ W; }, h4 V6 O

添加

deb http://ports.ubuntu.com/ubuntu-ports/ xenial main universe deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main universe


8 d2 m+ J  |5 q9 W6 ~


: C! M7 |' p" S' G7 {# t2 u5 f' y
, h. c9 g5 Z" [; J" g8 z. r+ s7 ^# d

4. 挂载文件系统

因为我们这里是通过脚本的方式挂载和卸载文件系统,所以需要编写一个脚本挂载和卸载文件系统。

① 新建一个脚本文件命名为ch-mount.sh,附代码如下:


  • ; _8 A& w9 B7 P/ v4 @# @5 U' @6 _4 T% ?1 N1 i0 G% k. P
  • # b/ v) i2 _( u$ ?( f" t8 P5 e/ J* j

    . u! T& m3 R$ d- Y; l$ ?( a- }' u  n4 }, s
    # h+ \: h! L9 Q+ J
  • 0 h9 Z( ]& {2 B  Y# c$ {' i" h
    ' L9 h( Z# {: H0 d7 d. B
    #!/bin/bash
    ' m* [4 f4 M) f
    2 {# p: Z' u; @! D6 }9 g. N

  • . d2 p' g7 X( Q8 [& E/ K. l& I3 g, r
    $ `  h5 B! n- d# f* w, y) ]; y
    function mnt() {
    # z( ]% s" d# f
    0 q5 P: [( M7 O+ U( z
  • 0 h  `2 I/ g5 ~2 c' h
    6 \6 l) _. I5 E
    echo "MOUNTING"* {- j; L: ?3 g% i; E7 J" k

    % n: G, p9 Q' z2 a/ f: r: L: Y
  • : ~' G2 U/ _9 [/ {

    ' @+ X. F' C. C) rsudo mount -t proc /proc ${2}proc0 T2 K4 `5 {% l9 r: O

    6 B( v! W& L1 _" M  @3 T* b) p

  • 8 w+ r+ S9 {; e5 X, e  o
    ; v- U7 Y" @! ]$ O+ v7 Q7 L) d7 }
    sudo mount -t sysfs /sys ${2}sys
    % y6 \6 Z' v$ h0 e% d
    - H% b; I5 k  d% B- R1 h
  • * b: Z* ]9 F" d) P$ j

    ' M5 S4 f, D! ~9 y8 H8 x; r" |9 B# E4 vsudo mount -o bind /dev ${2}dev
    3 _" K; z) K1 I, b8 \$ i

    4 x) T7 Z2 v1 ]: V# Y5 q5 o
  • 0 z7 V! E: F* b1 g
      n1 r. p" u$ T7 }
    sudo chroot ${2}
    ( K6 l, M% {9 U5 h& E! n

    4 e' }/ S8 x; j$ u

  • # z. {" C- w+ W8 k- @" c! o, M
    . F5 ]9 E/ L5 t5 P+ B
    }; E* K- {9 l( i& |
    0 n! d# ~& U8 m6 V$ A# ?* v

  • ( I" ?  }4 \8 M5 F& A
    ; k3 d7 Z3 c( E7 |
    function umnt() {
    & f* a5 X) I2 z* o7 P+ ~

    ( J9 x; @" l* Y/ {

  • $ f5 Y, z: L3 t3 p( _
    ! t/ X; M! ]1 W  J3 p+ w
    echo "UNMOUNTING"
    0 \2 x% k; T2 O5 V+ `7 W4 f

    4 @0 `7 ]3 I% M9 \+ g
  • 9 m/ q! u0 u2 |# M; M- G+ L
    3 x" J7 h! p7 J. J+ y+ ]
    sudo umount ${2}proc, A2 ?/ @( V- P: I. b

      K! s4 U) @7 v+ ?6 g
  • $ p4 v# n) ~/ \) ?

    * ^/ M4 R! h" F3 x  w( u8 Rsudo umount ${2}sys
    * K# {# G  o7 n. m; `$ t

    ; Q( v+ _6 |1 k- s8 N0 R
  • 8 t- U' ~) \7 o

    6 \* ~# T5 x/ |' O" Isudo umount ${2}dev
    4 P: L5 T- h" @( _! ^% C/ e5 S; H

    : G7 d& _2 t7 I( T6 [+ O2 M8 W4 ?
  • 8 S0 ^' F; D: q/ E) ^! L
    # b1 O; {: T9 G" u, n
    }3 d- ~* ?" {7 k1 t4 k4 M! i
    7 l* r5 Z: O9 k$ }/ u7 H
  • , i6 w8 Q6 }" T" ^

    2 y' ~  _" K6 y3 R, O, Gif [ "$1" == "-m" ] && [ -n "$2"+ _9 r  `9 E$ O
    , x, S5 Y0 _( f
  • + B  C& Z: V2 f8 T0 r: @  L; L

    # m3 Q  b% m7 ?] ;4 K4 D/ D* o3 o' b' |  H% q3 X
    9 X) Q- l  \; e. l, O
  • , K* p$ Q! x. ?

    , M  o# w" B% y$ b! o. k
    6 c$ b2 q0 S) M! G4 W6 {
    0 n+ a, p/ p3 M: C. ]- O

  • . F! l1 ^: f9 d- l- x

    0 Z% H+ S0 J; |: p( m  B; e" F+ Mthen
    0 U( @; Y5 H9 O1 O

    / a1 X( L+ u$ \
  • 4 q2 g9 ~% o0 @2 z

    . j$ p$ s4 J; |* O0 P- h( ~mnt $1 $2" `* z8 V: x" _
    : j1 K. w( `; |0 L, f8 t' w7 Y

  • 1 b/ V; C  [: W  f; O. B* G, K
    ( M* @' W2 f4 J
    elif [ "$1" == "-u" ] && [ -n "$2", S/ V8 J: }9 L7 E: E7 o2 b
    8 H# k* X8 ~; V( k* K6 W2 M
  • / g+ m. ^/ D0 H) `8 w$ U
    & L  q0 }; @0 E# }
    ];! B3 e$ E% U4 T8 g' R5 Z3 T- u: H

    1 e4 n* O7 ?7 I) a
  • # @7 h/ C3 S/ ~4 T' p
    6 z/ m8 E* q0 ]! k! b: n, Q
    then9 a7 L2 `' A  C5 V

    7 |% F& f  I. Z. S# w6 x( |
  • * Y' x; _: B/ ?% F2 S0 G
    . e; }6 j5 m) H; F. C
    umnt $1 $2% c9 G% A+ Q* [& e5 k4 W
    ' d+ p# E1 P, L/ k2 }7 N- Y
  • : Q0 m+ C9 M( c8 {( b2 M5 L; E5 A
    7 _, K, m* R5 x  F& A9 z8 R
    else
    $ X5 i& q0 z9 m1 t0 X. U: \

    ' s0 W" k0 T0 k+ d, P2 n9 O

  • 3 h- q0 c) \# m$ K+ F9 |; u

    & [0 ~  t* J7 S$ W% @1 recho ""
    + |# e+ y' C! h# W/ `+ N
    4 Y1 j3 t9 Y2 @0 u* F5 W9 Y( H7 q

  • : {. `9 u! M5 K, O

    2 w+ s. B1 @, f/ l% gecho "Either 1'st, 2'nd or both parameters were missing"; @; C* F% ~2 K6 s* @6 k

    2 j( k+ y/ \  P0 w

  • " }) _0 ?- _9 \

    : p1 u1 I) V# Y" I, gecho ""
    7 p! @  Y3 E2 c) }* I/ t

    8 G! k: t7 u! G, b1 U) I# D/ |

  • ! p/ [7 G% @" k
    - K: T8 l' Q1 u, I' B3 a! C
    echo "1'st parameter can be one of these: -m(mount) OR* F$ N- w; E# I
    5 ~" g6 w9 Y  W- [, _' [8 d9 q& s

  • 4 ~) E. b0 F9 c; B9 `# g& I2 r2 G
    4 t' n  T5 x) \, G" r8 E* ^3 Z1 X' l* P
    -u(umount)"! u$ I5 M% _1 _# G3 `: L
    ) X, L0 I" B9 b

  • / T  {4 o9 i- R+ i# w1 y& s

    ' Z  r% F0 F2 f) t  W' |echo "2'nd parameter is the full path of rootfs2 Q1 l% y! Z0 r6 D& B
    $ }. a  i3 B6 M

  • " ?2 M. `5 v' A! j8 H1 e1 i" d

    0 Y7 W7 S# d1 g; c, r% Udirectory(with trailing '/')"
    7 s/ L% X! t4 v2 g& l

    ' _" X! Y7 o4 V9 t) R' U7 l

  •   s$ @" h& O. G; u

    5 S7 \1 ?5 C$ {: N6 y3 d  r, zecho ""
    / B0 T8 z* _# M$ v  j

    7 x7 D* V8 K; k1 ^$ E

  • 2 p8 b& q$ I  p7 _; O
    % ~' E) E( Y6 {' N
    echo "For example: ch-mount -m /media/sdcard/"7 t% R" o9 C. S) q

    $ a0 x0 f; z! A) N( C0 m
  • ' U, g3 M. X8 O4 ?0 ^

    4 U0 H$ e1 Q+ S" M: x# R. I& |% Lecho ""
    # I2 a6 ^/ ]8 e6 @% a
    7 n4 C# _  n$ }0 Z# Y& {

  • 2 B: n% G+ y, n- `
    , L1 y" J# V5 L7 \& J* _
    echo 1st parameter : ${1}
    6 Z, r5 m% M5 e1 c
    ' m# Q  O( A0 v1 C8 k

  • ( y1 P6 M0 n) j1 \% @( }) u3 X
    ' k" X. q- _$ Y
    echo 2nd parameter : ${2}
    5 G8 o8 I) |7 @: ]
    4 w3 r' R9 ~3 l3 u+ ^
  • * s8 m% j- E( m/ v

    6 l7 ?/ q: w, }- Nfi
    ! E% h" L; k+ |5 b5 E) L9 K

      l8 I# `) b. K9 s
    7 w' w+ ~1 K& U/ o# v

; z' f: e7 ~' B( _0 d1 B5 j) G# |) j6 b  D* p' t! M

1 ?& _( g- n2 Y9 n% ?

② 设置这个shell脚本可执行权限,如下:

sudo chmod 777 ch-mount.sh

③ 挂载文件系统:

执行ch-mount.sh脚本 指定参数-m,挂载成功如下:

sudo ./ch-mount.sh -m ./


! D; W2 Z- j7 q& H: m6 q* U6 K

5. 安装软件

前面我们挂载了文件系统,已将文件系统挂载到了QEMU模拟器,接下来就可以安装我们所需要的软件了。

① 更新下载源:

apt update

注意:更新下载源可能会报错,这里需要注意一下,因为tmp文件夹权限不够,chmod为其赋予权限。

如下:

chmod 777 /tmp

② 安装软件:

至此,便可以安装所需软件了,在这里用apt-get安装自己所需软件,根据所需安装。我们这里来安装一个minicom串口测试工具。如下:


1 ]  l0 w6 p. y* h

7 ^/ W/ W6 @) f% m/ ?

③ 安装完成后,exit退出QEMU。

④ 执行ch-mount.sh脚本卸载文件系统,指定参数-u,卸载成功后打印如下:

) L5 t9 D  n( }2 I

3 Z3 Z* X/ B2 a5 x  U' |! A
+ I( t0 H4 b+ k1 h, K# V

注意:我们exit退出后,只是退出了QEMU模拟器,并没有卸载文件系统,一定要执行脚本卸载文件系统。


. A9 B' Z& }" y% J7 \* |  u- c

6. 打包文件系统

① 完成前面的步骤后,用tar命令将当前文件夹下所有文件压缩,命名为OKT507-linux-ubuntu.tar.gz。如下:

sudo tar -cvzf OKT507-linux-ubuntu.tar.gz ./*

  `/ W0 M+ x1 `! S, U

② 压缩完成后,为文件系统压缩包OKT507-linux-ubuntu.tar.gz赋予权限,如下:

sudo chmod a+w OKT507-linux-ubuntu.tar.gz

! C3 }  a8 u' q, p! p


6 J. B* R. H6 V( z; ]1 N& u6 o1 m, v6 K0 }& f

③ 将刚打包好的压缩包替换到上一级目录下的旧的文件系统压缩包。


; Z! H: m. Q, d( g2 L4 C! E

+ r. s4 r; c) ~. t; `

- i4 `1 q3 ?/ R# _* k% n* n

④ 重新编译打包后生成新的镜像烧录开发板。

8 h/ x/ x: g5 P; l$ O8 r# Z* P4 s

/ G/ O3 c8 y0 y( _9 T7 h: \8 P
% {7 ]0 {4 B- S/ j, ~

7. 测试方法

烧录到板子后,在终端启动minicom,验证下是否安装上。如下:


  U8 y0 M- D* g

* y! H/ ~* v! o+ i8 @: D

从上图红框可以看出,通过终端命令启动了minicom,说明我们在QEMU中安装成功了,至此Ubuntu文件系统定制就做完了。

" c! M/ ?  w0 i; j# y  t5 o+ N

通过这种方法可以个性化的定制属于自己文件系统,安装自己所需软件,也可以根据自己需求将出厂不需要的软件用相同的方式卸载掉,这样既能减少工作量,又利于批量化生产。


0 m/ R: n* [$ Q+ r
  • 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-11-23 15:33 , Processed in 0.171875 second(s), 23 queries , Gzip On.

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

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

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