linux——根文件系统
笔者买的正点原子开发板学习,因此文档很多来源正点原子,著作权归正点原子,如有侵权请告知。
一、根文件系统
1、简介:是 Linux 系统中所有其他文件系统和目录的起源。在 Linux 中,所有文件、目录、设备和驱动都被组织为一个树型结构,根文件系统就是这个结构的根节点,也是引导过程中启动并加载内核所需的起点。
根文件系统是嵌入式系统的关键组成部分,它包含了操作系统运行所需的所有基本文件和数据,能够使操作系统顺利地启动和运行,并且提供文件系统的访问和管理功能。它还包含了驱动程序、系统库文件以及其他与系统运行和管理有关的数据。
一般来讲,嵌入式系统中根文件系统占用内存空间较小,通常采用压缩的文件系统(如 ext2、ext3 或 ext4 文件系统)来进行存储。
2、组成:
(1)、核心组件:包括构建根文件系统所需的基本软件包、系统库、编译器、Shell 等。它们提供系统的基本功能,如文件管理、网络访问、进程管理、设备管理等。
(2)、标准目录结构:按照 Linux 标准文件系统层次结构规范的目录结构,包括 /bin、/sbin、/usr、/etc、/proc 等目录。存放了系统关键部件的信息、配置、库和命令。
(3)、设备驱动:各种硬件的驱动程序和相应的内核模块,如串口驱动、网卡驱动、LCD 屏驱动等,这些驱动程序能够使得 Linux 能够正确地访问和协调各种硬件设备。
(4)、网络工具和协议:如 SSH、Telnet、FTP、HTTP、DHCP、DNS 等,这些工具和协议提供了系统连接其他网络设备、数据交换和网络管理的能力。
(5)、调试工具:如 gdb、strace、top 等,这些工具能够帮助开发者定位和解决系统中的各种问题和异常。
二、根文件系统目录详解
1、bin: 里面是一些可执行文件,比如 ls 、cd 等各种命令都在里面,所有客户都能使用。
2、dev: 设备相关(硬件设备),如:/dev/ttymxc0 表示串口0,我们通过串口0收发数据就是读写文件/dev/ttymxc0 。
3、etc: 存放各种配置文件。ubuntu下很多,嵌入式linux设备下很少。
4、lib:存放着 Linux 所必须的库文件,是共享库,一些命令和用户编写的程序会使用这些库。
5、mnt: 临时挂载目录,空目录,可创建空的子目录(如/mnt/sd、/mnt/usb)方便管理挂载的SD /U盘等设备。
6、proc:空的,系统启动后将此目录作为 proc 文件系统的挂载点,是个虚拟文件系统,无实际存储,一般是系统运行信息文件。
7、usr: 不是user,是软件资源目录,存放软件,一般系统安装完成后此目录占用空间最大。
8、var: 存放一些可改变的数据。
9、sbin: 可执行文件,但此目录下的文件或命令只有管理员能使用,主要是用户系统管理。
10、sys:系统启动后作为 sysfs 文件系统的挂载点,类似 proc 文件系统的基于ramde 特殊文件系统,无实际存储,是系统设备管理的重要目录,通过一定的组织结构向用户提供详细的内核数据结构信息。
11、opt: 可选的文件、软件存放区,由用户选择将哪些文件或软件放到此目录中。
三、buildroot
1、简介:Buildroot用来构建嵌入式系统所需各种组件和软件包:内核、库、根文件系统、驱动程序、应用程序和各种工具。与 uboot、Linux Kernel 类似,需配置,如交叉编译器、目标 CPU 参数等,最主要的是选择所需第三方库或软件。编译完成后会在一个文件夹里面存放好编译结果,即根文件系统,生成一个完整的Linux系统镜像。
2、特点:支持多种文件系统格式:SquashFS、JFFS2、UBIFS等
3、优点:
● 灵活性:可自定义构建流程和组件。
● 简化开发过程:可构建各种不同的嵌入式系统,避免重复工作。
● 节省存储空间:可选择组件和软件包,因此可节省存储空间。
● 支持多种体系结构和处理器架构:如:ARM、MIPS、x86等。
4、官方网站https://buildroot.org/ 源代码(Github):https://github.com/buildroot/buildroot
5、构建根文件系统:
将下载的源码拷贝到ubuntu自己创建的home/linux/tool目录中并解压(tar -xzvf +压缩文件),输入make menuconfig 命令打开图形化配置界面:
(2)、配置 Toolchain :配置交叉编译工具链,它可以自动下载,但是速度慢,可在output/host下看到适配的编译器。选中用空格键,配置内容如下:
如果使用开发板厂家提供的交叉编译器,那路径即是我们拷贝时的目录。(此时如果网络正常连接即可下载)
也可选择buildroot自带的编译器:如下第一行我们选择buildroot toolchain,其余选项如果配置界面已经默认选中了则不要去除,另外在原基础上同样添加下面介绍的,如下:
(3)、配置 System configuration :一些系统配置,如开发板名字、欢迎语、用户名、密码等。配置内容如下:
(5)、禁止编译 Linux 内核和 uboot:它也可以编译 linux 内核和 uboot,使能后会自动去下载,新下载的不适用,因此禁止编译。配置内容如下:
(6)、配置 Target packages:配置第三方库或软件、如 alsa-utils、ffmpeg、iperf 等工具,先不选择第三方库,防止编译出错,先编译基本的没问题再重新配置。
(7)、编译 buildroot:配置完成就可以编译了,完成后会生成根文件系统压缩包,可直接使用。输入如下命令开始编译:
编译时会先从网上下载所需软件源码,有些软件源码可能下载不下来,此时需自行处理,后面会详解。 编译过程很耗时,可能需要几个小时。
可自行到 https://cmake.org/files/v3.8/cmake-3.8.2.tar.gz 下载源码,拷贝到Ubuntu 中 buildroot 源码目录下的 dl 文件夹(存放下载的源码)中。
等待编译完成,编译完成以后就会在 output/images 下生成根文件系统。会有多种格式rootfs,如: ext2、ext4、ubi 等。其中rootfs.tar 就是打包好的根文件系统,我们就使用 rootfs.tar 进行测试。
(8)、根文件系统测试:将rootfs.tar解压出来通过 nfs 挂载到开发板,启动 uboot,修改 bootargs 环境变量,设置 nfsroot 目录为 Ubuntu 中的 buildrootfs 目录,命令如下:
如图可知,进入/lib/modules 目录时没有,因此需创建此目录,根文件系统启动会输出欢迎语“Welcome to alphai.mx6ull”。输入用户名(“root”)和密码(“123456”)进入系统。
如图可知运行没有问题,但这个根文件系统是最简单的,还没有在 buildroot 里面配置任何第三方的库和软件,接下来就配置 buildroot,使能一些常见的第三方软件。
(9)、buildroot 第三方软件和库的配置 :前面说要移植第三方库和软件,如 alsa-lib、alsa-utils 等,现在不需要移植了,可直接在 buildroot 里面配置使能。比如现在配置使能 alsa-lib、alsa-utils 这两个软件和库:
①、使能 alsa-lib:打开 buildroot 配置界面,配置路径如下:配置好如右图:
②、使能 alsa-utils:配置好如右图:
编译完成就可以使用新的根文件系统进行测试了,将 buildroot/images/rootfs.tar 拷贝到 nfs 目录下的 buildroot 目录中,然后重新解压。注意,以前自己添加的文件并不会被删除掉的,
自行移植第三方库和软件过程很复杂。通过 buildroot 的话直接一个配置就可以搞定全部,可以自行尝试去配置使能一些其他的第三方库和软件。
(10)、buildroot 下的 busybox 配置:buildroot 构建根文件系统时要用到 busybox ,那么就涉及 busybox 的配置。buildroot 自动下载 busybox 压缩包在/dl 下,解压后在/output/build /output/build/busybox-1.29.3 下。
在 buildroot下打开 busybox 的配置界面输入命令:sudo make busybox-menuconfig 打开后如下:
①、busybox 中文字符的支持:busybox 对中文字符显示做了限制,须修改相关源代码。打开 busybox-1.29.0/libbb/printable_string.c,找到函数 printable_string 如下:
还需要配置 busybox来使能 unicode 码,配置 busybox 的时候再设置。
②、编译 busybox:配置好后重新编译 buildroot 下的 busybox,进入到 buildroot 源码目录下,输入sudo make show-targets 查看当前 buildroot 所有配置了的目标软件包,也就是 packages:
其中包括 busybox,如果想单独编译并安装 busybox 执行 sudo make busybox 编译完后重新编译 buildroot,主要是对其进行打包,命令:sudo make
重新编译完后查 output/images 下 rootfs.tar 的时间会刷新,失败可重新执行“sudo make” ,最后我们使用新的 rootfs.tar 启动 Linux 系统。
(11)、根文件系统测试 :测试发现输入命令时显示“#”,并且不会显示多级路径:需要设置“PS1”环境变量,PS1 用于设置命令提示符格式,如下:
上述代码将命令提示符设置了固定的“#”,我们将其屏蔽掉,然后输入如下所示内容:
设置好后/etc/profile 文件内容如下:重启开发板再输入如下图2所示:
6、根文件系统打包(有的开发板烧录时指定文件格式,这个时候就需要打包):
(1)、简介:system.cramfs 是一个文件系统镜像格式,常用于嵌入式系统中。它基于CRAM(Compressed RAM)技术,通过压缩和解压缩文件数据来减小镜像的大小,从而节省存储空间和加快读取速度。
(2)、特点:
● 高效的压缩:减小文件大小。压缩后的文件数据被存储在镜像中。
● 只读文件系统:只读,通常用于存储不需要修改的静态数据,如系统文件、配置文件和资源文件等。
● 快速访问速度:由于被压缩,读取数据时可以减少磁盘 I/O 操作,提高访问速度。
在一些新的嵌入式系统中已被更先进的文件系统(如SquashFS、UBIFS)所取代。
(3)、打包步骤:
● 安装工具:sudo apt-get install cramfsprogs
● mkcramfs <目录路径> <输出镜像文件路径> 如:mkcramfs /home/user/myfiles system.cramfs (生成在当前目录)
四、运行编写的程序
1、简介: 我们使用 Linux 的目的是运行我们的软件,我们编译的应用软件一般都使用动态库,体积就很小,但是得提供库文件,库文件我们已经添加到了根文件系统中。
2、运行步骤:使用交叉编译器编译一个简单的.c程序。file + 文件名 查看文件类型是不是ARM。拷贝到根文件系统下创建的“drivers”文件夹下。在开发板执行命令来运行:cd /drivers ./hello 执行hello程序。
hello执行时终端不能用,需要让 hello 进入后台运行,运行软件时加上“&”即可,如:“./hello &”,可使用“kill -9 pid(进程 ID)”命令来关掉,首先使用“ps”查看要关闭的软件 PID 是多少:如:kill -9 166 再ps 查看发现没有 hello 了。
3、如何开机自启动:前面说进入根文件系统时会运行/etc/init.d/rcS 这个 shell 脚本,可在最后添加自启动相关内容。如下: