文章目录

  • 1 BusyBox工具简介
  • 2 Busybox 制作最小文件系统
    • 2.1 准备源码
    • 2.2 编译环境
    • 2.3 支持中文
    • 2.4 配置Busybox
    • 2.5 编译Busybox
    • 2.6 整理最小文件系统
    • 2.7 制作文件系统镜像及测试

最小linux系统占用资源非常少,最小linux系统没有图形界面,在不需要带屏幕的应用中经常用到。本章我们学习的是如何构建最小Linux系统,并在终结者开发板上运行,及应用测试。

1 BusyBox工具简介

iMX6U不仅可以跑QtE系统,还可以运行简单的Linux最小文件系统“麻雀虽小,五脏俱全”,它不带图形界面的Linux系统,剔除干扰因素便于理解,用来学习Linux系统编程非常合适。下面我们来讲解一下这种文件系统的制作。
在制作文件系统的时候,我们需要使用“BusyBox 工具”,BusyBox最初是由Bruce Perens在199 6年为Debian GNU/Linux安装盘编写的。其目的是在软盘上创建一个可引导的GNU/Linux系统,做安装和救急盘。BusyBox是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox包含了一些简单的工具,例如ls、cat和echo命令等等,还包含了一些更大、更复杂的工具,例grep、find、mount 以及telnet命令。有些人将BusyBox称为Linux工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了Linux的许多工具和命令,也包含了Android系统自带的 shell。
我们可以在其官网下载到,官网地址为:https://busybox.net/。

图 1.1

然后点击官网左侧“Get BusyBox”栏中的“Download Source”进入下载页面。如图 1.2所示:

图 1.2

这是一个开源的程序,并且一直在更新中,我们使用的版本是“busybox-1.29.0.tar.bz2”。
我们也可以在光盘目录“i.MX6UL终结者光盘资料\07_文件系统源码\1.busybox源码”中的busybox-1.29.0.tar.bz2。

2 Busybox 制作最小文件系统

下面我们来讲解一下如何使用 BusyBox 制作最小文件系统:

2.1 准备源码

首先登录虚拟机ubuntu系统,运行Terminal,切换为root用户,在“/home/topeet”下使用命令“mkdir minilinux”新建目录minilinux。如图 2.1.1所示

图 2.1.1

然后将“busybox-1.29.0.tar.bz2”通过ssh工具拷贝到我们新建的minilinux目录,使用命令“cd minilinux/”,如图 2.1.2所示:

图 2.1.2

接着使用命令“tar -vxjf busybox-1.29.0.tar.bz2”,解压busybox,如图 2.1.3所示。

图 2.1.3

最后使用命令“cd busybox-1.29.0”进入busybox源码,如图 2.1.4所示:

图 2.1.4

2.2 编译环境

busybox的编译器与之前编译uboot和内核所使用的一致,先使用命令“arm-linux-gnueabihf-gcc -v”查看编译器版本是否正确。如图 2.2.1所示:

图 2.2.1

然后使用命令“apt-get install libncurses5-dev”确认是否安装ncurses库,没有安装的话后面编译会报错。如图 2.2.2所示:

图 2.2.2

2.3 支持中文

从busybox1.17.0以上之后,对ls命令不做修改是无法显示中文的。就算是内核设置了支持中文的话,在shell下用ls命令也是无法显示中文的,这是因为busybox1.17.0以后版本对中文的支持进行了限制。要想让busybox1.17.0以上支持中文,需做如下修改。
首先使用命令“vim libbb/printable_string.c”,

图 2.3.1

然后查找函数printable_string,我们可以看到在第31,32行和45行的操作,大于0x7F的字符直接被break掉,或者直接被“?”代替了。所以就算是linux内核设置了支持中文,也是无法显示出来的。所以我们对这三行进行修改,注释掉对大于0x7f字符的相关操作。如图 2.3.2所示:

图 2.3.2

修改之后保存退出。
然后使用命令“ vim libbb/unicode.c”

图 2.3.3

打开之后查找函数unicode_conv_to_printable2,我们可以看到1022行和1030行也对大于0x7f的字符有对应操作,同样的我们对这两处做修改,如图 2.3.4所示:

图 2.3.4

修改之后保存退出。
经过以上修改之后,源码就可以支持中文字符了,但还需要配置 busybox来使能 unicode码,这个稍后会去配置。

2.4 配置Busybox

Busybox的编译配置和Linux内核编译配置使用的命令是一样的,下面我们开始配置Busybox。
busybox提供了几种配置:defconfig (缺省配置,也是默认配置)、allyesconfig(最大配置)、 allnoconfig(最小配置),一般选择缺省配置即可。
使用命令“make defconfig ”,即可配置busybox为默认配置。
这一步结束后,将生成.config文件。
我们一般使用“make menuconfig”图形化配置命令,配置“Busybox”。如图 2.4.1所示:

图 2.4.1

(1)首先回车进入“Settings —>”

图 2.4.2

(2)然后使用方向键下翻,在“Build Options”栏找到“Cross compiler prefix”,它是指定用什么编译器来编译。如图 2.4.3所示:

图 2.4.3

(3)接着使用回车选中进入,输入使用的交叉编译工具arm-linux-gnueabihf-,如图 2.4.4所示:

图 2.4.4

(4)然后回车选择“Ok”,回到“Settings”设置界面,如图 2.4.5:

图 2.4.5

(5)接着使用方向键下翻,在“— Installation Options ”栏找到“(./_install) Destination path for ‘make install’ (NEW)”。如图 2.4.6所示:

图 2.4.6

(6)这个界面是设置编译完Busybox,把最终生成的二进制文件安装到哪个目录下面,使用回车进入,将“./_install”修改为“…/system”。如图 2.4.7所示:

图 2.4.7

(7)然后回车选择“Ok”,回到“Settings”设置界面,如图 2.4.8:

图 2.4.8

(8)然后方向键下翻,空格选择“vi-style line editing commands(NEW)”选项,如图 2.4.9:

图 2.4.9

(9)接着使用左右方向按键,选择“Exit”,回到“Busybox Configuration”界面。如下图所示:方向键下翻找到“Linux Module Utilities —>”。如图 2.4.10所示:

图 2.4.10

(10)接着回车进入,空格取消选择“Simplified modutils”。如图 2.4.11所示:

图 2.4.11

(11)然后使用左右方向按键,选择“Exit”,回到“Busybox Configuration”界面。方向键上翻找到“Settings —> ”,如图 2.4.12所示:

图 2.4.12

(12)然后回车进入,方向键下翻找到“Support Unicod”和“Check $LC_ALL, $LC_CTYPE and $LANG environment variables”,选中这两个选项,即使能 busybox 的 unicode 编码以支持中文 。如图 2.4.13所示:

图 2.4.13

(13)接着使用左右反方向按键,选择“Exit”,回到“Busybox Configuration”界面。如图 2.4.14所示:

图 2.4.14

(14)然后使用左右反方向按键,选择“Exit”,选择“Yes”保存配置。如图 2.4.15所示:

图 2.4.15

至此,busybox 的配置就完成了,如有其他需要可以自行选择配置。如果是初学者建议按照我们的办法配置,以防出错。

2.5 编译Busybox

接下来我们开始编译“Busybox”,执行“make”命令,开始编译“Busybox”,如图 2.5.1:

图 2.5.1

图 2.5.2为编译完成的截图。

图 2.5.2

编译完成了,接下来我们需要把编译生成的“二进制文件”安装到刚才我们指定的“…/system”目录里面,安装二进制文件到“…/system”目录,如图 2.5.3,输入命令“make install”。

图 2.5.3

如图 2.5.4为"make install"命令执行完成的截图。

图 2.5.4

现在我们使用“cd …/system”命令,进入“…/system”目录,看看里面安装的文件,如图 2.5.5:

图 2.5.5

2.6 整理最小文件系统

上一节通过编译busybox生成了bin、sbin和usr这三个目录,以及 linuxrc 这个文件。busybox 的工作就完成了,还需要一些其他的文件完善文件系统。
(1)制作的文件系统还需要新建“dev,etc,lib,mnt,proc,sys,tmp,var”文件夹,使用命令“mkdir dev etc lib mnt proc sys tmp var”,如图 2.6.1:

图 2.6.1

(2)然后使用“cd etc”命令进入到刚才创建的“etc”文件夹,如图 2.6.2:

图 2.6.2

(3)然后命令建立“eth0-setting”文件,并在“eth0-setting”文件里输入下面的内容(注意每行前面的行号不要复制):

  1 IP=192.168.1.2302 Mask=255.255.255.03 Gateway=192.168.1.14 DNS=192.168.1.15 MAC=08:90:90:90:90:90

如图 2.6.3:

图 2.6.3

(4)然后保存并退出“eth0-setting”文件,使用“chmod 755 eth0-setting”命令修改文件的权限,如图 2.6.4:

图 2.6.4

(5)接着在etc目录下用“mkdir init.d”命令建立“init.d”文件夹,如图 2.6.5:

图 2.6.5

(6)然后使用“cd init.d”命令进入到“init.d”文件夹,如图 2.6.6:

图 2.6.6

(7)然后在“init.d”文件夹下面使用“vi ifconfig-eth0”命令建立“ifconfig-eth0”文件,如图 2.6.7:

图 2.6.7

(8)然后在“ifconfig-eth0”文件中输入下面的内容(注意每行前面的行号不要复制):

 1 #!/bin/sh2 3 echo -n Try to bring eth0 interface up......>/dev/ttymxc04 5 if [ -f /etc/eth0-setting ] ; then6         source /etc/eth0-setting7 8         if grep -q "^/dev/root / nfs " /etc/mtab ; then9                 echo -n NFS root ... > /dev/ttymxc010         else11                 ifconfig eth0 down12                 ifconfig eth0 hw ether $MAC13                 ifconfig eth0 $IP netmask $Mask up14                 route add default gw $Gateway15         fi16         echo nameserver $DNS > /etc/resolv.conf17 18 else19         if grep -q "^/dev/root / nfs " /etc/mtab ; then20                 echo -n NFS root ... > /dev/ttymxc021         else22                 /sbin/ifconfig eth0 192.168.253.12 netmask 255.255.255.0 up23         fi24 fi25 echo Done > /dev/ttymxc0

如图 2.6.8:

图 2.6.8

(9)然后保存并退出“ifconfig-eth0”文件,使用“chmod 755 ifconfig-eth0”命令修改权限,如图 2.6.9:

图 2.6.9

(10)接下来在“init.d”文件夹下使用“vi rcS”命令建立“rcS”文件,如图 2.6.10:

图 2.6.10

(11)然后在“rcS”文件输入下面的内容(注意每行前面的行号不要复制):

1 #! /bin/sh2 PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:3 runlevel=S4 prevlevel=N5 umask 0226 7 export PATH runlevel prevlevel8 # 9 #       Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
10 #
11 trap ":" INT QUIT TSTP
12 /bin/hostname iTOP-iMX6UL
13 #/bin/mount -n -t proc none /proc
14 #/bin/mount -n -t sysfs none /sys
15 #/bin/mount -n -t usbfs none /proc/bus/usb
16 #/bin/mount -t ramfs none /dev
17 [ -e /proc/1 ] || /bin/mount -n -t proc none /proc
18 [ -e /sys/class ] || /bin/mount -n -t sysfs none /sys
19 [ -e /dev/tty ] || /bin/mount -t ramfs none /dev
20
21 echo /sbin/mdev > /proc/sys/kernel/hotplug
22 /sbin/mdev -s
23 #/bin/hotplug
24 # mounting file system specified in /etc/fstab
25 mkdir -p /dev/pts
26 mkdir -p /dev/shm
27 /bin/mount -n -t devpts none /dev/pts -o mode=0622
28 /bin/mount -n -t tmpfs tmpfs /dev/shm
29 #/bin/mount -n -t ramfs none /tmp
30 #/bin/mount -n -t ramfs none /var
31 mkdir -p /var/empty
32 mkdir -p /var/log
33 mkdir -p /var/log/boa
34 mkdir -p /var/lock
35 mkdir -p /var/run
36 mkdir -p /var/tmp
37
38 #ln -sf /dev/ttyS2 /dev/tty2
39 #ln -sf /dev/ttyS2 /dev/tty3
40 #ln -sf /dev/ttyS2 /dev/tty4
41
42 syslogd
43 /etc/rc.d/init.d/netd start
44 echo " " > /dev/tty1
45 echo "Starting networking..." > /dev/tty1
46 #sleep 1
47 #/etc/rc.d/init.d/httpd start
48 #echo " " > /dev/tty1
49 #echo "Starting web server..." > /dev/tty1
50 #sleep 1
51 #/etc/rc.d/init.d/leds start
52 #echo " " > /dev/tty1
53 #echo "Starting leds service..." > /dev/tty1
54 #echo " "
55 #sleep 1
56 #echo "*************************************" > /dev/ttySAC2
57 #echo " http://www.topeet.com.cn " > /dev/ttySAC2
58 #echo "*************************************" > /dev/ttySAC2
59 #echo "*************************************"
60 #echo " http://www.topeet.com.cn "
61 #echo "*************************************"
62
63 mkdir /mnt/disk
64 sleep 1
65 /sbin/ifconfig lo 127.0.0.1
66 /etc/init.d/ifconfig-eth0

如图 2.6.11:

图 2.6.11

(12)然后保存并退出“rcS”文件,使用“chmod 755 rcS”命令修改“rcS”文件的权限,如图 2.6.12:

图 2.6.12

(13)接下来使用“cd …”命令返回到“init.d”文件夹的上一级目录“etc”,如图 2.6.13:

图 2.6.13

(14)接下来在“etc”目录下使用“vi passwd”命令建立文件“passwd”,如图 2.6.14:

图 2.6.14

(15)然后在新建立的“passwd”文件中输入下面的内容(注意每行前面的行号不要复制):

  1 root::0:0:root:/:/bin/sh2 bin:*:1:1:bin:/bin:3 daemon:*:2:2:daemon:/sbin:4 nobody:*:99:99:Nobody:/:

如图 2.6.15:

图 2.6.15

(16)添加之后保存并退出“passwd”文件,使用“chmod 755 passwd”命令修改“passwd”文件的权限,如图 2.6.16:

图 2.6.16

(17)然后使用“vi profile”命令在“etc”目录建立“profile”文件,如图 2.6.17:

图 2.6.17

(18)然后在“profile”文件中输入下面的内容(注意每行前面的行号不要复制)。

  1 # Ash profile2 # vim: syntax=sh3 4 # No core files by default5 ulimit -S -c 0 > /dev/null 2>&16 7 8 USER="`id -un`"9 LOGNAME=$USER10 PS1='[$USER@$HOSTNAME]# '11 PATH=$PATH12 13 HOSTNAME=`/bin/hostname`14 15 export USER LOGNAME PS1 PATH

如图 2.6.18:

图 2.6.18

(19)然后保存并退出“profile”文件,使用“chmod 755 profile”命令修改“profile”文件的权限,如图 2.6.19:

图 2.6.19

(20)接下来使用“mkdir rc.d”命令在“etc”目录建立文件夹“rc.d”,如图 2.6.20:

图 2.6.20

(21)使用“cd rc.d”命令进入到刚才建立的“rc.d”文件夹,如图 57.2.2.6.21:

图 2.6.21

(22)接下来在“rc.d”目录下使用“mkdir init.d”命令建立“init.d”文件夹,如图 2.6.22:

图 2.6.22

(23)然后使用“cd init.d”命令进入到刚才建立的“init.d”文件夹,如图 2.6.23:

图 2.6.23

(24)接着在“init.d”文件夹,使用“vi netd”命令建立“netd”文件,如图 2.6.24:

图 2.6.24

(25)然后在“netd”文件里面输入下面的内容(注意每行前面的行号不要复制):

  1 #!/bin/sh2 3 base=inetd4 5 # See how we were called.6 7 case "$1" in8         start)9                 /usr/sbin/$base10         ;;11         stop)12                 pid=`/bin/pidof $base`13                 if [ -n "$pid" ]; then14                         kill -9 $pid15                 fi16         ;;17 esac18 19 exit 0

如图 2.6.25:

图 2.6.25

(26)然后保存并退出“netd”文件,使用“chmod 755 netd”命令修改“netd”文件的权限,如图 2.6.26:

图 2.6.26

(27)接着使用“cd …/…/…/”命令返回到“system”目录,如图 2.6.27:

图 2.6.27

(28)接着使用“cd lib”命令进入到“lib”目录,如图 2.6.28:

图 2.6.28

(29)因为我们使用的交叉编译环境和编译内核是一样的,所以我们的编译器在文件夹“/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/”中。Busybox 编译生成的二进制文件是以动态链接库的形式运行,所以我们需要拷贝编译器里面的库文件到“lib”目录,使用命令“cp -d /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib/* ./”,如图 2.6.29:

图 2.6.29

(30)然后可以使用“ls”命令查看一下拷贝过来的库文件,如图 2.6.30:

图 2.6.30

(31)库文件拷贝完成后,使用“cd …”命令返回到“system”目录,如图 2.6.31:

图 2.6.31

(32)接下来使用“cd var”命令进入到“var”目录,如图 2.6.32:

图 2.6.32

(33)然后使用“mkdir lib lock log run tmp”命令在“var”目录下建立“lib,lock,log,run,tmp”五个目录,可使用命令“ls”查看,如图 2.6.33:

图 2.6.33

(34)至此,文件系统所需要的文件都已经创建好了,使用“cd …/…/”命令返回到“system”文件夹的上一级目录,如图 2.6.34:

图 2.6.34

2.7 制作文件系统镜像及测试

如图 2.7.1所示,是 busybox 制作的根文件系统。

图 2.7.1

然后使用压缩命令将文件系统打包,生成 rootfs.tar.bz2 文件
“tar -cjf rootfs.tar.bz2 bin dev etc lib linuxrc mnt proc sbin sys tmp usr var”
如图 2.7.2所示:

图 2.7.2

可以看到“rootfs.tar.bz2”压缩包,这个就是制作好的最小 linux 系统镜像。
现在已经完成了 Linux 文件系统镜像的制作,可以把我们制作的“rootfs.tar.bz2”通过ssh工具传到烧写工具对应目录下。

图 2.7.3

还需要烧写其它几个文件,分别是uboot,设备树文件,内核文件,该文件系统所需内核镜像和QT系统相同。
将开发板拨码切换成烧写模式,上电烧写,等待烧写完成。
启动后系统如图 2.7.4:

图 2.7.4

i.MX6ULL终结者Linux文件系统开发制作最小文件系统镜像相关推荐

  1. 使用Busybox制作最小文件系统并烧写入开发板

    使用Busybox制作最小文件系统并烧写入开发板 实验环境 交叉编译平台 (on VMware14.0,Win10) 交叉编译链 gcc-linaro-4.9.4-2017.01-x86_64_arm ...

  2. 基于Linux的Buildroot 制作根文件系统(rootfs)

    基于Linux的Buildroot 制作根文件系统(rootfs) 1.需要条件 2.安装交叉编译链 3.下载Buildroot代码包 4.开始buildroot 制作根文件系统 5.配置文件系统 m ...

  3. 【Tiny4412】制作最小文件系统脚本

    00. 目录 文章目录 00. 目录 01. 制作最小文件系统脚本 02. 问题专区 03. 附录 01. 制作最小文件系统脚本 #!/bin/bash#文件系统的目录名 FILESYSTEM=/ro ...

  4. 迅为RK3568开发板Busybox制作最小文件系统编译busybox

    保存退出之后,我们需要设置临时环境变量如下图所示: export PATH=/usr/local/arm64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux ...

  5. DM368开发 -- 制作ubifs文件系统

    一.Ubifs 文件系统的制作和启动 (重点)参看:UBIFS Support 参看:UBIFS - UBI File-System UBI 文件系统是 JFFS2 的下一代文件系统,更适合 NAND ...

  6. 制作ext4文件系统linux,linux下如何制作ext4文件系统镜像

    1.生成一个空的2MiB文件 dd if=/dev/zero of=rootfs.ext4 bs=1024 count=2048 (指定每一块大小为1024字节,一共又2048块,那么就是2048 * ...

  7. 嵌入式Linux利用busybox制作根文件系统

    本文介绍如何利用busybox制作一个最小根文件系统,系统包含ls.cd.ifconfig等基本指令,文件系统采用动态加载的方式. 1.去busybox官网下载源码   官网地址:busybox官网 ...

  8. Linux驱动开发_设备文件系统详解

    目录 何为设备管理器? Linux下dev的作用 Devfs sysfs kobject udev proc 何为设备管理器? 设备管理器就是负责管理这台电脑上的外设,当我们通过电脑提供的USB口插入 ...

  9. linux docker安装 制作Elasticsearch容器镜像 并上传docker hub

    1 linux docker下载安装 创建操作系统并启动容器 1.ubuntu系统下载docker apt-get install -y docker.io #查看docker版本 docker ve ...

最新文章

  1. encache学习教程
  2. Oracle笔记----oracle数字类型number自增
  3. 计算机网络ipv4到ipv6怎么实现,论计算机网络协议IPV4到IPV6的过渡策略|房屋搬迁过渡协议...
  4. 修复计算机的英语,Windows Repair最新版
  5. java程序运行三步骤 理解编译
  6. 对A1A2A10B1B2N12排序
  7. 设计模式笔记三:单例模式
  8. oracle数据库提示无监听,【原创】PL/SQL连数据库提示无监听程序
  9. Pytorch register_forward_hook()简单用法
  10. Linux替代Windows系统软件比拼
  11. weak引用表原理探究
  12. Spring框架之ioc
  13. 平衡树(模板+文艺平衡树)
  14. Java随机产生中文昵称
  15. 简单三步,教你搭建一个私有云盘
  16. 七夕抢付限量优惠,全新XPS13二合一笔记本戴尔官网独家首发
  17. hdu3987 Harry Potter and the Forbidden Forest 最小割边数
  18. php 0 加减乘除,php 加减乘除计算器 用php简单实现加减乘除计算器
  19. C51单片机实现 贪吃蛇
  20. 利用matlab实现驻波仿真

热门文章

  1. 参数辨识验证模块(二阶RC模型)
  2. APO算法挑战赛--赛鸭平台做的C++习题(持续更新)
  3. 拉货搬家货运APP功能列表
  4. 团队作业1-组队与选题
  5. java水果超市心得体会,水果超市社会实践总结
  6. 初学者如何选择编程语言和开发方向(非常详细)
  7. 常数变易法的原理解释
  8. XHTML和HTML最显著的区别
  9. PHP intl扩展实现汉字转拼音
  10. 傍晚的夕阳映红了你的双颊