一、概念

根文件系统:系统运行所必须依赖的一些文件
(比如脚本、库、配置文件、命令…),本质就是目录和文件。

根文件系统镜像:将根文件系统按照某种格式进行
打包压缩后生成的单个文件 rootfs-----> ramdisk.img

文件系统:一种管理和访问磁盘的软件机制,
不同文件系统管理和访问磁盘的机制不同

二、移植根文件系统的工具 —> busybox

1、短小精悍
2、版本更新较快,版本之间差异不大

三、如何获取busybox

https://busybox.net/downloads/
选择busybox-1.32.0.tar.bz2版本

四、根文件系统中目录的介绍

注释:个文件功能解析
bin: 命令文件(通过busybox工具制作)
dev: 设备文件(被操作系统识别的设备才有对应的文件,即设备运行时)
etc: 配置文件(配置内核相关的一些信息)
lib: 库文件、比如C的标准库(从交叉编译工具链中复制的)
linuxrc:根文件系统被挂载后运行的第一个程序(通过busybox工具制作)
mnt: 共享目录(非必要)比如挂载SD卡等时将SD卡挂载在该目录
proc: 与进程相关的文件(当有进程运行时才会有文件)
root: 用户权限(板子本身就是以root用户运行)
sbin: 超级用户命令、一般用户不可用(板子本身是超级用户 通过busybox工具制作)
sys: 系统文件(系统运行时,系统加载后才会有文件)
tmp: 临时文件(比如插入新的设备时会产生临时文件)
usr: 用户文件(通过busybox工具制作)
var: 存放下载的文件和软件 (可有可无)

五、切换交叉编译器为gcc-4.9.4版本(自行寻找合适版本)

六、使用busybox工具制作根文件系统

1、拷贝busybox-1.32.0.tar.bz2到ubuntu中

2、解压缩
tar -vxf busybox-1.32.0.tar.bz2

3、进入到busybox-1.32.0目录
cd busybox-1.32.0

4、make help 获取帮助
Cleaning:
clean
distclean

Build:
all
Configuration:
menuconfig

Installation:
install
uninstall

5、配置编译busybox
1)、修改Makefile配置交叉编译器
164 CROSS_COMPILE ?=
190 ARCH ?= $(SUBARCH)
修改为 :
164 CROSS_COMPILE ?= arm-none-linux-gnueabi-
190 ARCH ?= arm

2)、清除中间文件
make distclean
3)、 执行make menuconfig进行图形化界面配置
make menuconfig
a) 采用静态编译,不使用动态库
Settings —>
[*] Build static binary (no shared libs)

b) 采用vi风格的命令行编辑
Settings —>
[*] vi-style line editing commands

c) 修改根文件系统的安装路径
Settings —>
(./rootfs) Destination path for ‘make install’

d) 支持完整的模块化命令
Linux Module Utilities —>
[ ] Simplified modutils # 去掉*

4)、编译busybox
make all

5)、安装根文件系统
make install

很多的命令都散落在busybox各个目录下,
执行make install 命令将一些根文件系统的命令或者文件
重新定向到指定的根文件系统中。

将新生成的根文件系统拷贝到nfs目录下下
cp rootfs ~/nfs -rf

六、步骤完善根文件系统

1、启动成功,但是有错误信息如下
can’t run ‘/etc/init.d/rcS’: No such file or directory
can’t open /dev/tty2: No such file or directory
can’t open /dev/tty3: No such file or directory
can’t open /dev/tty4: No such file or directory

解决思路:
<文件不存在就创建文件>
在根文件系统中创建etc/init.d目录,并创建rcS文件
并修改rcS文件的权限为777,
$ cd ~/nfs/rootfs
$ mkdir -p etc/init.d
$ cd etc/init.d
$ touch rcS
$ chmod 777 rcS

打开rcS文件,并添加一下内容:

#!/bin/sh
/bin/mount -a
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
解析:
/bin/mount -a:系统会自动解析fstab配置文件,根据fstab文件中的信息,进行一系列的挂载。echo /sbin/mdev > /proc/sys/kernel/hotplug:进行了重定向,告诉内核创建设备文件的程序是/sbin/mdev
/sbin/mdev -s:在dev目录下创建设备文件

创建dev目录:

 $ cd ~/nfs/rootfs $ mkdir dev

2、在重启开发板出现以下问题
mount: can’t read ‘/etc/fstab’: No such file or directory
解决:
在etc目录下创建fatab文件

$ cd ~/nfs/rootfs
$ cd etc
$ touch fstab

打开fstab,并添加一下内容:

#device mount-point type options dump fsck orde
proc    /proc   proc    defaults  0  0
tmpfs   /tmp    tmpfs   defaults  0  0
sysfs   /sys    sysfs   defaults  0  0
tmpfs   /dev    tmpfs   defaults  0  0
解析:
第一列:设备
第二列:挂载点
第三列:设备类型
其他列:权限相关,默认权限

/etc/init.d/rcS: line 3: can’t create /proc/sys/kernel/hotplug: nonexistent directory
解决办法:

 $ cd ~/nfs/rootfs$ mkdir proc

mdev: /sys/dev: No such file or directory
解决办法:

$ cd ~/nfs/rootfs
$ mkdir sys

3、再次重启开发板,观察现象
mount: mounting tmpfs on /tmp failed: No such file or directory
解决办法:

$ cd ~/nfs/rootfs
$ mkdir tmp

4、再次重启开发板,观察现象
can’t open /dev/tty2: No such file or directory
can’t open /dev/tty3: No such file or directory
can’t open /dev/tty4: No such file or directory

解决办法:
在etc目录下创建inittab文件,

$ cd ~/nfs/rootfs
$ cd etc
$ touch inittab

打开inittab文件,并添加一下内容

::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
解析:
::sysinit:/etc/init.d/rcS  :
系统启动之后运行linuxrc程序,
执行/etc/init.d/rcS脚本文件::askfirst:-/bin/sh :
按下任意键之后,开启一个shell的终端::restart:/sbin/init  :
重启系统之后执行/sbin/init::ctrlaltdel:/sbin/reboot  :
按下ctrl + alt + del 执行/sbin/reboot,重启系统

5、再次重启开发板,观察现象。
根文件系统基本制作成功。
将其他的几个文件创建出来:

mkdir lib home mnt root var

6、添加用户名
在etc目录下创建profile文件,并添加一下信息:

export HOSTNAME=linux
export USER=root
export HOME=root
#export PS1="\[\u@\h \W\ ]\$ "
#cd root
export PS1="[$USER@$HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH

7、编译hello.c的应用程序,使用交叉编译器进行编译,拷贝到开发板中去运行,查看运行结果。

运行之后出现以下出错误:
[root@linux ]# ./hello
-/bin/sh: ./hello: not found

使用以下命令查看hello依赖的动态库是:

 arm-none-linux-gnueabi-readelf -d hello
Dynamic section at offset 0xf18 contains 24 entries:Tag        Type                         Name/Value0x00000001 (NEEDED)                     Shared library: [libc.so.6]

解决办法: 移植动态库到根文件系统中
从交叉编译器中找对应的动态库。

$ cd ~/toolchain/gcc-4.9.4
$ find . -name libc.so.6

结果

./arm-none-linux-gnueabi/sysroot/lib/libc.so.6

将交叉编译器./arm-none-linux-gnueabi/sysroot/lib/
目录中的所有的动态库,全部拷贝到根文件系统的lib目录下

$ cp -rf ./arm-none-linux-gnueabi/sysroot/lib/* ~/nfs/rootfs/lib

再次在串口工具中执行./hello就成功。

到此根文件系统的移植成功。

七、生成ramdisk.img的镜像文件

1、进入到ubuntu的家目录

$ cd  ~

2、执行如下命令制作一个大小为8M的镜像文件

$ dd  if=/dev/zero  of=ramdisk  bs=1k  count=8192

3、将该镜像格式化为ext2格式

$ mkfs.ext2  -F  ramdisk

4、将该镜像文件挂载到ubuntu下的/mnt目录下

$ sudo  mount  -t  ext2  ramdisk  /mnt

5、删除库文件中的符号表减小库文件体积:

$ su root
$ arm-none-linux-gnueabi-strip  lib/*

6、将我们自己制作的根文件系统中所有的文件拷贝到该镜像中

$ sudo  cp  -a  /home/linux/nfs/rootfs/*  /mnt/

7、解除挂载

$ sudo  umount  /mnt

8、压缩镜像文件

$ gzip  --best  -c  ramdisk  >  ramdisk.gz

9、使用mkimage工具为镜像文件添加校验头然后生成可用的镜像ramdisk.img

$ mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img

10、将自己制作生成的根文件系统镜像拷贝到tftp的下载目录下并修改其权限

$ cp  ramdisk.img  /home/linux/tftpboot/
$ chmod  777  /home/linux/tftpboot/ramdisk.img

11、重新配置linux内核使其支持ramdisk文件系统
进入到的linux源码的顶层目录下

$ cd  kernel-3.4.39/

执行以下命令进入内核配置界面

$ make  menuconfig

在图形化界面中进入到“Device Drivers —>”菜单,再进入“[*] Block devices —>”菜单,将 “RAM block device support” 选为“Y”,将“Default RAM disk size (kbytes)”修改为“8192”,如图所示:

配置完成后保存退出。
回到内核源码的顶层目录下重新编译内核源码:(将交叉编译器切换到4.5.1版本)

$ make  uImage

至此,内核可用的根文件系统已经配置好了

linux根文件系统编译和移植过程相关推荐

  1. linux开发 | 根文件系统构建实验及过程详解

    <2.uboot和系统移植-第19部分-2.19.根文件系统构建实验及过程详解> 第一部分.章节目录 2.19.1.根文件系统的构建路线 2.19.2.busybox的移植实战 2.19. ...

  2. linux开发 | nfs挂载根文件系统失败、处理过程

    NFS挂载根文件系统失败 [ 5.552903] s5p-tvout s5p-tvout: hpd status is cable removed [ 5.563919] DBUG_PORT must ...

  3. 嵌入式开发之linux根文件系统移植

    目录 前言 一.创建根文件系统目录 二.添加命令与实用程序 2.1 编译和安装 busybox 2.2 拷贝busybox内的小程序 三.添加lib库文件 3.1 拷贝工具链内的动态库 3.2 拷贝工 ...

  4. 构建基本的嵌入式Linux根文件系统

    构建基本的嵌入式Linux根文件系统 其实在去年8月份我做系统移植时就构建好了一个可以用的根文件系统,但是那时是跟着别人的<Linux全线移植文档>做的.有些东西我也不清楚,只是跟着做,做 ...

  5. 嵌入式软件开发之------浅析linux根文件系统挂载(九)

    Linux代码版本:linux4.4 导读:前些天拿到供应商的一块arm64开发板,需要对其新CPU进行测试评估.需要将公司自己的系统移植上去测试一些参数.在挂载公司的cpio包的时候,出现解压失败. ...

  6. 嵌入式Linux根文件系统制作

    嵌入式Linux根文件系统制作 一.根文件系统简介 根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统而言它还是内核启动时所挂载(mount)的 ...

  7. 采用busybox的嵌入式Linux根文件系统的的制作方法

    在嵌入式Linux操作系统越中文件系统作为操作系统的重要组成部分,用于控制对数据文件及设备的存取,提供对文件和目录的分层组织形式,数据缓冲以及对文件存取权限的控制.根文件系统一直是Linux系统不可或 ...

  8. 制作嵌入式Linux根文件系统

    文章目录 1. 根文件系统布局 2. 使用BusyBox生成二进制工具 2-1. 获取BusyBox源码 2-2. 配置BusyBox 2-2-1. 选择编译静态库 2-2-2. 选择交叉编译工具链 ...

  9. TQ210 —— 嵌入式Linux根文件系统的设计与实现

    嵌入式Linux根文件系统的设计与实现 1.Linux文件系统基本概念 文件系统类型:FAT32.NTFS.EXT2. EXT3. JFFS2. YAFFS2. NFS Linux根文件系统目录结构: ...

最新文章

  1. 只要努力搞,没有KPI搞不垮的团队?
  2. 适合于小团队产品迭代的APP测试流程
  3. c语言整行乘非整形等于什么意思,C语言--整形升级寻常算术转换
  4. 485光纤转换器产品分类介绍
  5. 最小生成树和最短路径
  6. SpringBoot-拦截器和文件上传
  7. ArcGIS连接pg数据库
  8. 显著性检验 python p值_python相关性分析与p值检验
  9. 面试题:你让工人为你工作7天,给工人的回报是一根金条...
  10. Activity设置透明主题
  11. 二进制拆弹(20181023-20181026)
  12. Vulnhub_MoneyBox
  13. Android GridView实现自定义日程表课表
  14. 《鸟哥的私房菜基础篇》第四版学习笔记——第0章 计算机概论
  15. 【百度地图】城市中心点坐标
  16. 全世界正在被软件占领
  17. Matplotlib之Python可视化
  18. 深度之眼Paper带读笔记NLP.2:word2vec.baseline.1
  19. 高龄程序员——28岁土木专业半路出家进军java的我后来怎么样了?
  20. 玩转论坛营销巧获永久自然流量

热门文章

  1. 不只是包子铺!巴比食品:重回高增长赛道,做中式面点第一品牌
  2. xampp软件安装流程
  3. C++函数指针与成员函数指针
  4. strcmp函数实现(c语言)
  5. python中的线性数据结构
  6. phpize的安装和使用
  7. centos-基本命令
  8. Summary - 文件导出测试
  9. TexStudio编写Latex碰到的问题
  10. excel表格多个文件夹计算机,excle多文件并排_如何在电脑桌面并排显示多个excel...