04.嵌入式Linux文件系统

1.文件系统的一般定义是

负责管理和存储文件信息的软件系统

2.文件系统的功能

1.负责存储器中文件的组织和分配
2.提高对存储器资源的利用效率
3.将文件的存取、共享、和保护等功能提供给操作系统和用户
4.简化用户对文件的各项操作
5.保证在多用户环境下文件的安全性和一致性

文件系统是操作系统的重要组成部分,是实现文件多元化管理的必要条件。

3.虚拟文件系统

      为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统--VFS(Virtual File System), 为各类文件系统提供统一的操作界面和应用编程接口。

VFS并不是一种实际的文件系统, 它是物理文件系统与服务之间的一个接口层
VFS只存在于内存中, 不存在于任何外存空间
VFS在系统启动时建立, 在系统关闭时消亡

4.Linux根文件系统标准目录

04.嵌入式Linux文件系统_第1张图片
QQ截图20181024111933.png

5.使用busybox制作跟文件系统

0.准备工具
      0.0. busybox-1.29.3:或选用其他版本的 busybox,大同小异
      0.1. 下载地址:http://www.busybox.net/
      0.2. 交叉编译器安装:sudo apt-get install gcc-arm-linux-gnueabihf
1.构建目录结构
    1.0. 创建根文件系统目录,主要包括以下目录:
        /dev /etc /lib /usr /var /proc /tmp /home /root /mnt /bin
        /sbin /opt /sys /media
    1.1. 命令:
        mkdir $HOME/rootfs
        cd $HOME/rootfs
        mkdir dev etc lib usr var proc tmp home root mnt bin sbin opt sys media
    *rootfs目录位置可根据自己实际需求放置,只要保证路径中国无中文字符与特殊字符即可*
2.使用busybox构建 /bin /sbin linuxrc
  2.1. 解压busybox
         tar -jxvf busybox-x.xx.x.tar.bz2
         cd busybox-x.xx.x/
  2.2. 使用busybox的默认配置 
         make defconfig
        *使用默认配置 busybox,大部分的命令都会被选中*
      make menuconfig
      *如果此过程中出错多半是因为加载库文件失败导致,  使用命令sudo apt-get install libncurses5-dev 安装ncurses5即可*
      进入Settings  ---> 找到 ---Build Options 
      选中Build static binary (no shared libs)
      选中Cross compiler prefix,设置交叉编译前缀为 arm-linux-gnueabihf-
      向下滑动找到 ---Library Tuning
      选中Username completion
      选中Fancy shell prompts
      选中Query cursor position from terminal
      按左右键选中Exit退出到最后一层,选择Save Configuration to an Alternate File保存
      最后选择Exit退出界面
  2.3.make
  2.4.make install
  2.5.完成在 busybox 目录下会看见  _install 目录,里面有 bin sbin usr linuxrc 四个文件与目录,
      将这三个目录或文件拷到第 1 步所建的 rootfs 文件夹下,
      命令:cp bin sbin usr linuxrc $HOME/rootfs  -rfav
      *-a 的参数必不可少,因为 bin sbin 里面的命令大多是到 busybox 的动态链接,
      如果不加-a 则拷贝过程中会自动将每个命令复制一份*
**************************************************************************
*          到这里就实现了跟文件系统的基本工作,文件系统就可以正常使用了           *
**************************************************************************
3.构建 /lib 目录
      进入 /usr/arm-linux-gnueabihf/lib/ 目录,将以下动态库拷贝到$HOME/rootfs/lib 下
      命令:cp *so* $HOME/rootfs/lib -av
4.构建 /etc 目录
  4.1./etc 目录下最重要的四个文件
      inittab:用来作为 linuxrc 的配置脚本。
      init.d/rcS:inittab 启动的第一个脚本,一般用来挂载系统必需的文件系统,必要的设备连接,设置 IP 地址,启动其他脚本等。默认仅有 mount –a
      fstab:执行 mount –a 时,按照此文件挂载文件系统。
      profile:登陆完 shell 后自动执行此脚本,一般用来配置用户的登录环境。
  4.2.进入根文件系统 rootfs 的 etc 目录,执行如下操作:
      拷贝 Busybox 目录下 examples/bootfloopy/etc/ 下的所有文件到当前目录下,以此为模板构建我们的根文件系统。
      命令:cd $HOME/rootfs/etc
                 cp -rv ../../busybox-1.29.3/examples/bootfloppy/etc/ * .
  4.3.修改 inittab
      inittab 的作用及格式请参考其他说明
      删除第三行代码:tty2::askfirst:-/bin/sh
      命令:vi inittab
      将第三行删除或者在本行最前面加一个#将其注释
  4.4.修改 init.d/rcS 文件
      init 进程通过 inittab 启动的第一个进程为此脚本,我们需要做以下修改:
      命令:vi init.d/rcS 或 gedit init.d/rcS 
      将下列信息覆盖到打开的文件中
            #! /bin/sh
            
            #1.根据 fstab 配置文件挂载相应的文件系统
            /bin/mount -a
            
            #2.配置 telnetd 服务器的时候需要以下文件夹及文件系统
            /bin/mkdir -p /dev/pts
            /bin/mkdir -p /dev/shm
            /bin/mount -t devpts devpts /dev/pts
            /bin/mount -t tmpfs tmpfs /dev/shm
            
            #3.启动需要以下文件夹
            /bin/mkdir /var/tmp
            /bin/mkdir /var/modules
            /bin/mkdir /var/run
            /bin/mkdir /var/log
            
            #4.在 lib 下创建相应文件夹(与当前内核版本相同) ,为驱动模块加载作准备
            if ! [ -d /lib/modules ]; then
                mkdir /lib/modules
            fi
            
            if ! [ -d /lib/modules/$(uname -r) ]; then
                mkdir /lib/modules/$(uname -r)
            fi
            
            #5.自动在/dev 下创建设备节点
            /sbin/mdev -s
5.修改 fstab 文件,将一下内容替换源文件fstab 中的内容
    #device mount-point type options dump fask order
    proc   /proc  proc   defaults 0 0
    ramfs  /var   ramfs  defaults 0 0
    ramfs  /tmp   ramfs  defaults 0 0
    none   /sys   sysfs  defaults 0 0
    none   /dev   ramfs  defaults 0 0
6.修改 profile,将一下内容填写到profile的第五行位置
    #1.初始化 PATH 环境变量及动态链接库路径
    export PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
    #2.初始化主机名以及当前工作路径
    /bin/hostname TechManZhang
    USER="`id -un`"
    LOGNAME=$USER
    HOSTNAME='/bin/hostname'
    PS1='[\u@\h \W]# '
6.用户名、密码文件构建(这步可以不做,一般开发板都不带密码)
    拷贝虚拟机上的/etc/passwd, /etc/group, /etc/shadow 到 rootfs/etc 下。
    命令:
            cp /etc/passwd $HOME/rootfs/etc
            cp /etc/group $HOME/rootfs/etc
            cp /etc/shadow $HOME/ rootfs/etc
    对以下三个文件修改,只保存与 root 相关的项(每个文件的第一行)只保留 passwd 第一行,为:
    root:x:0:0:root:/root:/bin/sh
    (而且最后改成/bin/ash,PC 使用 bash 作为默认 shell,嵌入式系统不支持 bash,这里改为 sh 或 ash)只保留 group 第一行,为:
    root:x:0:root
    只保留 shadow 第一行,为:
    root:$1$x9yv1WlB$abJ2v9jOlOc9xW/y0QwPs.:14034:0:99999:7:::
    (注意这个值不一定一样,各人密码不一样,这个值也不一样,这个的密码是六个1:111111)这个文件在本地登录或者 ftp、telnet 登录时起作用打开/etc/inittab
    把第二行:::respawn:-/bin/sh
    改为::respawn:-/bin/login //登录时需要用户名、密码验证
    这样,以后登陆开发板时需输入用户名密码,同虚拟机相同
    登陆后可以通过 passwd 命令修改密码或通过 adduser 增加新用户

至此,根文件系统制作完毕

6.根文件系统验证及镜像制作

验证根文件系统主要有两种方式:
1.通过 Nfs 启动根文件系统验证
2.制作镜像烧写到开发板中验证

6.1.nfs 启动根文件系统

网络文件系统是 FreeBSD 支持的文件系统中的一种, 也被称为 NFS。 NFS允许一个系统在网络上与他人共享目录和文件。通过使用 NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。
在 u-boot 的配置界面按照以下格式,可设置 nfs 启动系统。
模板:
setenv bootargs ‘noinitrd root=/dev/nfs nfsroot=(虚拟机路径),rsize=1024,wsize=1024 ip=(开发板 iP):(服务器 ip):(网关):255.255.255.0::eth0:off init=/linuxrc console=ttySAC0,115200’
注:服务器 ip 一般是虚拟机 ip
例子:
setenv bootargs ‘noinitrd root=/dev/nfs nfsroot=/home/zhang/MyShare/04_day/rootfs_test_2,rsize=1024,wsize=1024 ip=10.0.108.117:10.0.108.229:10.0.108.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 , 115200’
saveenv
如果想恢复本机 emmc 启动,请输入:
setenv bootargs 'noinitrd root=/root=/dev/mmcblk0p2 rwrootfstype=ext4 init=/linuxrc lcd=wy070ml tp=gslx680'
saveenv

6.2.制作文件系统镜像

用 make_ext4fs 制作 ext4 文件系统镜像
tar xvf mkfs_ext4.tar.gz
cp make_ext4fs /bin/make_ext4fs
sudo chmod 777 $HOME/rootfs/ -R
 制作 ext4 镜像
make_ext4fs -s -l 314572800 -a root -L linux gtk.img  /home/edu/rootfs

你可能感兴趣的:(04.嵌入式Linux文件系统)