根文件系统制作之jaffs2

时间:2021-08-01 14:45:21

JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2(Journalling Flash FileSystem v2日志闪存文件系统版本2 )RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所JFFS2也可以用在Linux, uCLinux中。

它主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。Jffs2不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs2为维护日志节点所占用的内存空间迅速增大,另外,jffs2文件系统在挂载时需要扫描整个FLASH的内容,以找出所有的日志节点,建立文件结构,对于大容量的NAND闪存会耗费大量时间。 目前jffs3正在开发中关于jffs2系列文件系统的使用详细文档,可参考MTD补丁包中mtd-jffs-HOWTO.txt

添加内核对jffs2的支持

[fanmaolin@Centeros ~]$ cd fl2440/kernel/linux-3.0
[fanmaolin@Centeros linux-3.0]$ export TERM=vt100
[fanmaolin@Centeros linux-3.0]$ make menuconfig


 File systems  --->
      Miscellaneous filesystems  --->
           <*> Journalling Flash File System v2 (JFFS2) support
           (0)   JFFS2 debugging verbosity (0 = quiet, 2 = noisy)
           [*]   JFFS2 write-buffering support
           [ ]   JFFS2 summary support (EXPERIMENTAL)
           [ ]   JFFS2 XATTR support (EXPERIMENTAL)
           [ ]   Advanced compression options for JFFS2 

制作mkfs.jffs2mkfs.ubifs工具

mkdir mtd-utiles

cd mtd-utiles/

vim build.sh


 

#!/bin/sh

PRJ_PATH=`pwd`

 

LZO="lzo-2.04"

ZLIB="zlib-1.2.5"

e2fsprogs_ver=1.42

mtd="mtd-utils-1.4.9"

 

function decompress_packet()

(

   echo "+---------------------------------------------+"

   echo "|  Decompress $1 now"  

   echo "+---------------------------------------------+"

 

    ftype=`file "$1"`

    case "$ftype" in

       "$1: Zip archive"*)

           unzip "$1" ;;

       "$1: gzip compressed"*)

           if [ `expr "$1" : ".*.tar.*" ` ] ; then

               tar -xzf $1

           else

               gzip -d "$1"

           fi ;;

       "$1: bzip2 compressed"*)

           if [ `expr "$1" : ".*.tar.*" ` ] ; then

               tar -xjf $1

           else

               bunzip2 "$1"

           fi ;;

       "$1: POSIX tar archive"*)

           tar -xf "$1" ;;

       *)

          echo "$1 is unknow compress format";;

    esac

)

 

# Download lzo source code packet

if [ ! -s $LZO.tar.gz ] ; then

   wget http://www.oberhumer.com/opensource/lzo/download/$LZO.tar.gz

fi

 

# Decompress lzo source code packet

if [ ! -d $LZO ] ; then

    decompress_packet $LZO.tar.*

fi

 

# Cross compile lzo

 

cd  $LZO

if [ ! -s src/.libs/liblzo*.a ] ; then

    unset LDFLAGS

    ./configure  --enable-static --disable-shared

    make

fi

cd  -

 

 

echo "+----------------------------------------+"

echo "|  Cross compile $ZLIB now "  

echo "| Crosstool:  $CROSS"

echo "+----------------------------------------+"

 

# Download zlib source code packet

if [ ! -s $ZLIB.tar* ] ; then

#wget http://www.zlib.net/$ZLIB.tar.gz

   #wget http://www.imagemagick.org/download/delegates/$ZLIB.tar.bz2

   #wget http://down1.chinaunix.net/distfiles/$ZLIB.tar.bz2

wget http://pkgs.fedoraproject.org/repo/pkgs/zlib/zlib-1.2.5.tar.bz2/be1e89810e66150f5b0327984d8625a0/$ZLIB.tar.bz2

fi

 

# Decompress zlib source code packet

if [ ! -d $ZLIB ] ; then

    decompress_packet $ZLIB.tar.*

fi

 

#Cross compile zlib

 

cd  $ZLIB

if [ ! -s libz.a ] ; then

    unset LDFLAGS

    ./configure  --static

    make                                                                                                                       

fi

cd  -

 

 

echo "+----------------------------------------+"

echo "|  Cross compile e2fsprogsV$e2fsprogs_ver now "  

echo "| Crosstool:  $CROSS"

echo "+----------------------------------------+"

#e2fsprogs is for UBIFS, download e2fsprogs source code packet

if [ ! -s e2fsprogs-$e2fsprogs_ver.tar.gz ] ; then

  wget http://nchc.dl.sourceforge.net/project/e2fsprogs/e2fsprogs/$e2fsprogs_ver/e2fsprogs-$e2fsprogs_ver.tar.gz

fi

 

# Decompress e2fsprogs source code packet

if [ ! -d e2fsprogs-$e2fsprogs_ver ] ; then

    decompress_packet e2fsprogs-$e2fsprogs_ver.tar.*

fi

 

cd e2fsprogs-$e2fsprogs_ver

if [ ! -s lib/libuuid.a ] ; then

  ./configure --enable-elf-shlibs

  make

fi

cd -

 

echo "+----------------------------------------+"

echo "|  Cross compile mtd-utils now "  

echo "| Crosstool:  $CROSS"

echo "+----------------------------------------+"

 

if [ ! -s ${mtd}.tar.bz2 ] ; then

   wget ftp://ftp.infradead.org/pub/mtd-utils/${mtd}.tar.bz2

fi

decompress_packet ${mtd}.tar.bz2

 

# download mtd-utils source code

#if [ ! -d  mtd-utils* ] ; then

   #git clone git://git.infradead.org/mtd-utils.git

 

#fi

 

cd ${mtd}

#Add the CROSS tool in file common.mk

 

line=`sed -n '/CFLAGS ?= -O2 -g/=' common.mk `

if [ ! -z $line ] ; then

    sed -i -e ${line}s"|.*|CFLAGS ?= -O2 -g --static|" common.mk

fi

 

unset LDFLAGS

unset CFLAGS

 

set -x

export CFLAGS="-DWITHOUT_XATTR -I$PRJ_PATH/$ZLIB -I$PRJ_PATH/$LZO/include -I$PRJ_PATH/e2fsprogs-$e2fsprogs_ver/lib"

export ZLIBLDFLAGS=-L$PRJ_PATH/$ZLIB

export LZOLDFLAGS=-L$PRJ_PATH/$LZO/src/.libs/

export LDFLAGS="-static -L $PRJ_PATH/e2fsprogs-$e2fsprogs_ver/lib $ZLIBLDFLAGS $LZOLDFLAGS"

make

 

set -x

#strip nandwrite flash_erase  nanddump

#sudo cp nandwrite $INST_PATH/.nandwrite

#sudo cp flash_erase $INST_PATH/.flash_erase

#sudo cp nanddump $INST_PATH/.nanddump




sh build.sh 


sudo cp mkfs.jffs2 /usr/local/bin/



mkfs    

mkfs.jffs2 -V


mkfs.jffs2(可以查看mkfs。jaffs2的使用方法)



制作映像文件


sudo mkfs.jffs2 -n -s 2048 -e 128KiB -d rootfs -o rootfs.jffs2 --pad=0x2800000(-pad命令是填充命令,让jaffs2填满整个roofts分区

du -h rootfs.jffs2

(1)-r :指定根文件系统目录.
(2)-o : 指定输出的根文件系统名.
(3)-s : 指定flash每一页的大小;
(3)-e : 指定flash的檫除块的大小,預設是64KB.
要注意,不同的flash, page sizeblock size會不一樣.,如果是K9F2G08U0M,在它的datasheet上有说明:


根文件系统制作之jaffs2


添加ubootjffs2支持

 set bjffs2 'tftp 30008000 rootfs.jffs2;nand erase 1000000 2800000;nand write.jffs2 30008000 1000000 2800000'

 set bootargs_jffs2 'noinitrd root=/dev/mtdblock4 rootfstype=jffs2 init=/linuxrc console=ttyS0,115200'

 set bootargs 'noinitrd root=/dev/mtdblock2 rootfstype=jffs2 init=/linuxrc console=ttyS0,115200'

 set bootcmd_jffs2 'nand read 30008000 100000 400000;bootm 30008000'

 set bootcmd 'run bootcmd_jffs2'

 save


[fl2440@lingyun]# run bkr
dm9000 i/o: 0x20000300, id: 0x90000a46 
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
could not establish link
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.2; our IP address is 192.168.1.168
Filename 'linuxrom-s3c2440.bin'.
Load address: 0x30008000
Loading: T #################################################################
         #################################################################
         #####################################
done
Bytes transferred = 2447852 (2559ec hex)


NAND erase: device 0 offset 0x100000, size 0x800000
Erasing at 0x8e0000 -- 100% complete.
OK


NAND write: device 0 offset 0x100000, size 0x800000
 8388608 bytes written: OK




[fl2440@lingyun]# run bjffs2
dm9000 i/o: 0x20000300, id: 0x90000a46 
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
could not establish link
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.2; our IP address is 192.168.1.168
Filename 'rootfs.jffs2'.
Load address: 0x30008000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         ###############################################################
done
Bytes transferred = 41943040 (2800000 hex)


NAND erase: device 0 offset 0x1000000, size 0x2800000
Erasing at 0x37e0000 -- 100% complete.
OK


NAND write: device 0 offset 0x1000000, size 0x2800000
 41943040 bytes written: OK
[fl2440@lingyun]# boot


NAND read: device 0 offset 0x100000, size 0x400000
 4194304 bytes read: OK
## Booting kernel from Legacy Image at 30008000 ...
   Image Name:   Linux kernel
   Created:      2017-03-24   8:53:28 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2540812 Bytes = 2.4 MiB
   Load Address: 30008000
   Entry Point:  30008040
   Verifying Checksum ... OK
   XIP Kernel Image ... OK
OK


Starting kernel ...


Uncompressing Linux... done, booting the kernel.
Linux version 3.0.0 (fanmaolin@Centeros.ocaldomain) (gcc version 4.5.4 (Buildroot 2012.08) ) #16 Fri Mar 24 16:53:14 CST 2017
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: SMDK2440
Memory policy: ECC disabled, Data cache writeback
CPU S3C2440A (id 0x32440001)
S3C24XX Clocks, Copyright 2004 Simtec Electronics
S3C244X: core 405.600 MHz, memory 101.400 MHz, peripheral 50.700 MHz
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 16256
Kernel command line: noinitrd root=/dev/mtdblock2 rootfstype=jffs2 init=/linuxrc console=ttyS0,115200
PID hash table entries: 256 (order: -2, 1024 bytes)
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 59880k/59880k available, 5656k reserved, 0K highmem
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
    DMA     : 0xffc00000 - 0xffe00000   (   2 MB)
    vmalloc : 0xc4800000 - 0xf6000000   ( 792 MB)
    lowmem  : 0xc0000000 - 0xc4000000   (  64 MB)
    modules : 0xbf000000 - 0xc0000000   (  16 MB)
      .init : 0xc0008000 - 0xc0027000   ( 124 kB)
      .text : 0xc0027000 - 0xc0491298   (4521 kB)
      .data : 0xc0492000 - 0xc04b6660   ( 146 kB)
       .bss : 0xc04b6684 - 0xc04e985c   ( 205 kB)
SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
NR_IRQS:85
irq: clearing pending ext status 00080000
irq: clearing subpending status 00000003
irq: clearing subpending status 00000002
Console: colour dummy device 80x30
console [ttyS0] enabled
Calibrating delay loop... 202.54 BogoMIPS (lpj=506368)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
gpiochip_add: gpios 288..303 (GPIOK) failed to register
gpiochip_add: gpios 320..334 (GPIOL) failed to register
gpiochip_add: gpios 352..353 (GPIOM) failed to register
NET: Registered protocol family 16
S3C Power Management, Copyright 2004 Simtec Electronics
S3C2440: Initialising architecture
S3C2440: IRQ Support
S3C244X: Clock Support, DVS off
bio: create slab <bio-0> at 0
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
s3c-i2c s3c2440-i2c: slave address 0x10
s3c-i2c s3c2440-i2c: bus frequency set to 99 KHz
s3c-i2c s3c2440-i2c: i2c-0: S3C I2C adapter
Advanced Linux Sound Architecture Driver Version 1.0.24.
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
TCP: Hash tables configured (established 2048 bind 2048)
TCP reno registered
UDP hash table entries: 256 (order: 0, 4096 bytes)
UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
NTFS driver 2.1.30 [Flags: R/W].
JFFS2 version 2.2. (NAND) ? 2001-2006 Red Hat, Inc.
msgmni has been set to 116
io scheduler noop registered
io scheduler deadline registered
io scheduler cfq registered (default)
Console: switching to colour frame buffer device 60x53
fb0: s3c2410fb frame buffer device
s3c2440-uart.0: ttyS0 at MMIO 0x50000000 (irq = 70) is a S3C2440
s3c2440-uart.1: ttyS1 at MMIO 0x50004000 (irq = 73) is a S3C2440
s3c2440-uart.2: ttyS2 at MMIO 0x50008000 (irq = 76) is a S3C2440
brd: module loaded
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c24xx-nand s3c2440-nand: Tacls=3, 29ns Twrph0=7 69ns, Twrph1=3 29ns
s3c24xx-nand s3c2440-nand: NAND soft ECC
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Scanning device for bad blocks
Bad eraseblock 651 at 0x000005160000
Bad eraseblock 825 at 0x000006720000
Bad eraseblock 1667 at 0x00000d060000
Bad eraseblock 1787 at 0x00000df60000
Bad eraseblock 1879 at 0x00000eae0000
Creating 5 MTD partitions on "NAND":
0x000000000000-0x000000100000 : "bootloader"
0x000000100000-0x000001000000 : "linux"
0x000001000000-0x000003800000 : "rootfs"
0x000003800000-0x000009c00000 : "apps"
0x000000000000-0x000010000000 : "data"
dm9000 Ethernet Driver, V1.31
eth0: dm9000a at c4856300,c4858304 IRQ 51 MAC: 08:00:3e:26:0a:5b (chip)
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
s3c2410-ohci s3c2410-ohci: S3C24XX OHCI
s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
usbcore: registered new interface driver libusual
mousedev: PS/2 mouse device common for all mice
S3C24XX RTC, (c) 2004,2006 Simtec Electronics
i2c /dev entries driver
S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics
s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled
cpuidle: using governor ladder
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
ALSA device list:
  No soundcards found.
TCP cubic registered
NET: Registered protocol family 17
Registering the dns_resolver key type
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
usb 1-1: new full speed USB device number 2 using s3c2410-ohci
hub 1-1:1.0: USB hub found
hub 1-1:1.0: 4 ports detected
VFS: Mounted root (jffs2 filesystem) on device 31:2.  (
大功告成啦
Freeing init memory: 124K
dm9000 dm9000: eth0: link down
dm9000 dm9000: eth0: link up, 100Mbps, full-duplex, lpa 0xCDE1


Copyright (C) 2017 fanmaolin<fanmaolin@gmail.com>
root login: root
>: ls
apps     data     etc      init     linuxrc  proc     sbin     tmp      var
bin      dev      info     lib      mnt      root     sys      usr
>: 


问题总结:
1、以后在make menuconfig执行make distclean(删除所有make menuconfig 生成的文件)要备份.config,因为make menuconfig 生成的是.config 2、export TERM=vt100   可以使make menuconfig界面更好看 3、HTTP request sent, awaiting response... Read error (Connection timed out) in headers.

先试着Ping一下百度的网址,判断是否是自己的虚拟机没有联网,然后ping自己要链接的网址,发现不可以,换了一个网络后,就可以了。有可能是前一个网络太卡了。
4、下载静态库glibc-static文件,使用 rpm -iv filename.rpm安装即可,调用find / -name libc.a可以看到libc的静态库,或则利用yum install glibc-static安装。在/usr/lib/目录下mkfs [-V] [-t fstype] [fs-options] filesys [blocks]
  • device : 预备检查的硬盘分区,例如:/dev/sda1
  • -V : 详细显示模式
  • -t : 给定档案系统的型式,Linux 的预设值为 ext2
  • -c : 在制做档案系统前,检查该partition 是否有坏轨
  • -l bad_blocks_file : 将有坏轨的block资料加到 bad_blocks_file 里面
  • block : 给定 block 的大小
用TAB补齐命令,直接enter不行
5、sudo: mkfs.jffs2: command not found   分析:和路径有关mkfs命令要cp到usr/bin/下面
6、mkfs.jffs2: error!: rooftserror 2 (No such file or directory)
找不到文件roofts,返回上一层目录执行命令解决
7、jffs2文件过大:将mtd-utiles包放在了roofts下,导致虚拟机空间被填满,先移除后删除


8、根文件系统制作之jaffs2

参数设置有问题

set bootargs 'noinitrd root=/dev/mtdblock4 rootfstype=jffs2 init=/linuxrc console=ttyS0,115200'

我要挂载到第三个分区, mtdblock?这里要设置为2而不是4


9、http://blog.csdn.net/itismine/article/details/4775824  如果想详细了解mkfs.jsffs2的用法可以参考这篇博客