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 命令打开图形化配置界面:

             

           依次配置 buildroot,配置完就可以进行编译了 
    (1)、配置 Target options :进入后显示如下界面,我们选择第一项,进入后选择图片2中选项,选择后跳出图片3,把图3全部选项改成如下样式。

          

     (2)、配置 Toolchain :配置交叉编译工具链,它可以自动下载,但是速度慢,可在output/host下看到适配的编译器。选中用空格键,配置内容如下:

     如果使用开发板厂家提供的交叉编译器,那路径即是我们拷贝时的目录。(此时如果网络正常连接即可下载)

     也可选择buildroot自带的编译器:如下第一行我们选择buildroot toolchain,其余选项如果配置界面已经默认选中了则不要去除,另外在原基础上同样添加下面介绍的,如下:

      

      

     (3)、配置 System configuration :一些系统配置,如开发板名字、欢迎语、用户名、密码等。配置内容如下:

        

    (4)、配置 Filesystem images :配置最终制作的根文件系统为什么格式的。配置内容如下:

       

     (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 目录,命令如下: 

        

    setenv bootargs 'console=tty1 console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.253:/home/zuozhongkai/linux/nfs/buildrootfs rw ip=192.168.1.251:192.168.1.253:192.168.1.1:255.255.255.0::eth0:off'
        设置好后启动系统:如下:
          

         如图可知,进入/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-1.29.0/libbb/unicode.c,修改如下内容:
               

         还需要配置 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 脚本,可在最后添加自启动相关内容。如下:

     

 

 

 

   

 

 

 

     

          

 

                

 

posted @ 2023-06-24 22:30  耿通宇  阅读(2691)  评论(0编辑  收藏  举报