文章目录

  • 一、开发板配置
  • 二、了解rootfs
  • 三、虚拟机文件配置
    • 1.目录配置
    • 2.x210_bsp配置
    • 3.rootfs配置
    • 4.make menuconfig
  • 四、busybox的移植实战
    • 1、了解busybox
    • 2、busybox源码获取
    • 3、busybox配置
  • 五、NFS挂载根文件系统
    • 1.NFS简述
    • 2.NFS服务器安装
    • 3.NFS使用过程
    • 4.NFS配置
  • 六、开发板根目录配置
    • 1.inittab文件详解
    • 2.rcS文件详解
    • 3.rcS实战
  • 七、动态链接库的拷贝
    • 1.静态编译链接测试
    • 2.解决办法:
    • 3.解释:
    • 4.strip工具
  • 八、ext2格式镜像烧录
    • 1. 确定文件夹格式的rootfs可用
    • 2.ext2镜像制作

一、开发板配置

(使用secureCRT)
首先确保开发板完成以下配置:

主机IP:
set ipaddr192.168.1.10
服务器IP:
set serverip 192.168.1.141
网关:
set gatewayip 192.168.1.1
子网掩码:
set netmask 255.255.255.0
内核驱动设置:
set bootcmd 'tftp 30008000 zImage; bootm 30008000'
bootargs配置:
set bootargs root=/dev/nfs nfsroot=192.168.1.141:/root/rootfs/x210_bsp ip=192.168.1.10:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200

最后输入save保存一下,这样开发板的网络和内核配置就设置好了

二、了解rootfs

rootfs的两种表现形式:
1、nfs方式启动的文件夹形式的rootfs(主机)

2、用来烧录的镜像形式rootfs(开发板)

三、虚拟机文件配置

1.目录配置

首先我们需要root进入超级用户模式,在虚拟机的root目录下再次创建以下两个目录:
rootfs x210_bsp

这时候我们需要知道这两个文件夹下有什么:

  • x210_bsp:用于uboot烧录和配置
  • rootfs:用于挂载开发板根文件系统

2.x210_bsp配置

首先进入到该目录下,并将文件qt_x210v3s_160307.tar.bz2复制到该目录下解压

以上是解压qt_x210v3s_160307.tar.bz2内的文件内容,后面会说到这个目录如何使用

3.rootfs配置

首先我们需要在该目录下继续创建一个名为x210_rootfs的文件夹,并且进入到该文件夹下,将我们上面提到的busybox文件复制到此目录下并解压

以上是解压busybox-1.24.1(这是我选择的busybox版本)的全部文件

4.make menuconfig

进入x210_bsp/kernel 目录下,输入命令:make menuconfig进入图形化菜单

这里我们按下面操作完成网络配置

[*]Networking support --->Networking options --->

网络文件系统设置

File systems --->[*]Networking File Systems --->

有需要把开发板作为服务器端的也可以选择把NFS server support设置打开,这里我们仅实验客户端

以上配置结束后输入命令make编译,至此开发板uboot的网络和文件系统部分配置结束。

四、busybox的移植实战

1、了解busybox

busybox是一个集成了一百多个最常用linux命令和工具的软件,他甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小.我们平时用的那些linux命令就好比是分立式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍。

2、busybox源码获取

busybox官网

注意:我们在文件系统构建中,内核编译和文件系统的程序编译都必须是使用的统一交叉编译器。(选择将虚拟机中的交叉编译文件复制一份到开发板构建的文件系统下)

3、busybox配置

(1)修改Makefile

首先进入~/rootfs/x210_rootfs/busybox-1.24.1目录下

输入命令vi Makefile进入脚本进行以下修改

173行:CROSS_COMPILE=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
注意:此处的交叉编译链需要对照自己电脑的交叉编译链
191行:ARCH=arm

(2)make menuconfig配置

Tip:此处的图形化菜单需要ncurses库(联网下载),由于之前博主自己在这里没有很深的基础知识,走了很多弯路。
因为后面的文件系统的挂载需要虚拟机切换网络状态为桥接模式,但是我的虚拟机桥接网络总是会反复重连,所以建议先将该库下载好,方便后续使用。

make menuconfig

Busybox Settings--->Build Options--->[*]Build BusyBox as a static binary(no shared libs)Busybox Library Tuning--->[*]vi-style line editing commands[*]Fancy shell promptsLinux Module Utilities--->[ ]Simplified modutils[*]insmod[*]rmmod[*]lsmod[*]modprobe[*]depmodLinux System Utilities--->[*]mdev[*]Support /etc/mdev.conf[*]Support subdirs/symlinks[*]Support regular expressions substitutions when renaming dev[*]Support command execution at device addition/removal[*]Support loading of firmwares

大家学习使用的时候跟着上面的进行配置即可
配置完成后,输入以下命令:
make -j4 (4代表我主机的内核数)
无报错继续下一步:
make install

解释:在Linux系统中安装软件的一般步骤:下载-配置-编译-安装,所以上面的make -j4就代表编译,make install代表安装

(3)设置busybox安装路径

  • make menuconfig
Busybox Settings --->Installation Options ("make install" behavior) --->(./)BusyBox installation prefix) //这里设置安装路径

(4)解决方案
在虚拟机的配置中,由于代码的复杂性时常让我们不能很全面清晰的看到自己所做的改变,有时候就会出现各种各样的状况。

make -j4编译可能遇到的问题:

  • sync.c(text.sync_main+0x78):undefined reference to 'syncfs'

分析:可能是gcc和当前busybox版本不兼容造成的,我们只需要将其禁用即可。

解决方法:

make menuconfig
点击/进入搜索,输入SYNC,根据提示禁用SYNC
最后再make -j4编译一下即可


其实还可以选择在源代码中解决这个问题,过程有些繁琐就不赘述,动手能力强的可以一试。

(5)make install简述

  • 默认安装位置:./_install
  • 文件包含有:bin linuxrc sbin usr

ls -l可以看到: linuxrc -> bin/busybox //这个linuxrc其实就是个符号链接

这里也不难发现,bin下的所有的符号链接都指向了busybox

(6)make menuconfig更改NFS挂载目录到/root/rootfs/x210_rootfs下

make menuconfig Busybox Settings —> Installation Options (“make install” behavior) —> (/root/rootfs/x210_rootfs)BusyBox installation prefix

执行make install后,回到被挂载的目录下,可以发现这四个文件已经生成。

五、NFS挂载根文件系统

1.NFS简述

  • NFS 是Network File System的缩写,即网络文件系统。
  • 功能:通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据。

2.NFS服务器安装

sudo apt-get install nfs-kernel-server

3.NFS使用过程

启动NFS服务器->启动NFS客户端->挂载NFS目录

4.NFS配置

  • 输入命令vim /etc/exports

在最后一行修改

  • "文件挂载目录" *(rw,sync,no_root_squash,no_subtree_check)

  • 保存退出后,输入mount -t nfs -o nolock 192.168.240.33:/root/rootfs/x210_rootfs(根据实际情况修改)

  • 输入命令/etc/init.d/nfs-kernel-server restart重启NFS服务

六、开发板根目录配置

首先将etc目录放置到挂载根目录下

etc目录下载:

点击此处

1.inittab文件详解

<1>添加一个典型的inittab文件到etc目录下

inittab下载

<2>inittab格式解析

id:runlevels:action:process

解释:

  • id:标识符,即代表记录的名字
  • runlevels(可不填):用于指定该记录在哪些运行级别中运行,runlevel可以设定为单个运行级别,也可以设定多个运行级别

  • action:用于描述该级别该执行什么操作(部分说明)

  • process:具体执行的命令

<3>了解busybox init与inittab之间的关系

  • busybox init进程主要完成系统的初始化工作。

busybox init进程的工作流程:

为init设置信号处理过程->初始化控制台->剖析/etc/inittab文件->执行系统初始化命令行,缺省(默认)情况下会使用/etc/init.d/rcS->执行所有导致 init 暂停的 inittab 命令(动作类型: wait)->执行所有仅执行一次的 inittab(动作类型: once)

  • 一旦完成以上工作, init 进程便会循环执行以下进程:

<1>执行所有终止时必须重新启动的 inittab 命令(动作类型: respawn)
<2>执行所有终止时必须重新启动但启动前必须询问用户的 inittab 命令(动作类型: askfirst)

  • 简而言之,就是初始化控制台之后, BusyBox 会检查/etc/inittab 文件是否存在,如果此文件不存在, BusyBox 会使用缺省的inittab 配置,它主要为系统重引导,系统挂起以及 init 重启动设置缺省的动作,此外它还会为四个虚拟控制台(tty1 到 tty4)设置启动 shell 的动作。如果未建立这些设备文件, BusyBox 会报错。

注意:理解inittab的关键就是明白“当满足action的条件时就会执行process这个程序。” 去分析busybox的源代码就会发现,busybox最终会进入一个死循环,在这个死循环中去反复检查是否满足各个action的条件,如果某个action的条件满足就会去执行对应的process。

<4>配置
vi命令打开inittab模板文件

#first:run the system script file   注释
::sysinit:/etc/init.d/rcS    //在控制台初始化之前执行rcS::askfirst:-/bin/sh::ctrlaltdel:-/sbin/reboot  //执行控制台时的打印信息#umount all filesystem  //同时按住3键可以重启
::shutdown:/bin/umount -a -r//关机时接触挂载init#restart init process//重启时启动
::restart:/sbin/init

修改脚本:

2.rcS文件详解

<1>添加一个典型的rcS文件到etc目录下

rcS下载

<2>rcS文件解析

#!/bin/sh   需要继续添加环境变量,在后面:/new 即可
PATH=/sbin:/bin:/usr/sbin:/usr/bin runlevel=S
prevlevel=Numask 022export PATH runlevel prevlevelmount -a
  • PATH=xxx

PATH这个环境变量是linux系统内部定义的一个环境变量,含义是操作系统去执行程序时会默认到PATH指定的各个目录下去寻找。如果找不到就认定这个程序不存在,如果找到了就去执行它。将一个可执行程序的目录导出到PATH,可以让我们不带路径来执行这个程序。

  • runlevel=

linux操作系统自从开始启动至启动完毕需要经历几个不同的阶段,这几个阶段就叫做runlevel。例如init 0就是关机,init 6 就是重启

  • umask=

umask是linux的一个命令,作用是设置linux系统的umask值,而umask值决定当前用户在创建文件时的默认权限。

  • mount -a

mount -a是挂载所有的应该被挂载的文件系统,在busybox中mount -a时busybox会去查找一个文件/etc/fstab文件,这个文件按照一定的格式列出来所有应该被挂载的文件系统(包括了虚拟文件系统)

3.rcS实战

首先将前面提供的etc压缩包模板下载至共享文件夹

<1>输入命令打开rcS脚本:vi etc/init.d/rcS。我们可以发现在每一行代码的后面都有一个^m,将其删除,这样开发板启动的时候就不会报错了

<2>mdev

udev/mdev的工作就是配合linux驱动生成相应的/dev目录下的设备文件。

rcS文件中没有启动mdev的时候,ls查看/dev目录下启动后是空的;在rcS文件中添加以下与mdev有关的2行配置项后:

echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

再次启动系统后发现/dev目录下生成了很多的设备驱动文件

<3>hostname

我们进入etc目录下创建一个名为sysconfig的文件夹,并在该目录下再次touch创建一个名为HOSTNAME的文件,vi命令进入可修改当前系统主机名

hostname是linux中的一个shell命令。hostname xxx执行后可以设置当前主机名为xxx ,直接hostname不加参数可以显示当前系统的主机名。

  • 添加profile文件(该文件在前面etc提供的模板文件有)后,即可显示用户名和hostname

<4>ifconfig

(1)有时候我们希望开机后进入命令行时ip地址就是一个指定的ip地址(譬如192.168.240.40),这时候就可以在rcS文件中ifconfig eth0 192.168.240.40

<5>mount挂载测试

这时候我们在secureCRT中启动开发板,可以发现还是存在一些报错,例如

mount: mounting tmpfs on /var failed: No such file or directory
mount: mounting tmpfs on /tmp failed: No such file or directory
mount: mounting tmpfs on /dev failed: No such file or directory
......

这是由于我们的之前创建的根目录挂载文件中没有创建这些文件,输入mkdir命令在根目录依次创建即可

七、动态链接库的拷贝

1.静态编译链接测试

首先我们在开发板根目录下touch a.c文件,然后gcc编译一下它,可以发现在虚拟机中可以成功打印,但是在开发板端执行编译命令却并没有成功,这是因为在开发板中并没有交叉编译的相关文件

a.c file->#include<stdio.h>
int main()
{printf("hello world!\n");return 0;
}

2.解决办法:

拷贝一份动态链接库文件到开发板根目录下

cp lib/*so* /root/rootfs/x210_rootfs/lib/ -rdf

3.解释:

这时候执行命令./a.out发现可以正常打印

4.strip工具

动态链接库so文件中包含了调试符号信息,这些符号信息在运行时是没用的(调试时用的),这些符号会占用一定空间。在传统的嵌入式系统中flash空间是有限的,为了节省空间常常把这些符号信息去掉。这样节省空间并且不影响运行。

去掉符号信息的命令:

arm-linux-strip *so*

八、ext2格式镜像烧录

1. 确定文件夹格式的rootfs可用

前面我们已经提前配置好,此处不再赘述

2.ext2镜像制作

  • 首先我们在~/rootfs目录下mkdir ext2_rootfs创建用于我们的挂载目录。

  • 然后输入以下命令:

dd if=/dev/zero of=rootfs.ext2 bs=1024 count=10240losetup  /dev/loop1 rootfs.ext2mke2fs -m 0 /dev/loop1 10240mount -t ext2 /dev/loop1 ./ext2_rootfs/
  • 此时我们复制一份开发板根目录到ext2_rootfs下
cp rootfs.ext2 /mnt/hgfs/Myshare/ -f
  • 进入~/rootfs目录,执行清除卸载命令
umount /dev/loop1
losetup -d /dev/loop1
  • 此时在rootfs目录下可以看见生成了一个rootfs.ext2镜像文件,我们将其复制到共享文件夹下,然后再将其复制到电脑fastboot目录下,执行uboot烧录操作,借鉴该博客【Linux系统开发】Study210开发板刷安卓系统

至此开发板根目录构建完成,其中也是遇到很多问题,也因此给自己挖了很多坑,然后又给自己填坑,虽然过程不尽人意,但是最后获得的都是自己的,大家在尝试这个实验的时候欢迎博客私信交流!


参考资料:

  • Linux开发之根文件系统构建及过程详解

  • busybox init进程和/etc/inittab关系

  • NFS-LINUX挂载实践

【Linux系统开发】x210开发板根目录文件系统构建相关推荐

  1. 【嵌入式】构建嵌入式Linux系统(uboot、内核、文件系统)

    知识架构及层次 Linux内核由三部分构成: Bootloader:启动引导系统(可执行文件) Kernel:内核(可执行文件) Root File System:根文件系统 嵌入式Linux系统构成 ...

  2. Linux系统如何创建和挂载XFS文件系统

    Linux系统如何创建和挂载XFS文件系统?XFS是高性能文件系统,由于它的高性能,XFS成为了许多企业级系统的首选,特别是有大量数据,需要结构化伸缩性和稳定性的.下面我们来看看如何实现创建和挂载XF ...

  3. linux常见的文件系统格式,Linux系统里几种常见的文件系统格式

    在天下网吧-网吧系统-网吧天下栏目上一篇文章中,我们看到了:希望对各位网吧网管或者网吧维护,做网吧系统的各位大大有用,那么今天我们一起来看下:Linux系统里几种常见的文件系统格式 在上一篇文章中我们 ...

  4. 迅为IMX6ULL教程更新至2060+页,裸机开发,Linux系统移植,驱动开发,构建文明系统,QT开发,系统编程

    教程更新至2060+页 彻底让零基础的同学真正学会 更完善的教程更全面的讲解更高效的学习 第一部分 总领及学习指引:主要探讨的学习方法,我们将尽量用比较简洁的方式,让大家明白嵌入式系统知识体系,以及它 ...

  5. linux系统移植与开发

    文章目录 前言 1 .第一次拿到开发板需要做什么 1.1 . 开发板启动方式,接线方法 1.2 . 开发板驱动安装 2.U-BOOT的修改和完善 2.1.简单的源码修改 2.1.1.串口输出欢迎图案和 ...

  6. 玩转开发板--Linux系统移植至开发板fl2440实践过程

    一.开发板介绍     CPU:S3C2440(SAMSUNG).ARM920T.400MHz     Pone/mic:耳机和话筒 JTAG:可以通过外部插入直接控制CPU,因此在初始化内存时,起到 ...

  7. linux系统中用c开发东西可以吗,Linux下的C的开发之GCC的初级使用

    Linux下的C开发,可能与win平台的C有点不太一样,但可能不太多,遇到再说吧,我们今天要说的就是GCC的使用技巧(初级的),完全菜鸟级的!! 很多人的感觉,特别是离开win平台,到Linux平台写 ...

  8. Linux 系统ble功能开发

    标准的linux系统一般都不带ble的应用功能,需要客户自己自定义开发,不过一般可以采用开源的bluez架构,目前最新的已经到5.5版本了,我用的5.4版本. 里面包含了bt的各种应用场景,可以作为b ...

  9. LKT5103A Hid接口LINUX系统下JNI开发流程

    一.什么是JNI Java以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能.解决Java对本地操作的一种方法就是JNI.JNI是Java ...

最新文章

  1. torchnet package (2)
  2. 深度学习笔记:卷积神经网络的Tensorflow实现
  3. Pytorch基础(一) —— tensorboard的应用
  4. pycharm如何汉化
  5. oracle赋予一个用户查询另一个用户中所有表
  6. MySQL:查询条件
  7. 有助于获得优质流量的免费SEO关键词工具
  8. 技术人员如何创业《一》- 产品及想法
  9. # 20155224 第十一周 课堂练习《计算后缀表达式的值》
  10. linux怎么定义程序执行有限级别,linux 内核是什么?
  11. tcpip详解卷一 pdf_清华大牛爆肝分享网络底层/网络协议/TCP/IP协议详解卷一
  12. 地图数据下载方法与商业地图下载器介绍
  13. qt中将数据存入文档再读出------------ writeRawData 与readRawData成对使用
  14. 抖音快手免费去水印方法技巧
  15. 一款在线Markdown编辑器,Markdown小白神器
  16. android so 签名校验,Android-NDK-之so文件签名校验
  17. 虚拟机连接本地数据库
  18. 【软件工程】敏捷宣言
  19. 自定义返回上一步idea快捷键
  20. SQL查询和分析跟踪 — SQL Server Profiler

热门文章

  1. 【区块链 | 前端】前端开发人员入门区块链的最佳实践
  2. 华为胡厚崑:不让任何一个人在数字世界中掉队
  3. 译文:创建性感的CSS
  4. 电影《妖妖铃》改名为《妖铃铃》
  5. 基于ip-iq变换的谐波检测算法,并联型APF 有源电力滤波器 谐波电流检测
  6. DM单机包含集群搭建
  7. Proteus中的继电器在哪里
  8. Dubbo远程传输协议详解
  9. Linuxserver沦陷为肉鸡的全过程实录
  10. 工欲善其事,必先利其器之-mac下使用zsh