嵌入式系统移 -07植根文件系统制作(根文件系统基本概念,根文件系统设备,访问根文件系统制作)

根文件系统基本概念

什么是根文件系统?

  • 根文件系统(root filesystem)是存放运行、维护系统所必须的各种工具软件、库文件、脚本、配置文件和其他特殊文件的地方,也可以安装各种软件包。
  • 整个系统起来之后运行的第一个文件系统
  • 根文件系统下还可以搭建其他的文件系统

根文件系统主要目录结构

在这里插入图片描述

程序文件的放置

程序文件目录

  • /bin: 普通用户和root用户都能执行的基本程序

      ping, mknod, mount, tar, grep, gzip, etc
    
  • /sbin: root用户能执行的基本程序

      int, insmod, route, mkfs, rmmod, ifconfig
    
  • /usr/bin: 更多非必须的用户程序

      autorun, bibtex, latex, biff, ftp, wc, whereis, whoami
    
  • /usr/sbin: 更多非必须的root工具程序

      automount, httpd, in.telnetd, in.talkd, sendmail
    

定制应用程序

  • 配置基本的linux命令(嵌入式linux通过busybox制作)

      cat, chmod, chown, cp, chroot, copi, date, dd, df, dmesg, dos2unix, du, echo, env, expr,  find, grep, gunzip, gzip, halt, id, ifconfig, init, insmod等等
    
  • 配置用户自己的应用
    桌面管理器等等

库文件的放置

/lib: 系统和运行基本命令时需要的动态库文件
/usr/lib:所有的其他库
/usr/lib/xxx: 一些工具包的私有库
如:/usr/lib/perl5

Linux 设备文件

  • Linux 系统中所有的对象(包括设备)都是以文件的形式体现的
  • Linux系统中,所有的设备文件(如:设备节点),通常放到 /dev下
  • 嵌入式系统中只需要创建必须的设备节点即可

举例

字符设备举例

ls –l /dev/“c” 指明该设备节点是字符设备

crw-rw---- 1 root uucp  4,    64 Feb 23 2004 /dev/ttyS0      //4表示主设备号,64表示次设备号
crw--w---- 1 jdoe tty    136, 1   Feb 23 2004 /dev/pts/1
crw-------- 1 root root   13,   32 Feb 23 2004 /dev/input/mouse0
crw-rw-rw 1 root root   1,    3    Feb 23 2004 /dev/null

典型设备
keyboards, mice, parallel port, IrDA, Bluetooth port, consoles, terminals, sound, video…

块设备举例

“b” 指明该设备节点是块设备 (ls -l)

brw-rw--- 1 root disk      3, 1 Feb 23 2004 hda1
brw-rw--- 1 jdoe floppy  2, 0 Feb 23 2004 fd0
brw-rw--- 1 root disk      7, 0 Feb 23 2004 loop0
brw-rw--- 1 root disk      1, 1 Feb 23 2004 ram1
brw------- 1 root root      8, 1 Feb 23 2004 sda1

典型块设备

磁盘, ramdisk,SD,U盘等等

设备的主设备号次设备号

  • Linux系统是通过主设备号和次设备号来区分设备的
  • 主设备号: (major)
    内核用来区分哪类设备
  • 次设备号: (minor)
    区分某类设备中的哪个设备
  • 内核中的相关文档 Documentation/devices.txt

创建设备节点

  • 设备文件不能在加载驱动程序时自动创建,要通过指令创建

  • 创建设备文件的一般语法:

      $ mknod /dev/<device> [c|b] <major> <minor>
    
  • 例如:

      $ mknod  /dev/ttySAC0  c  4  64
      $ mknod  /dev/hda1  b  3  1
    

基本的设备节点

在这里插入图片描述

Linux系统的引导过程

在这里插入图片描述

制作根文件系统

文件系统制作步骤

  1. 制作根文件系统的内容
    采用Busybox创建基本命令
    创建基本的目录/lib /etc /var /tmp /dev /sys /proc等
    添加glibc基本动态库
    创建基本的设备节点
    添加启动配置和脚本程序/etc/inittab /etc/fstab /etc/init.d/rcS
  2. 测试rootfs内容正确性
  3. 制作需要的rootfs类型的格式

BusyBox项目构建系统命令

  1. BusyBox 项目是由Bruce Perens in 在1996创建的
    http://www.busybox.net/
    BusyBox 是在 GNU GPL 许可协议下发行的开源软件
  2. 享有“嵌入式Linux的瑞士军刀”美誉,Erik Andersen先生维护;
  3. Busybox是一个UNIX系统工具集,它将很多普通的UNIX工具集成到一个很小的可执行文件中,为普通用户提供大多数常用的命令;
  4. BusyBox常用于制作linux命令 主要指令包括
    cat, chmod, chown, cp, chroot, copi, date, dd, df, dmesg, dos2unix, du, echo, env, expr, find, grep, gunzip, gzip, halt, id, ifconfig, init, insmod, etc

BusyBox工具安装

linux@linux:~$ cp /mnt/hgfs/Linuxsharexiaomei/busybox-1.22.1.tar.bz2 .
linux@linux:~$ tar -vxf busybox-1.22.1.tar.bz2 
linux@linux:~$ cd busybox-1.22.1/

制作根文件系统的内容

$ make menuconfig
    Busybox Settings ---> 
	Build Options --->
		[*] Build BusyBox as a static binary (no shared libs)
		(arm-none-linux-gnueabi-) Cross Compiler prefix   注意 一定要指定交叉编译工具
$ make
$ file busybox   确认编译生成的是 ARM 平台的(显示为ELF 32-bit LSB executable, ARM)

在这里插入图片描述

$ make  install   安装(默认安装路径为_install)

在这里插入图片描述

$ cd _install
$  ls
      bin  linuxrc  sbin  usr
$ mkdir  dev  etc  mnt  proc  var  tmp  sys  root       创建需要的目录

在这里插入图片描述

$ cp  ~/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib/  .  -a      注意是lib/ 
$ du -mh lib     查看lib库的大小
$ rm  lib/*.a     裁剪,删除掉静态库文件  
$ arm-none-linux-gnueabi-strip  lib   裁剪掉调试信息   not recognized  有些库是不能strip的 忽略掉
$ sudo rm  lib/libstdc++*   删除不需要的库,确保所有库大小不超过4M  
$ du -mh lib    查看lib库的大小  可能 显示3.4M lib   (这里确保小于 8M) 	

在这里插入图片描述

$ cp /nfs/rootfs/etc   -rf   .      拷入成熟的参考配置 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

$sudo mknod   dev/console  c  5  1      必须要有  console设备节点

在这里插入图片描述

测试

看新的根文件系统能否正常挂载到开发板

linux@linux:~/busybox-1.22.1$ mv /nfs/rootfs /nfs/rootfs.ok      把原有的根文件系统备份一下
linux@linux:~/busybox-1.22.1$ sudo cp -rf _install /nfs/rootfs      把新的根文件系统拷贝过去(改名rootfs)

配置文件一

文件 /etc/inittab

#this is run first except when booting in single-user mode.
:: sysinit:/etc/init.d/rcS  指定系统初始化脚本是rcS 也可指定别的名字,但习惯用rcS
# /bin/sh invocations on selected ttys
# start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh    指定初始的控制台(启动后进入# 状态)  
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot

文件 /etc/init.d/rcS(启动脚本)

#!/bin/sh
# This is the first script called by init process
/bin/mount  -a                                 mount all stuff from /etc/fstab  
/etc/init.d/rc.local                           扩展子脚本
echo  /sbin/mdev  >  /proc/sys/kernel/hotplug  设置系统的hotplug程序为mdev
/sbin/mdev  -s                                 
./app.exe   //让脚本自动运行你的程序 

配置文件二

文件 /etc/fstab

#device     mount-point     type        options        dump     fsck order
proc          /proc        proc        defaults         0             0
tmpfs         /tmp          tmpfs       defaults         0             0
sysfs          /sys         sysfs       defaults         0             0
tmpfs         /dev          tmpfs       defaults         0             0   

文件 /etc/profile

#!/bin/sh
export HOSTNAME=farsight
export USER=root
export HOME=root
export PS1="[$USER@$HOSTNAME \W]\# "       终端前的提示符
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH  LD_LIBRARY_PATH 

测试rootfs内容正确性

$ cd /nfs
$ mkdir rootfs
$ cp  _install/*   rootfs   –a                        
$ chmod 777 /nfs/rootfs/		

NFS能挂载成功表示根文件系统 内容基本正确

制作需要的rootfs类型的格式

在这里插入图片描述

不同根文件系统详解

nfs rootfs

是网络文件文件系统,通过网线远程挂载一个文件系统,文件系统在远程的电脑上。最大的好处是同步,主要用于开发调试

CRAMFS

只读,不能写。安全性高,某些区域的数据不能改,就可以定义为CRAMFS。

JFFS2和YAFFS2

可读,可写,针对都是flash。JFFS2在小型应用系统用的比较多。JFFS2有一个特点:是一个日志文件系统,用的过程中可以随时掉电。YAFFS2只能针对Nand flash,手机中用的最多的是Nand flash,文件系统就是YAFFS2

EXT2 over RAM disk

把一块内存虚拟成为一个磁盘。内存只能按地址空间像一个buffer一样访问,当应用产品内存比较大而flash比较小时,就可以按这种格式把一块内存虚拟成为一个磁盘

制做EXT2 over RAM disk文件系统

制作一个大小为8M的镜像
linux@linux:~$ dd if=/dev/zero of=ramdisk  bs=1k  count=8192

if	:(input file)输入文件
/dev/zero	:是一个虚拟的设备,从这个设备中读到的数据全是0
of	:(output file)输出文件
bs=1k count=8192: 单元大小是1k,数量是8k,就是8M大小

在这里插入图片描述

格式化这个镜像为EXT2
linux@linux:~$ mkfs.ext2 -F ramdisk

在这里插入图片描述

在mount下面创建initrd目录作为挂载点
linux@linux:~$ sudo mkdir /mnt/initrd
将这个磁盘镜像文件挂载到/mnt/initrd下

注意这里的ramdisk不能存放在rootfs目录中

linux@linux:~$ sudo mount -t ext2 ramdisk /mnt/initrd

在这里插入图片描述

将我们的文件系统复制到ramdisk中

将测试好的文件系统里的内容全部拷贝到/mnt/initrd目录下面

linux@linux:~$ sudo cp /nfs/rootfs/* /mnt/initrd/ -a

在这里插入图片描述

卸载initrd
linux@linux:~$ sudo umount /mnt/initrd

在这里插入图片描述

压缩ramdisk为ramdisk.gz并拷贝到/tftpboot下
linux@linux:~$ gzip --best -c ramdisk > ramdisk.gz

在这里插入图片描述

格式化为uboot识别的格式,并拷贝到/tftpboot下
linux@linux:~$ mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img

linux@linux:~$ cp ramdisk.img /tftpboot/

在这里插入图片描述

配置内核支持RAMDISK

制作完ramdisk.img后,需配置内核支持RAMDISK作为启动文件系统

make menuconfig

	File systems  --->   
		<*> Second extended fs support  
	Device Drivers  --->        
		SCSI device support  --->     
          	<*> SCSI disk support     
		[*] Block devices  --->  
			<*>   RAM block device support                                                   
			(16)    Default number of RAM disks                                            
			(8192)  Default RAM disk size (kbytes)  (修改为8M)
	General setup  --->  
		[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support  

重新编译内核,复制到/tftpboot

在U-BOOT命令行重新设置启动参数

在这里插入图片描述

参考

https://blog.csdn.net/m0_37542524/article/details/86485905#231_110

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值