驱动开发(2)-文件系统移植

嵌入式驱动开发

基于topeet imx6ull

根文件系统的构建

  • 根文件系统是一个可以运行的最小文件系统[^文件系统]。

    文件系统: linux文件系统中的文件包括数据和文件的结构,用户和程序能接触到的信息都在里面

  • 跟文件系统:内核驱动时候所挂载(mount)的第一个文件系统,之后会把一些初始化脚本和服务加载到内存中去运行

在这里插入图片描述

名称功能
/bin系统存放可执行文件的目录,在/bin目录下面可以被root和一般用户使用
/dev外部设备的文件夹,操作这个文件夹相当于操作对应文件
/etc主要配置文件
/lib存放着linux需要的库文件
/mnt临时挂在目录
/opt第三方软件放置的目录
/proc一个虚拟文件系统,存放的数据都在内存中,比如系统核心,状态等
/usr系统默认的软件下载地点
/sbinroot的软件库
/var存放一些可以改变的数据
/sys核心与系统硬件相关的信息

busybox

一款构建根目录的文件
操作方法menuconfig

  • 修改makefile文件

    • 164行改为你的路径
      CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-

    • 190 改为arm

      ARCH ?= arm

  • 编译安装

    • $ make -j4
    • $ make install

在这里插入图片描述

构建根文件系统

编译完成busybox之后,需要向根文件目录里面添加需要的文件

$ mkdir + name

包括以下目录:dev、etc、lib、mnt、proc、root、sys、tmp

在这里插入图片描述

之后需要往对应的文件夹里面添加对应的文件

  • /lib

    • linux程序一般都是需要动态库的,所以向lib里面添加动态库

    • lib库从交叉编译器里面获取

      • $ cd/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib/

      • $ cp *so* *.a /home/taqiyya/2021/busybox/busybox-1.29.0/rootfs/lib/ -d

        • 第一行进入了对应的路径
        • 第二行是把东西复制到文件夹里面
      • ld-linux-armhf.so.3在跟文件系统里面不能作为符号链接文件,需要修改为普通文件库

        • $ cd ~/2021/busybox/busybox-1.29.0/rootfs/lib/

          进入库

          $ rm 2021/busybox/busybox-1.29.0/rootfs/lib/ld-linux-armhf.so.3

          移除目标文件

          $ cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib

          回到这个库

          $ cp ld-linux-armhf.so.3 ~/2021/busybox/busybox-1.29.0/rootfs/lib/

          复制文件

    • 继续复制

      • $ cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib
      • $ cp *so* *.a /home/taqiyya/2021/busybox/busybox-1.29.0/rootfs/lib/ -d
  • 向/usr/lib目录里面添加文件

    • $ cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib
    • $ cp *so* *.a /home/taqiyya/2021/busybox/busybox-1.29.0/rootfs/usr/lib -d

添加必要文件

  • 添加/etc/init.d/rcS

    • 创建文件,在rootfs目录下
      $ mkdir -p etc/init.d/
      $ cd etc/init.d/
      $ vim 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
      `
      
    • 文件内容

      • 表示他语言
      • 可执行文件可能存在的目录,库文件的目录
      • 添加变量
      • mount 挂载所有的文件系统,这些文件系统由文件/etc/fsab/指定,所以还要创建对应文件
      • 后将devpts 挂载到/dev/pts 目录中
      • 使用mdev 来管理热插拔设备,通过这两行,Linux 内核就可以在/dev 目录下自动
        创建设备节点。
    • 给文件权限

      $ chmod 777 rcS

  • 创建/etc/fstab文件

    • fstab文件是在linux开机以后自动配置那些需要自动挂载的分区

      • 语法格式

        • :要挂载的特殊的设备,也可以是块设备,比如/dev/sda 等等。
          :挂载点必须为当期已经存在的目录。
          :文件系统类型,比如ext2、ext3、proc、romfs、tmpfs 等等。
          :挂载选项,用于设置挂载参数,一般使用defaults,也就是默认选项。
          defaults:rw, suid, dev, exec, auto, nouser, and async。
          auto:系统自动挂载。fstab 默认就是这个选项。
          noauto :开机不自动挂载。
          nouser:只有超级用户可以挂载。

          			   ro:按只读权限挂载。
          				 rw:按可读可写权限挂载。
          				 user:任何用户都可以挂载。
          

          :为1 的话表示允许备份,为0 不备份,一般不备份,因此设置为0。
          :磁盘检查设置,为0 表示不检查。根目录‘/’设置为1,其他的都不能设置为1,其他的分
          区从2 开始。一般不在fstab 中挂载根目录,因此这里一般设置为0。

      • 创建文件

        • $ cd etc/
        • $ vim fstab
      • 文件内容

        # /etc/fstab: static file system information.
        #
        # Use 'vol_id --uuid' to print the universally unique identifier for a
        # device; this may be used with UUID= as a more robust way to name devices
        # that works even if disks are added and removed. See fstab(5).
        #
        # <file system> <mount point> <type> <options> <dump> <pass>
        proc /proc proc defaults 0 0
        sysfs /sys sysfs defaults 0 0
        tmpfs /tmp tmpfs defaults 0 0
        
  • 创建/etcinittab

    • inittab 的详细内容可以参考busybox 下的文件examples/inittab。init 程序会读取/etc/inittab 这个文件,
      inittab 由若干条指令组成。每条指令的结构都是一样的,由以“:”分隔的4 个段组成,

    <id>:<runlevels>:<action>:<process>

    • 标记意义
      登记项标识符,最多四个字符
      动作关键字。用于指定init(M)命令或进程对相应进程实施的动作
      所要执行的shell 命令.任何合法的shell 语法均适用于该字段
    • action包括

    在这里插入图片描述

    • 创建一个文件/etc/inittab

      • $ cd etc
      • $ vim inittab
      • 文件内容
      ::sysinit:/etc/init.d/rcS
      console::askfirst:-/bin/sh
      ::restart:/sbin/init
      ::ctrlaltdel:/sbin/reboot
      ::shutdown:/bin/umount -a -r
      ::shutdown:/sbin/swapoff -a
      
      
      • 注解
        • 系统启动以后运行脚本
        • 将console作为控制台
        • 重启时候运行:/sbin/init
        • 按下ctrl+alt+del 组合键的话就运行/sbin/reboot,看来ctrl+alt+del 组合键用于重启系统
        • 关机的时候执行/bin/umount,也就是卸载各个文件系统。
        • 关机的时候执行/sbin/swapoff,也就是关闭交换分区。

生成文件系统镜像

$ sudo tar jcvf rootfs.tar.bz2 bin dev etc lib linuxrc mnt proc root sbin sys tmp usr

压缩命令,把文件压缩,通过filezilla更换掉Mfgtool2对应的文件,然后烧录即可

结果图

在这里插入图片描述

经验

  • 基本上一次成
  • 把rcS打错了,然后用securecrt的时候报错说找不到文件,然后发现文件名错了,重命名之后重新压缩一下就好了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值