制作嵌入式linux文件系统(ramdisk,cramfs,squashfs)

Linux - SquashFS文件系统 Squashfs的设计是专门为一般的只读文件系统的使用而设计,它可应用于数据备份,或是系统资源紧张的电脑上使用。版本 2.6.34 之后的Linux内核增加了对 LZMA和 LZO 压缩算法的支持,版本 2.6.38 的内核增加了对LZMA2的支持,该算法同时也是xz使用的压缩算法。对于巨大的公共存档,以及个人媒体存档,这是必不可少的。Squashfs旨在用于一般的只读文件系统,用于存档(即在可能使用.tar.gz文件的情况下),以及在需要降低存储开销的存储空间受限的块设备或存储系统(如嵌入式系统)。 阅读详情

一、什么是文件系统 (Filesystem);

A directory structure contained within a disk drive or disk area. The total available disk space can be composed of one or more filesystems. A filesystem must be mounted before it can be accessed. To mount a filesystem, you must specify a directory to act as the mount point. Once mounted, any access to the mount point directory or its subdirectories will access the separate filesystem.

文件系统是包括在一个磁盘(包括光盘、软盘、闪盘及其它存储设备)或分区的目录结构;一个可应用的磁盘设备可以包含一个或多个文件系统;如果您想进入一个文件系统,首先您要做的是挂载(mount)文件系统;为了挂载(mount)文件系统,您必须指定一个挂载点。

二、主要嵌入式采用的文件系统 ;

* Linux 中,rootfs 是必不可少的。PC 上主要实现有 ramdisk 和直接挂载 HD(Harddisk,硬盘) 上的根文件系统;嵌入式中一般不从 HD 启动,而是从 Flash 启动,最简单的方法是将 rootfs load 到 RAM 的 RAMDisk,稍复杂的就是 直接从Flash 读取的 Cramfs,更复杂的是在 Flash 上分区,并构建 JFFS2 等文件系统。

* RAMDisk 将制作好的 rootfs 压缩后写入 Flash,启动的时候由 Bootloader load 到RAM,解压缩,然后挂载到 /。这种方法操作简单,但是在 RAM 中的文件系统不是压缩的,因此需要占用许多嵌入式系统中稀有资源 RAM。

ramdisk 就是用内存空间来模拟出硬盘分区,ramdisk通常使用磁盘文件系统的压缩存放在flash中,在系统初始化时,解压缩到SDRAM并挂载根文件系统, 在linux系统中,ramdisk有二种,一种就是可以格式化并加载,在linux内核2.0/2.2就已经支持,其不足之处是大小固定;另一种是 2.4的内核才支持,通过,ramfs来实现,他不能被格式化,但用起来方便,其大小随所需要的空间增加或减少,是目前linux常用的ramdisk技 术.

* initrd 是 RAMDisk 的格式,kernel 2.4 之前都是 image-initrd,Kernel 2.5 引入了 cpio-initrd,大大简化了 Linux 的启动过程,附合 Linux 的基本哲学:Keep it simple, stupid(KISS). 不过cpio-initrd 作为新的格式,还没有经过广泛测试,嵌入式 Linux 中主要采用的还是 image-initrd。

* Cramfs 是 Linus 写的很简单的文件系统,有很好的压缩绿,也可以直接从 Flash 上运行,不须 load 到 RAM 中,因此节约了 RAM。但是 Cramfs 是只读的,对于需要运行时修改的目录(如: /etc, /var, /tmp)多有不便,因此,一般将这些目录做成ramfs 等可写的 fs。

* SquashFS 是对 Cramfs 的增强。突破了 Cramfs 的一些限制,在 Flash 和 RAM 的使用量方面也具有优势。不过,据开发者介绍,在性能上可能不如 Cramfs。这也是一种新方法,在嵌入式系统采用之前,需要经过更多的测试

三、建一个包含所有文件的目录 ;

1。建一个目录rootfs 用来装文件系统

2。mkdir bin  dev  etc  lib  proc  sbin  tmp  usr  var

3.  ln -fs  bin/busybox linuxrc(使用busybox)

4.  到系统 /dev 把所有的device打一个包,拷贝到 dev下面(最省事的做法);或者使用mknod来自己建所需要的device,我自己用的如下:
crw-rw-rw-  1 root   root     5,  1 2006-02-24 13:12 console
crw-rw-rw-  1 root   root     5, 64 2006-02-24 13:12 cua0
crw-rw-rw-  1 root   root    63,  0 2006-02-24 13:12 dk0
crw-rw-rw-  1 root   root    63,  1 2006-02-24 13:12 dk1
drwxr-xr-x  2 root   root      4096 2006-02-24 13:12 flash
brw-rw-rw-  1 root   root     3,  0 2006-02-24 13:12 hda
crw-rw-rw-  1 root   root    36, 10 2006-02-24 13:12 ipsec
crw-rw-rw-  1 root   root   241,  0 2006-02-24 13:12 ixNpe
crw-rw-rw-  1 root   root     1,  2 2006-02-24 13:12 kmem
crw-rw-rw-  1 root   root   126,  0 2006-02-24 13:12 ledman
lrwxrwxrwx  1 root   root        16 2007-09-19 14:08 log -> /tmp/var/log/log
crw-rw-rw-  1 root   root     1,  1 2006-02-24 13:12 mem
crw-rw-rw-  1 root   root    90,  0 2006-02-24 13:12 mtd0
brw-rw-rw-  1 root   root    31,  0 2006-02-24 13:12 mtdblock0
brw-rw-rw-  1 root   root    31,  1 2006-02-24 13:12 mtdblock1
brw-rw-rw-  1 root   root    31,  2 2006-02-24 13:12 mtdblock2
brw-rw-rw-  1 root   root    31,  3 2006-02-24 13:12 mtdblock3
brw-rw-rw-  1 root   root    31,  4 2006-02-24 13:12 mtdblock4
brw-rw-rw-  1 root   root    31,  5 2006-02-24 13:12 mtdblock5
brw-rw-rw-  1 root   root    31,  6 2006-02-24 13:12 mtdblock6
crw-rw-rw-  1 root   root    90,  1 2006-02-24 13:12 mtdr0
crw-rw-rw-  1 root   root     1,  3 2006-02-24 13:12 null
crw-rw-rw-  1 root   root   108,  0 2006-02-24 13:12 ppp
crw-r--r--  1 root   root     5,  2 2006-03-29 15:56 ptmx
drwxr-xr-x  2 root   root      4096 2006-03-29 15:56 pts
crw-rw-rw-  1 root   root     2,  0 2006-02-24 13:12 ptyp0
brw-rw-rw-  1 root   root     1,  0 2006-02-24 13:12 ram0
crw-rw-rw-  1 root   root     1,  8 2006-02-24 13:12 random
crw-rw-rw-  1 root   root     5,  0 2006-02-24 13:12 tty
crw-rw-rw-  1 root   root     4,  0 2006-02-24 13:12 tty0
crw-rw-rw-  1 root   root     3,  0 2006-02-24 13:12 ttyp0
crw-rw-rw-  1 root   root     4, 64 2006-02-24 13:12 ttyS0
crw-rw-rw-  1 root   root     1,  9 2006-02-24 13:12 urandom
crw-rw-rw-  1 root   root     1,  5 2006-02-24 13:12 zero

举例: mknod console c 5 1 这样  crw-rw-rw-  1 root   root     5,  1 2006-02-24 13:12 console

5。将编译好的busybox拷贝到/bin下面,除了busybox外,所有其他的命令都是他的link

ash      chgrp  clear  dd     echo   fgrep   gzip      ip    ls     modprobe  mv       ping       pwd    sed    stty     tar    true    zcat busybox  chmod  cp  df     egrep  grep    hostname  kill  mkdir  more      netstat  ping2file  rm     sh     sync     tftp   umount cat      chown  date   dmesg  false  gunzip  ifconfig  ln    mknod  mount     pidof    ps    rmdir  sleep  sysinfo  touch  uname

所有的命令你可以在busybox下面用make menuconfig来增减

6。同样/sbin下面也是busybox的link

halt  ifconfig  init  insmod  klogd  losetup  lsmod  mkswap  modprobe  reboot  rmmod  route  swapoff  swapon

7。同样/usr/bin下面也是busybox的link
basename  dirname  env   free  id       logger  reset  tail  tr          tty   uptime  which   xargs
awk  cut       du       expr  head  killall  mkfifo  sort   test  traceroute  uniq  wc      whoami  yes

上面几乎是最全的link,各个看官可以酌情删减,不过link也不占什么空间!

8。同样/usr/sbin下面放着所有编译完的可执行文件,具体就不多说了

9。非常重要之/lib,务必重视
   
    找到你编译环境的target目录,把需要的lib文件先用strip压縮(非target目录下的,而已编译环境提供的strip),先把最基本的libc, ld等等,必须同样做跟target/lib里面一样的link。

    然后根据特定的应用加相应的lib,不要把不用的加进去,lib比较占空间。

10。在/etc下面加上需要的配置文件,最最重要的是rcS
#!/bin/sh
export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/sbin/scripts

UTC=yes

mount -n -t proc proc /proc
mount -n -t ramfs ramfs /tmp
mount -n -t devpts devpts /dev/pts

# build var directories
/bin/mkdir -m 0777 /tmp/var
/bin/mkdir -m 0777 /var/lock
/bin/mkdir -m 0777 /var/log
/bin/mkdir -m 0777 /var/run
/bin/mkdir -m 0777 /var/tmp
#/bin/mkdir -m 0777 /tmp/etc

#/bin/cp -a /usr/etc/* /etc
#/bin/cp -a /usr/dev/* /dev/

# loads the NPE ethernet modules into the kernel.

insmod  /lib/modules/2.6.13.2/intel/ixp400.ko

# Firmware code for NPE Engine.
   
cat  /etc/IxNpeMicrocode.dat > /dev/ixNpe

insmod /lib/modules/2.6.13.2/intel/ixp400_eth.ko netdev_max_backlog=500
insmod /lib/modules/led.ko
insmod /lib/modules/push_button.ko

下面的具体应用没有再举例加上了,这个是系统init必须的。

其他的情况类似如此了,我在附件里面给了一个lunksys的GPL项目的target,大家看着比划。

附件

四、生成一个ramdisk

#!/bin/sh
MODULE_NAME=ramdisk
RAMPATH=`pwd`
TMPPATH=${RAMPATH}/tmp
SOURCE=${RAMPATH}/../target

if [ ! -d ${TMPPATH} ]
then
    mkdir ${TMPPATH}
fi

if [ `whoami` != 'root' ]
then {
    echo "You should run the shell as root, Please rerun as a root."
    echo "Aborting."
    exit 1
    }
fi

# Clear in tmp path
rm -rf ${TMPPATH}/tmpmnt
rm -rf ${TMPPATH}/ramrootfs
mkdir ${TMPPATH}/tmpmnt

# Clear the old ramdisk
rm -f ${RAMPATH}/$MODULE_NAME

# Make a temp file which size is suitable
dd if=/dev/zero of=${TMPPATH}/ramrootfs bs=1k count=6144

# Create a ext2 filesystem
mke2fs -F -m 0 -i 2000 ${TMPPATH}/ramrootfs

# Mount it to tmpmnt/
mount -o loop -t ext2 ${TMPPATH}/ramrootfs ${TMPPATH}/tmpmnt

# Copy everything from kernel to this.
cd ${TMPPATH}/tmpmnt
echo ${SOURCE}
cp -av ${SOURCE}/*  .
cd ${TMPPATH}

# Unmount it the ext2 filesystem
umount ${TMPPATH}/tmpmnt
cat ${TMPPATH}/ramrootfs | gzip -9 > /${RAMPATH}/ramdisk
echo Copying ramdisk image to ${RAMPATH}
sync

这里给出一个自动生成脚本!

五、生成一个cramfs

    找到cramfs的toolchain
    。/mkcramfs -r $(FS1_DIR) $(FS_NAME).1

六、生成一个mksquashfs
    找到squashfs的toolchain
    。/mksquashfs $(FS_DIR) $(FS_NAME) -noappend -be -lzma -no-fragments -noI

做文件系统最困难和最可能出问题的地方是在/lib库和/dev方面,请大家多注意这两方面

详解制作根文件系统 系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基 阅读详情

相关推荐

单细胞测序数据读取实战指南:从入门到精通

本文提供了单细胞测序数据读取的实战指南,涵盖从标准10X Genomics格式到通用表达矩阵及RDS文件的读取方法。文章重点解析了数据读取的核心步骤、常见问题解决方案及进阶技巧,旨在帮助用户夯实数据分析基础,确保后续分析流程的准确性。

weixin_29095587的博客 460

SquashFS是什么

SquashFS是一种只读文件系统,通常用于嵌入式系统。SquashFS 的压缩算法是基于 GZIP 的,可以高效地压缩文件系统,通常可以达到 2:1 的压缩比,甚至更高。总的来说,SquashFS 是一种高效的只读文件系统,具有许多特性,包括节省空间、高效加载、支持文件系统层次结构和增量更新等。:SquashFS 可以保持文件系统的层次结构不变,包括目录结构、文件属性、权限等,因此可以更容易地管理文件系统。:SquashFS 可以快速加载文件系统,因为它可以使用缓存和预读等技术,以最小化读取磁盘的次数。

顺其自然~专栏 2501

IOS APP上架被拒 4.3(a) - Design - Spam,成功

成功解决IOS APP上架被拒 4.3(a) - Design - Spam,本篇博客记录了详细过程

qq_40147106的博客 6909

Linux Squashfs只读文件系统介绍

嵌入式Linux系统中,squashfs文件系统使用非常广泛。它主要的特性是只读,文件压缩比例高。对于flash空间紧张的系统,可以将一些不需要修改的资源打包成压缩的只读文件系统格式,从而达到节省空间的目的。另外还有个特性就是它可以分块解压缩,使用数据会更加灵活,但同时也会引入读放大的问题。

dsgdauigfs的博客 2027

【electron】- 从零到一:在electron-vite项目中集成better-sqlite3的工程化实践

本文详细介绍了在electron-vite项目中集成better-sqlite3数据库的完整工程化实践。针对原生模块的编译挑战,提供了从环境配置、路径规划、服务封装到IPC通信的解决方案,并重点解决了开发与生产环境的数据库路径分离及打包部署等核心问题,帮助开发者构建稳定高效的Electron桌面应用数据层。

weixin_29306571的博客 205

maxwell与steady state thermal 通过workbench耦合仿真

文章目录maxwellsteady state thermal maxwell 1加入maxwell并打开 2导入模型 3选择求解器类型:涡流求解器eddy current 4修改模型名字不能带_等特殊符号 5为模型赋材料 6设立3D边界,各边电流进出方向为0其余方向300 7设置激励条件,可设置电流大小,相位,方向 8设置集肤深度,选取中间铜导体的体然后设置,如何设置看帮助文档 9求解设置 迭代步数 收敛精度 交流电频率 10验证条件满足计算 11求解 发现无法求解,删除ai

roymustang的博客 9201

【Linux】3、文件系统、mount、Rootfs、overlayfs、squashfs

文件系统 和 rootfs

呆呆的猫的博客 5103

点云配准3:3d-ndt算法在pcl上的实现以及参数设置

3d-ndt算法在pcl上的使用方法以及参数设置

诺有缸的高飞鸟的博客 7892

制作嵌入式linux文件系统(ramdisk,cramfs,squashfs)

一、什么是文件系统 (Filesystem);A directory structure contained within a disk drive or disk area. The total available disk space can be composed of one or more filesystems. A filesystem must be mounted before

嵌入我的梦想 1万+

OpenClaw人人养虾:配置通义千问(Qwen)

通义千问(Qwen)是阿里云推出的大语言模型系列。OpenClaw 支持通过 Qwen Portal 插件实现 OAuth 免费额度认证,每日可免费使用 2000 次请求,无需绑定支付方式。

王国平的博客 1257

Qt(C++)使用QChart动态显示3个设备的温度变化曲线

Qt的QChart是一个用于绘制图表和可视化数据的类。提供了一个灵活的、可扩展的、跨平台的图表绘制解决方案,可以用于各种应用程序,如数据分析、科学计算、金融交易等。

1917

转:制作嵌入式linux文件系统(ramdisk,cramfs,squashfs)

 制作嵌入式linux文件系统(ramdisk,cramfs,squashfs)  一、什么是文件系统 (Filesystem);A directory structure contained within a disk drive or disk area. The total available disk space ca

zhongyou2009的专栏 609

Claude Code 100个真实案例 - 用AI批量清洗Excel脏数据(10万行3分钟搞定)

本案例展示如何使用 Claude Code 搭建一个强大的 Excel 数据清洗工具。支持自动检测和处理空值、重复行、格式错误、异常值等常见脏数据问题,批量处理10万行数据只需3分钟。

yueyeguzhuo的专栏 38

嵌入式 linux ramdisk 保存文件,制作嵌入式linux文件系统(ramdisk,cramfs,squashfs)...

一、什么是文件系统 (Filesystem);A directory structure contained within a disk drive or disk area. The total available disk space can be composed of one or more filesystems. A filesystem must be mounted before ...

weixin_31002075的博客 273

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Linux根文件系统的制作

1. 根文件系统 文件系统是包括在一个磁盘(包括光盘、软盘、闪盘及其它存储设备)或分区的目录结构;一个可应用的磁盘设备可以包含一个或多个文件系统;如果您想进入一个文件系统,首先您要做的是挂载(mount)文件系统;为了挂载(mount)文件系统,您必须指定一个挂载点。 注:对于我们应用开发来说,购买开发板的时候,厂家会提供好现成的根文件系统和BootLoader等,如果需要,我们可以改变其中...

weixin_33939380的博客 135

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: uImage的制作
下一篇: git使用笔记
vrix
博客等级 码龄24年 673粉丝 167原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值