当前位置: 首页 > Linux

嵌入式Linux系统的开发——基于JFSS2文件系统的分区和镜像制作

时间:2023-04-06 11:36:02 Linux

前言对于嵌入式Linux系统来说,大多数硬件设备都使用Flash作为存储介质,LEDE/OPENWRT发行版将使用squash文件系统结合使用jffs2文件系统作为整个系统的文件系统,squash文件系统是一个压缩的只读文件系统,jffs2文件系统支持可读写操作。uboot启动内核时,内核加载squashFS文件系统格式化的ROM分区并挂载到/rom目录,将JFFS2文件系统格式化的Flash剩余空间挂载到/overlay目录,和/rom最终挂载在/root目录下,/overlay覆盖在/rom之上,也就是所谓的Overlay透明挂载技术。从用户的角度来看,/root目录下的文件可以任意修改、删除、添加,但实际上,/rom目录下的只读文件修改后,修改后的文件会放在/覆盖目录。修改/overlay和/rom目录下的同名文件时,只会影响/overlay目录下的文件,/rom目录下的文件不变。这种方法的好处是恢复出厂设置时只需要清除/overlay分区下的文件,/rom目录下的文件就会变成出厂状态,但是这样一来,/rom目录会一直占用一定的空间来存放系统所需的文件。恢复系统。本文将介绍如何在LEDEreleaseversion17.01.4上只使用JSFF2文件系统以及如何制作镜像。与squash文件系统相比,备份相同的文件不需要占用空间。JFSS2格式配置包含source-17.01.4/config/路径下的Config-images.in文件,对应LEDECon??figuration界面中的TargetImages选项内容。由于JSFF2文件系统的选择默认是不开启的,所以这里需要修改下面的代码,添加对JFSS2文件系统的支持。menu"TargetImages"...configTARGET_ROOTFS_JFFS2bool"jffs2"defaultyifUSES_JFFS2#dependsonUSES_JFFS2help构建JFFS2根文件系统。...系统分区dts文件,用于更灵活的硬件支持和配置,对设备的硬件信息进行描述,涉及系统flash类型,系统分区,网口寄存器,ledgpio语句等。source-17.01.4下/target/linux/ramips/dts/路径,更改硬件平台对应的dts文件的系统分区部分(在LEDECon??figuration——>TargetProfile选项中配置)。&spi0{状态=“好的”;m25p80@0{#address-cells=<1>;#size-cells=<1>;compatible="jedec,spi-nor";注册=<0>;spi-max-频率=<10000000>;m25p,chunked-io=<32>;partition@0{label="u-boot";reg=<0x00x30000>;只读;};partition@30000{label="u-boot-env";reg=<0x300000x10000>;#只读;};工厂:分区@40000{标签=“工厂”;reg=<0x400000x10000>;只读;};内核:分区@50000{标签=“内核”;reg=<0x500000x180000>;/*1.5M*/};rootfs:partition@1D0000{label="rootfs";reg=<0x1D00000x0D00000>;/*13M0x0D00000*/};升级:分区@ED0000{标签=“升级”;reg=<0xED00000x0E80000>;/*14.5M0x0D00000*/};分区{标签=“固件”;reg=<0x500000x1fb0000>;};};spidev@1{#address-cells=<1>;#size-cells=<1>;compatible="linux,spidev";注册=<1>;spi-max-频率=<10000000>;};};固件合成将/source-17.01.4/build_dir/target-mipsel_24kc_musl-1.1.16/linux-ramips_mt7628/路径下的kernel和rootfs的bin文件用于固件合成。由于dts文件中kernel分区大小为1.5M,rootfs分区大小为13.5M,需要通过dt命令展开bin文件后,使用cat命令将两个bin文件连为一体固件。Linux的dd命令可以复制指定大小块的文件,并在复制的同时进行指定的转换。比如wrtnode2p-kernel.bin文件的展开中,768k是一个block,2个block就是1.5M,不足的部分用空(NUL)字符填充。具体参数如下:1)if=filename:输入文件名,默认为标准输入。即指定源文件。2)of=filename:输出文件名,默认为标准输出。即指定目标文件。3)ibs=bytes:一次读取bytes个字节,即指定一个块大小为bytes个字节。4)obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。5)bs=bytes:同时设置读取/输出的块大小为bytesbytes。6)cbs=bytes:一次转换bytes字节,即指定转换缓冲区大小。7)skip=blocks:从输入文件的开头跳过blocks块,然后开始复制。8)seek=blocks:从输出文件的开头跳过blocks块,然后开始复制。9)count=blocks:只复制blocks块,块大小等于ibs指定的字节数。10)conv=conversion:转换指定参数的文件。ascii:将ebcdic转为asciiebcdic:将ascii转为ebcdicibm:将ascii转为alternateebcdicblock:将每行转为cbs的长度,不足的部分用空格补齐unblock:让每行的长度为cbs,不足的部分用空格补全空格lcase:将大写转换为小写ucase:将小写转换为大写swab:交换输入中的每对字节noerror:不要在错误时停止notrunc:不要截断输出文件sync:将每个输入块填充到ibswords部分,the缺失部分用空(NUL)字符填充。Linux的cat命令可以用来创建文件,显示文件内容,连接文件。这里可以使用cat命令连接填充好的内核和rootfs文件。ddif=wrtnode2p-kernel.binof=dwrtnode2p-kernel.binbs=768kcount=2conv=syncddif=root.jffs2-64kof=droot.jffs2-64kbs=6656Kcount=2conv=synccatdwrtnode2p-kernel.bindroot.jffs2-64k>ledeupdate.bin注意:命令以shell脚本(./xx.sh)的形式调用更方便,使用TFTP协议将合成的固件下载到设备Flash中。详情请参考《嵌入式linux系统的开发——发行版的编译和烧写》固件编程章节。镜像制作所谓镜像文件制作,就是像照镜子一样,把写在原设备上的固件复制成一个文件,然后烧录到其他类似的设备上。使用cat/proc/mtd命令查看当前系统分区信息,结合dts文件中的分区信息,可以使用dd命令或cat命令从MTD(MemoryTechnologyDevices)访问Flash分区中的固件)接口,并为内核制作镜像文件与rootfs分开分区的好处是可以单独制作分区的镜像文件。ddif=/dev/mtd3of=/tmp/kernel.binddif=/dev/mtd4of=/tmp/rootfs.bincat/dev/mtd3>/tmp/kernel.bincat/dev/mtd4>/tmp/rootfs.bin总结使用jffs2文件系统,不仅可以增加M级以上的可支配空间,还可以方便的单独更新内核或者rootfs固件。