根文件系统制作


根文件系统一般也叫做 rootfs,那么什么叫根文件系统?在这里想要理解根文件系统,先了解什么是文件系统。文件系统是对一个存储设备上的数据和元数据进行组织的机制。这种机制有利于用户和操作系统的交互。在一篇oracle的技术文章中看到这样一句话“尽管内核是 Linux 的核心,但文件却是用户与操作系统交互所采用的主要工具。这对 Linux 来说尤其如此,这是因为在 UNIX 传统中,它使用文件 I/O 机制管理硬件设备和数据文件”,这句话可以这样理解的,在Linux没有文件系统的话,用户和操作系统的交互也就断开了,例如我们使用最多的交互shell,包括其它的一些用户程序,都没有办法运行。在这里可以看到文件系统相对于Linux操作系统的重要性。那什么是根文件系统呢????
根文件系统的这个“根”字就说明了这个文件系统的重要性,它是其他文件系统的根,没有这个“根”,其他的文件系统或者软件就别想工作。比如我们常用的 ls、 mv、 ifconfig 等命令其实就是一个个小软件,只是这些软件没有图形界面,而且需要输入命令来运行。这些小软件就保存在根文件系统中,这些小软件是怎么来的呢?本博客教大家构建自己的根文件系统,这个根文件系统是满足 Linux 运行的最小根文件系统,后续我们可以根据自己的实际工作需求不断的去填充这个最小根文件系统,最终使其成为一个相对完善的根文件系统。
linux系统的根文件系统主要包含以下的目录,所以在制作时也要添加这些主要的目录
在这里插入图片描述

1./bin目录
该目录下的命令可以被root与一般账号所使用,由于这些命令在挂接其它文件系统之前就可以使用,所以/bin目录必须和根文件系统在同一个分区中。/bin目录下常用的命令有:cat、chgrp、chmod、cp、ls、sh、kill、mount、umount、mkdir、[、test等。其中“[”命令就是test命令,我们在利用Busybox制作根文件系统时,在生成的bin目录下,可以看到一些可执行的文件,也就是可用的一些命令。

2、/dev目录
该目录下存放的是设备与设备接口的文件,设备文件是Linux中特有的文件类型,在Linux系统下,以文件的方式访问各种设备,即通过读写某个设备文件操作某个具体硬件。如
3./etc目录
该目录下存放着系统主要的配置文件,例如人员的账号密码文件、各种服务的其实文件等。ubuntu系统的etc目录的文件比较多,在嵌入式linux下就相对少很多。
5./lib目录
该目录下存放共享库和可加载(驱动程序),共享库用于启动系统。运行根文件系统中的可执行程序,比如:/bin /sbin 目录下的程序。
6./home目录
系统默认的用户文件夹,它是可选的,对于每个普通用户,在/home目录下都有一个以用户名命名的子目录,里面存放用户相关的配置文件。
7./root目录
系统管理员(root)的主文件夹,即是根用户的目录,与此对应,普通用户的目录是/home下的某个子目录。
8./usr目录
/usr目录的内容可以存在另一个分区中,在系统启动后再挂接到根文件系统中的/usr目录下。里面存放的是共享、只读的程序和数据,这表明/usr目录下的内容可以在多个主机间共享,这些主要也符合FHS标准的。/usr中的文件应该是只读的,其他主机相关的,可变的文件应该保存在其他目录下,比如/var。/usr目录在嵌入式中可以精减。

9./proc目录
这是一个空目录,常作为proc文件系统的挂接点,proc文件系统是个虚拟的文件系统,它没有实际的存储设备,里面的目录,文件都是由内核临时生成的,用来表示系统的运行状态,也可以操作其中的文件控制系统。
10./mnt目录
用于临时挂载某个文件系统的挂接点,通常是空目录,也可以在里面创建一引起空的子目录,比如/mnt/cdram /mnt/hda1 。用来临时挂载光盘、移动存储设备等。
11. /tmp目录
用于存放临时文件,通常是空目录,一些需要生成临时文件的程序用到的/tmp目录下,所以/tmp目录必须存在并可以访问。

12、/var录
此目录存放一些可以改变的数据。
13、 /sbin 目录
此目录页用户存放一些可执行文件,但是此目录下的文件或者说命令只有管理员才能使用,主要用户系统管理。
14、 /sys 目录
系统启动以后此目录作为 sysfs 文件系统的挂载点, sysfs 是一个类似于 proc 文件系统的特殊文件系统, sysfs 也是基于 ram 的文件系统,也就是说它也没有实际的存储设备。此目录是系统设备管理的重要目录,此目录通过一定的组织结构向用户提供详细的内核数据结构信息。
15、 /opt
可选的文件、软件存放区,由用户选择将哪些文件或软件放到此目录中。

  • 制作嵌入式根文件系统一般用到的是BusyBox工具。
    上面已经讲过,根文件系统里面就是一堆的可执行文件和其他文件组成的?可以用busyBox来制作它。BusyBox!其名字分为“Busy”和“Box”,也就是忙碌的盒子。盒子是用来放东西的,忙碌的是因为它要提供根文件系统所需的文件,所以忙碌。BusyBox 是一个集成了大量的 Linux 命令和工具的软件,像 ls、 mv、 ifconfig 等命令 BusyBox 都会提供。BusyBox 就是一个大的工具箱,这个工具箱里面集成了 Linux 的许多工具和命令。使用它来制作根文件系统就容易多了,下面请看具体的制作步骤过程

一、根文件系统准备工作

1、软件准备

注意:所有的操作均在root用户下操作,请先将shell终端切换为root用户。
(1)可上网的ubuntu系统,这里我选择的是ubuntu16.04 64位系统,系统内部已经安装好交叉工具链接。 查找编译器安装路径的方法:编译名称 -v ;如下所示
在这里插入图片描述

(2)在ubuntu16.04中安装libncurses5-dev
在这里插入图片描述
(3)下载busybox
BusyBox 可以在其官网下载到,官网地址为: https://busybox.net/ 在官网左侧的“Get BusyBox”栏有一行“Download Source”,点击“Download Source”即

在这里插入图片描述
下拉到下面,下载最新的BusyBox,最新的版本是:busybox-1_34_0.tar.bz2 ,下载时要注意文件大小较大的才是完整的busybox。
在这里插入图片描述
文件:

2、硬件准备

(1)GEC6818开发板一套,开发板必须拥有完成的uboot与内核,且uboot能够正常加载内核与挂载rootfs。
在这里插入图片描述

二、根文件系统制作

1、解压BusyBox

首先先创建一个目录,用于存放制作生成的根文件系统,如我,在家目录里创建一个rootfs的目录,用于存放根文件系统。并要记住创建的rootfs路径。
在这里插入图片描述

将busybox-1_34_0.tar.bz2复制到家目录,并解压

在这里插入图片描述
解压完成以后进入到busybox-1_34_0目录中,此目录中的文件和文件夹如下图
在这里插入图片描述

2、修改Makefile

打开 busybox 的顶层 Makefile,添加 16行CROSS_COMPILE与190行ARCH的值如下
在这里插入图片描述
CROSS_COMPILE ?= /usr/local/arm/5.4.0/usr/bin/arm-none-linux-gnueabi- 表示交叉编译工具路径
ARCH ?= arm 表示编译平台架构

3、添加根文件系统中文支持

如果默认直接编译 busybox 的话,在使用 SecureCRT 的时候中文字符是显示不正常的,中文字
符会显示为“?”,由于busybox源码中对于大于7F的字符直接就输出了?,所以需要对源码做相应的修改
(1)打开printable_string.c ,修改代码如下
在这里插入图片描述
在这里插入图片描述
(1)打开unicode.c,修改代码如下
在这里插入图片描述
在这里插入图片描述

4、配置BusyBox

可使用BusyBox提供的图形化配置进行编程。打开图形化配置,图形页面如下
在这里插入图片描述
在这里插入图片描述
(1)不采用静态库编译,因为静态库编译的执行文件太大。
配置路径如下:

-> Settings
	-> Build static binary (no shared libs)

在这里插入图片描述
继续配置

-> Settings
	-> vi-style line editing commands

在这里插入图片描述

-> Linux Module Utilities
	-> Simplified modutils

在这里插入图片描述

-> Linux System Utilities
	-> mdev (17 kb)

在这里插入图片描述

-> Settings
	-> Support Unicode 
		-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables 

在这里插入图片描述

5、编译Busybox

配置好 busybox 以后就可以编译了,编译安装生成的文件指定到前面创建的rootfs目录下。编译与安装命令如下。

make
make install CONFIG_PREFIX=/home/gec/rootfs

安装后rootfs下面就生成了bin、 sbin、usr 以及 linuxrc 文件
在这里插入图片描述

6、添加目录与文件

6.1 添加目录

前面已经讲解过,一个嵌入式系统是拥有很多的目录的,这些目录可以制作根文件系统时创建。在rootfs目录下执行下面命令

mkdir dev etc lib proc mmt sys tmp root home usr 

在这里插入图片描述

6.2 lib添加库文件

Linux 中的应用程序一般都是需要动态库的,lib 库文件从交叉编译器中获取,不同的交叉编译器所在的库函数文件所在的路径略有不同。先进入库路径

root@ubuntu:~/busybox-1_34_0# cd /usr/local/arm/5.4.0/usr/arm-none-linux-gnueabi/sysroot/

新建一个脚本文件

root@ubuntu:/usr/local/arm/5.4.0/usr/arm-none-linux-gnueabi/sysroot# vi cp.sh 

添加以下内容

#!/bin/sh                                                                           
for file in libc libcrypt libdl libm libpthread libresolv libutil
do
sudo cp lib/$file*.so /home/gec/rootfs/lib
sudo cp -d lib/$file.so.* /home/gec/rootfs/lib
done
sudo cp -d lib/ld*.so* /home/gec/rootfs/lib
sudo cp -d usr/lib/libstdc++.so* /home/gec/rootfs/lib
sudo cp -d lib/libgcc_s* /home/gec/rootfs/lib
sudo cp -d lib/libnss*.so* /home/gec/rootfs/lib
sudo cp -d lib/librt* /home/gec/rootfs/lib                                               

执行文件拷贝

root@ubuntu:/usr/local/arm/5.4.0/usr/arm-none-linux-gnueabi/sysroot# source cp.sh 

脚本执行后,可在rootfs/lib看到库文件

在这里插入图片描述

6.3 创建/etc/init.d/rcS 文件及添加代码

rcS 是个 shell 脚本, Linux 内核启动以后需要启动一些服务,而 rcS 就是规定启动哪些文件
的脚本文件。在 rootfs/etc/先创建init.d,在rootfs/etc/init.d/再创建rcS(创建时rcS文件要给予执行权限 chmod 777 rcS),然后在 rcS 中输入如下所示内容:
创建rcS步骤

root@ubuntu:~/rootfs# ls
bin  dev  etc  home  lib  linuxrc  mmt  proc  root  sbin  sys  tmp  usr
root@ubuntu:~/rootfs# cd etc/
root@ubuntu:~/rootfs/etc# mkdir init.d
root@ubuntu:~/rootfs/etc# cd init.d/
root@ubuntu:~/rootfs/etc/init.d# touch rcS
root@ubuntu:~/rootfs/etc/init.d# chmod 777 rcS

rcS文件内容

#!/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH

mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts

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

第 1 行,表示这是一个 shell 脚本。
第 3 行, PATH 环境变量保存着可执行文件可能存在的目录,这样我们在执行一些命令或
者可执行文件的时候就不会提示找不到文件这样的错误。
第 4 行, LD_LIBRARY_PATH 环境变量保存着库文件所在的目录。
第 5 行,使用 export 来导出上面这些环境变量,相当于声明一些“全局变量”。
第 7 行,使用 mount 命令来挂载所有的文件系统,这些文件系统由文件/etc/fstab 来指定,
所以我们一会还要创建/etc/fstab 文件。
第 8 和 9 行,创建目录/dev/pts,然后将 devpts 挂载到/dev/pts 目录中。
第 11 和 12 行,使用 mdev 来管理热插拔设备,通过这两行, Linux 内核就可以在/dev 目录
下自动创建设备节点。

6.4 创建/etc/fstab 文件及添加代码

在 rootfs 中创建/etc/fstab 文件,并写入下面代码

#<file system> <mount point> <type> <options> <dump> <pass>
proc    /proc   proc    defaults        0       0                           
tmpfs   /tmp    tmpfs   defaults        0       0
sysfs   /sys    sysfs   defaults        0       0
#<file system> <mount point> <type> <options> <dump> <pass>

:要挂载的特殊的设备,也可以是块设备。
:挂载点。
:文件系统类型,比如ext3、 ext4、proc、 romfs、 tmpfs 等等。
:挂载选项,在 Ubuntu 中输入“man mount”命令可以查看具体的选项。一般使
用 defaults,也就是默认选项, defaults 包含了 rw、 suid、 dev、 exec、 auto、 nouser 和 async。
:为 1 的话表示允许备份,为 0 不备份,一般不备份,因此设置为 0。
:磁盘检查设置,为 0 表示不检查。根目录‘/’设置为 1,其他的都不能设置为 1,其他的分区从 2 开始。

6.5 创建/etc/inittab 文件及添加代码

在rootfs/etc目录下创建inittab文件,并添加下面文件

# 系统启动时
::sysinit:/etc/init.d/rcS

# 系统启动按下Enter键时
::askfirst:-/bin/sh

# 按下Ctrl+Alt+Del键时
::ctrlaltdel:/sbin/reboot

# 系统关机时
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r

# 系统重启时
::restart:/sbin/init

6.6 创建/etc/profile 文件及添加代码

/etc/profile文件作用是设置环境变量,每个用户登录时都会运行它。在rootfs/etc目录创建profile文件,并添加下面代码:

# 主机名
export HOSTNAME=GEC6818

# 用户名
export USER=root

# 用户目录
export HOME=/root

# 终端默认提示符
export PS1="[$USER@$HOSTNAME:\$PWD]\# "  

7、生成镜像文件

首先要在uboot阶段查看需要挂载的根文件系统类型,如下图,通过图得知,支持的是ext4文件格式
在这里插入图片描述
生成ext4格式命令

root@ubuntu:~# cd /home/gec/
root@ubuntu:~# sudo make_ext4fs -l 200m rootfs-6818.ext4 rootfs

200m:表示生成的镜像大小,一般根据比rootfs大小要大即可。

在这里插入图片描述

三、验证

1、根文件系统烧录

将制作好的根文件系统烧录到开发板,可使用fastboot.exe进行烧录,烧录命令如下,具体烧录过程省略

fastboot flash system rootfs-6818.ext4

2、编写程序,编译程序

test.c代码如下:

#include <stdio.h>
#include <unistd.h>

int main(void)
{
	
	while(1)
	{
		printf("This is test program\n");
		printf("这是一个测试的程序\n");
		sleep(1);
	}
	
}

交叉编译程序,并用rx命令下载到开发板

root@ubuntu:/mnt/hgfs/share# arm-linux-gcc test.c -o test

CRT终端下载可执行文件,并修改文件权限

[root@GEC6818:/]# rx test
CC
 xmodem trl+C ȡ

  100%       5 KB    5 KB/s 00:00:01       0 Errors

[root@GEC6818:/]# chmod 777 test

3、设置CRT编码格式,运行程序

设置CRT编码格式
在这里插入图片描述
运行可支行程序
在这里插入图片描述
APP程序跑起来了,说明制作的根文件系统已经成功了。后面可以根据自己的需求壮大自己的文件系统。
就写到这里了,给博主点点关注。

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C是最好的编程语言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值