鼎点娱乐

你的位置: 鼎点娱乐 > 关于鼎点娱乐 >
关于鼎点娱乐
Linux系统下rootfs根文件系统制作及挂载方法
发布日期:2024-10-14 09:44    点击次数:71

根文件系统构建好以后就意味着我们已经拥有了一个完整的、可以运行的最小系统。以后我们就在这个最小系统上编写、测试 Linux 驱动,移植一些第三方组件,逐步的完善这个最小系统。最终得到一个功能完善、驱动齐全、相对完善的操作系统。

1. 根文件系统简介

根文件系统一般也叫做 rootfs,那么什么叫根文件系统?看到“文件系统”这四个字,很多人,包括我第一反应就是 FATFS、 FAT、 EXT4、 YAFFS 和 NTFS 等这样的文件系统。在这里,根文件系统并不是 FATFS 这样的文件系统代码, EXT4 这样的文件系统代码属于 Linux 内核的一部分。 Linux 中的根文件系统更像是一个文件夹或者叫做目录(在我看来就是一个文件夹,只不过是特殊的文件夹),在这个目录里面会有很多的子目录。根目录下和子目录中会有很多的文件,这些文件是 Linux 运行所必须的,比如库、常用的软件和命令、设备文件、配置文件等等。以后我们说到文件系统,如果不特别指明,统一表示根文件系统。对于根文件系统专业的解释,百度百科上是这么说的。

根文件系统首先是内核启动时所 mount(挂载)的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。

百度百科上说内核代码镜像文件保存在根文件系统中,但是我们嵌入式 Linux 并没有将内核代码镜像保存在根文件系统中,而是保存到了其他地方。比如 NAND Flash 的指定存储地址、EMMC 专用分区中。 根文件系统是 Linux 内核启动以后挂载(mount)的第一个文件系统,然后从根文件系统中读取初始化脚本,比如 rcS, inittab 等。根文件系统和 Linux 内核是分开的,单独的 Linux 内核是没法正常工作的,必须要搭配根文件系统。如果不提供根文件系统, Linux 内核在启动的时候就会提示内核崩溃(Kernel panic)的提示。

根文件系统的这个“根”字就说明了这个文件系统的重要性,它是其他文件系统的根,没有这个“根”,其他的文件系统或者软件就别想工作。比如我们常用的 ls、 mv、 ifconfig 等命令其实就是一个个小软件,只是这些软件没有图形界面,而且需要输入命令来运行。这些小软件就保存在根文件系统中,这些小软件是怎么来的呢?这个就是我们本章教程的目的,教大家来构建自己的根文件系统,这个根文件系统是满足 Linux 运行的最小根文件系统,后续我们可以根据自己的实际工作需求不断的去填充这个最小根文件系统,最终使其成为一个相对完善的根文件系统。

根文件系统的选择和配置对于操作系统的性能、功能和可靠性都具有重要影响。不同的应用场景和需求可能需要定制化的根文件系统,以满足特定的要求。因此,根文件系统的设计和管理是操作系统开发和系统管理的重要方面之一。

2. 根文件系统构建软件

构建根文件系统常用的软件有三种,分别是busybox,buildroot,yocto。 busybox 仅仅只是帮我们构建好了一些常用的命令和文件,像 lib 库、/etc 目录下的一些文件都需要我们自己手动创建,而且 busybox 构建的根文件系统默认没有用户名和密码设置。在后续的实验中,我们还要自己去移植一些第三方软件和库,比如 alsa、iperf、mplayer 等等。那么有没有一种傻瓜式的方法或软件,它不仅包含了 busybox 的功能,而且里面还集成了各种软件,需要什么软件就选择什么软件,不需要我们去移植。答案肯定是有的,buildroot 就是这样一种工具,buildroot比 busybox 更上一层楼,buildroot 不仅集成了 busybox,而且还集成了各种常见的第三方库和软件,需要什么就选择什么,就跟我们去吃自助餐一样,想吃什么就拿什么。buildroot 极大的方便了我们嵌入式 Linux 开发人员构建实用的根文件系统。

从 busybox 开始一步一步的构建根文件系统适合学习、了解根文件系统的组成,但是不适合做产品(主要是自己构建的话会有很多不完善、没有注意到的细节)。buildroot 会帮我们处理好各种细节,根文件系统也会更加的合理、有效。因此在做产品的时候推荐大家使用 buildroot 来构建自己的根文件系统,当然了,类似 buildroot 的软件还有很多,比如后面要讲的 yocto。

buildroot 和 uboot、Linux Kernel 很类似,我们需要到其官网上下载源码,然后对其进行配置,比如设置交叉编译器、设置目标 CPU 参数等,最主要的就是选择所需要的第三方库或软件。一切配置好以后就可以进行编译,编译完成了以后就会在一个文件夹里面存放好编译结果,也就是根文件系统。

3. busybox构建根文件系统3.1 BusyBox 简介

其名字分为“Busy”和“Box”,也就是忙碌的盒子。盒子是用来放东西的,忙碌的是因为它要提供根文件系统所需的文件,所以忙碌。 BusyBox 是一个集成了大量的 Linux 命令和工具的软件,像 ls、 mv、 ifconfig 等命令 BusyBox 都会提供。 BusyBox 就是一个大的工具箱,这个工具箱里面集成了 Linux 的许多工具和命令。一般下载 BusyBox 的源码,然后配置 BusyBox,选择自己想要的功能,最后编译即可。

BusyBox 官网下载地址为:

https://busybox.net/

登录官网我们可以看到,界面非常的简洁:

图片

在官网左侧的“Get BusyBox”栏有一行“Download Source”,点击“Download Source”即可打开 BusyBox 的下载页,如下所示:

图片

从上面可以看出,目前最新的 BusyBox 版本是 1.36.1,不过本次不考虑使用最新的版本进行构建,选择一个比较新的就行,本次选择的是 busybox-1.32.0.tar.bz2。 BusyBox 下载好以后我们就开始构建根文件系统了。

3.2 编译 BusyBox 构建根文件系统

busybox的编译构建过程:

使用make menuconfig构建出图形配置界面。

通过配置图形配置界面的选项配置busybox的安装路径、编译工具、命令功能使能等。生成.config配置文件

使用make编译busybox

使用make install命令安装由busybox生成的根文件系统

完善根文件系统

使用和测试根文件系统

1.创建文件夹保存根文件系统

mkdir rootfs

2.解压BusyBox压缩包到rootfs目录

tar -jxvf busybox-1.32.0.tar.bz2

3.修改 Makefile,添加编译器

# Cross compiling and selecting different set of gcc/bin-utils
# ---------------------------------------------------------------------------
#
# When performing cross compilation for other architectures ARCH shall be set
# to the target architecture. (See arch/* for the possibilities).
# ARCH can be set during invocation of make:
# make ARCH=ia64
# Another way is to have ARCH set in the environment.
# The default ARCH is the host where make is executed.

# CROSS_COMPILE specify the prefix used for all executables used
# during compilation. Only gcc and related bin-utils executables
# are prefixed with $(CROSS_COMPILE).
# CROSS_COMPILE can be set on the command line
# make CROSS_COMPILE=ia64-linux-
# Alternatively CROSS_COMPILE can be set in the environment.
# Default value for CROSS_COMPILE is not to prefix executables
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile

CROSS_COMPILE ?= arm-linux-gnueabihf-
# bbox: we may have CONFIG_CROSS_COMPILER_PREFIX in .config,
# and it has not been included yet... thus using an awkward syntax.
ifeq ($(CROSS_COMPILE),)
CROSS_COMPILE := $(shell grep ^CONFIG_CROSS_COMPILER_PREFIX .config 2>/dev/null)
CROSS_COMPILE := $(subst CONFIG_CROSS_COMPILER_PREFIX=,,$(CROSS_COMPILE))
CROSS_COMPILE := $(subst ",,$(CROSS_COMPILE))
#")
endif

# SUBARCH tells the usermode build what the underlying arch is.  That is set
# first, and if a usermode build is happening, the "ARCH=um" on the command
# line overrides the setting of ARCH below.  If a native build is happening,
# then ARCH is assigned, getting whatever value it gets normally, and
# SUBARCH is subsequently ignored.

ifneq ($(CROSS_COMPILE),)
SUBARCH := $(shell echo $(CROSS_COMPILE) | cut -d- -f1 | sed 's:^.*/::g')
else
SUBARCH := $(shell uname -m)
endif
SUBARCH := $(shell echo $(SUBARCH) | sed -e s/i.86/i386/ -e s/sun4u/sparc64/    -e s/arm.*/arm/ -e s/sa110/arm/    -e s/s390x/s390/ -e s/parisc64/parisc/    -e s/ppc.*/powerpc/ -e s/mips.*/mips/ )

ARCH ?= arm

修改“CROSS_COMPILE ?=”和“ARCH ?= arm”这两行内容,修改如上代码。

3.3 busybox中文字符支持

使用 busybox 默认配置直接编译的话,使用 SecureCRT 的时候中文字符是显示不正常的,中文字符会显示为“?”,比如你的中文目录,中文文件都显示为“?”。这是因为 busybox 中的 shell 命令对中文输入即显示做了限制,所以我们需要对 busybox 源码进行修改,取消 busybox 对中文显示的限制,下面我们来一步步修改busybox使其支持中文。

3.3.1 修改printable_string2函数

打开文件 busybox-1.32.0/libbb/printable_string.c,找到函数 printable_string2,函数具体内容如下:

const char* FAST_FUNC printable_string2(uni_stat_t *stats, const char *str)
{
 char *dst;
 const char *s;

 s = str;
 while (1) {
  unsigned char c = *s;
  if (c == '\0') {
   /* 99+% of inputs do not need conversion */
   if (stats) {
 stats->byte_count = (s - str);
 stats->unicode_count = (s - str);
 stats->unicode_width = (s - str);
   }
   return str;
  }
  if (c < ' ')
   break;
  if (c >= 0x7f)
   break;
  s++;
 }

#if ENABLE_UNICODE_SUPPORT
 dst = unicode_conv_to_printable(stats, str);
#else
 {
  char *d = dst = xstrdup(str);
  while (1) {
   unsigned char c = *d;
   if (c == '\0')
 break;
   if (c < ' '