jff2根文件系统制作

上一次中,我们发现烧录Linux内核时,单纯的的内核文件烧到单片机中,系统会无法跑起来,根本原因就没有挂载点,找不到文件系统,这一次我们来制作基于jffs2根文件系统的制作。

1. jff2文件系统简介

jff2是专门针对Norflash而设计的文件系统,这种文件系统是直接存放在flash上面,掉电后不丢失,区别于initramfs,小页的Nandflash也可以使用,只是效率不高。这里是Norflash和
Nandflash的简单区别1

2. 库准备

2.1 VFS

我们都知道,Linux能兼容比较多的是因为嵌入式这方面都会屏蔽底层硬件,要求良好的兼容性,移植性强。用户完全不需要知道这些底层文件系统的具体实现,这主要归功于VFS(Virtual File System)。VFS具有以下特性:

  1. 向上提供标准文件操作接口 ;
  2. 向下对所以文件系统提供统一标准接口 ;
  3. VFS把一些复杂的操作尽量抽象到VFS内部,使得底层文件系统实现更简单。

2.2 工具源码准备-mtd-utils移植

创建工作路径

[klaus@localhost jffs+ker_fl2440]$ ls
3rdparty  bootloader  crosstool  driver  images  linux  program
[klaus@localhost jffs+ker_fl2440]$ mkdir -p x86_tools/mtd_utils

库准备

1.编译lzo库,生成静态库

[klaus@localhost jffs+ker_fl2440]$ cd x86_tools/mtd_utils/
[klaus@localhost mtd_utils]$ wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz

[klaus@localhost mtd_utils]$ tar -xzf lzo-2.10.tar.gz
[klaus@localhost mtd_utils]$ cd lzo-2.10
[klaus@localhost lzo-2.10]$  ./configure --prefix=`pwd`/../install --enable-static --disable-shared
configure: Configuring LZO 2.10
checking build system type... x86_64-pc-linux-gnu
... ... ...
Type 'make' to build LZO.
Type 'make check' and 'make test' to test LZO.
Type 'make install' to install LZO.
After installing LZO, please have a look at 'examples/simple.c'.

[klaus@localhost lzo-2.10]$ 

2.编译zlib库

[klaus@localhost lzo-2.10]$ cd ..
[klaus@localhost mtd_utils]$ wget https://github.com/madler/zlib/archive/v1.2.10.tar.gz -O zlib-1.2.10.tar.gz
[klaus@localhost mtd_utils]$ tar -xzf zlib-1.2.10.tar.gz
[klaus@localhost mtd_utils]$ cd zlib-1.2.10
[klaus@localhost zlib-1.2.10]$ ./configure --prefix=`pwd`/../install --static
[klaus@localhost zlib-1.2.10]$ make && make install

3.编译e2fsprogs库(libuuid)

[klaus@localhost zlib-1.2.10]$ cd ..
[klaus@localhost mtd_utils]$ wget https://github.com/tytso/e2fsprogs/archive/v1.43.7.tar.gz -O e2fsprogs-1.43.7.tar.gz
[klaus@localhost mtd_utils]$ tar -xzf e2fsprogs-1.43.7.tar.gz
[klaus@localhost mtd_utils]$ cd e2fsprogs-1.43.7
[klaus@localhost e2fsprogs-1.43.7]$ ./configure --prefix=`pwd`/../install --enable-elf-shlibs --enable-libuuid
[klaus@localhost e2fsprogs-1.43.7]$  make ; make install-libs

4.编译mtd-utils并安装mkfs.jffs2和mkfs.ubifs

[klaus@localhost e2fsprogs-1.43.7]$ cd ..
[klaus@localhost mtd_utils]$ wget ftp://ftp.infradead.org/pub/mtd-utils/mtd-utils-1.5.2.tar.bz2
[klaus@localhost mtd_utils]$ tar -xjf mtd-utils-1.5.2.tar.bz2
[klaus@localhost mtd_utils]$ cd mtd-utils-1.5.2
[klaus@localhost mtd-utils-1.5.2]$ export CFLAGS+=" -I../install/include/ "
[klaus@localhost mtd-utils-1.5.2]$ export LDFLAGS+=" -L../install/lib/ -static "
[klaus@localhost mtd-utils-1.5.2]$ make WITHOUT_XATTR=1

5.根文件系统工具制作

[klaus@localhost mtd-utils-1.5.2]$ sudo cp mkfs.jffs2 /bin/
[sudo] password for klaus: 
[klaus@localhost mtd-utils-1.5.2]$ sudo cp mkfs.ubifs/mkfs.ubifs /bin/
[klaus@localhost mtd-utils-1.5.2]$ sudo cp ubi-utils/ubinize /bin/
[klaus@localhost mtd-utils-1.5.2]$ 

3.jff2制作

3.1 镜像制作

可直接在上一次做好的文件系统树上进行修改

[klaus@localhost rootfs_fl2440]$ sudo cp -r rootfs/* ../jffs+ker_fl2440/linux/rootfs/
[sudo] password for klaus: 
[klaus@localhost rootfs_fl2440]$ cd ../jffs+ker_fl2440/linux/
[klaus@localhost linux]$ ls
kernel  linux-3.0  linux-3.0.tar.bz2  rootfs
[klaus@localhost linux]$ du -sh rootfs
12M     rootfs
[klaus@localhost linux]$ mkfs.jffs2 -n -s 2048 -e 128KiB -d ./rootfs -o rootfs-jffs2.bin
mkfs.jffs2: error!: open output file
            error 13 (Permission denied)
#制作根文件系统时不进行填充
[klaus@localhost linux]$ sudo mkfs.jffs2 -n -s 2048 -e 128KiB -d ./rootfs -o rootfs-jffs2.bin
[klaus@localhost linux]$ du -sh rootfs-jffs2.bin
6.3M    rootfs-jffs2.bin
[klaus@localhost linux]$ mkfs.jffs2 -n -s 2048 -e 128KiB -d ./rootfs -o rootfs-jffs2.bin --pad=0xa00000
mkfs.jffs2: error!: open output file
            error 13 (Permission denied)
[klaus@localhost linux]$ sudo mkfs.jffs2 -n -s 2048 -e 128KiB -d ./rootfs -o rootfs-jffs2.bin --pad=0xa00000

3.2 内核配置及编译

1.General setup
减少内核大小,取消Nandflash的swap分区。

<*> Kernel .config support
[ ] Automatically append version information to the version string
[ ] Automatically append version i
[ ] Support for paging of anonymous memory (swap)
[*] Configure standard kernel features (expert users)
[*] Embedded system

特别注意,一定要取消initramfs的支持,系统对initramfs的优先级最高,系统会优先启动。
特别注意
2.File systems
取消没必要的文件系统支持,同样可把光盘驱动给取消了,不需要用到光盘。

< > Second extended fs support 
< > Ext3 journalling file system support 
< > The Extended 4 (ext4) filesystem 
< > Kernel automounter version 4 support (also supports v3) 
< > FUSE (Filesystem in Userspace) support 
CD-ROM/DVD Filesystems --->
    < > ISO 9660 CDROM file system support 
    < > UDF file system support
DOS/FAT/NT Filesystems --->
    <*> MSDOS fs support
    <*> VFAT (Windows-95) fs support添加Windows的FAT文件系统支持,U盘或SD卡中会使用
    (437) Default codepage for FAT
    (iso8859-1) Default iocharset for FAT
    <*> NTFS file system support 添加Windows的NTFS文件系统支持,U盘或SD卡中会使用
    [ ] NTFS debugging support
    [*] NTFS write support
Pseudo filesystems --->
    <*> Userspace-driven configuration filesystem 添加sysfs伪文件系统支持
    [*] Miscellaneous filesystems --->
    <*> Journalling Flash File System v2 (JFFS2) support 添加JFFS2文件系统支持
    (0) JFFS2 debugging verbosity (0 = quiet, 2 = noisy)
    [*] JFFS2 write-buffering support
    [ ] Verify JFFS2 write-buffer reads
    [*] JFFS2 summary support (EXPERIMENTAL)
    [ ] JFFS2 XATTR support (EXPERIMENTAL)
    [ ] Advanced compression options for JFFS2其他文件系统如果不需要的话都不要选
    < > Compressed ROM file system support (cramfs) 可以取消cramfs文件系统的支持
    < > SquashFS 4.0 - Squashed file system support 可以取消SquashFS文件系统的支持
    < > ROM file system support 可以取消ROM文件系统的支持
[*] Network File Systems --->
    <*> NFS client support
    [*] NFS client support for NFS version 3
    [*] NFS client support for the NFSv3 ACL protocol extension
    [ ] NFS client support for NFS version 4
    [*] Root file system on NFS

    //将其他不需要的网络文件系统都不要选
    < > NFS server support
    < > Ceph distributed file system (EXPERIMENTAL)
    < > CIFS support (advanced network filesystem, SMBFS successor)
    < > NCP file system support (to mount NetWare volumes)
    < > Coda file system support (advanced network fs)
    < > Andrew File System support (AFS) (EXPERIMENTAL)
Partition Types --->
    [ ] PC BIOS (MSDOS partition tables) support 取消这个选项减少内核大小

3.Native language support
语言选项就比较随意了,选择汉字就好,其他的都可以取消掉

(iso8859-1) Default NLS Option
<*> Codepage 437 (United States, Canada)
<*> Simplified Chinese charset (CP936, GB2312)
<*> Traditional Chinese charset (Big5)
<*> ASCII (United States)
<*> NLS ISO 8859-1 (Latin 1; Western European Languages)
<*> NLS UTF-8

选择完成后重新编译,可以查看生成后的文件大小是多少

[klaus@localhost linux-3.0]$ ./build.sh 
[klaus@localhost linux-3.0]$ du -h linuxrom-s3c2440.bin 
2.4M    linuxrom-s3c2440.bin

4. u-boot下载

根据内核里面配置的信息我们来配置u-boot的参数

static struct mtd_partition smdk_default_nand_part[] = {
        [0] = { 
                .name = "mtdblock0 u-boot 1MB",
                .offset = 0,
                .size = SZ_1M*1, /* 0x0000000 ~ 0x0100000 */
        },
        [1] = { 
                .name = "mtdblock1 kernel 15MB",
                .offset = MTDPART_OFS_NXTBLK,
                .size = SZ_1M*15, /* 0x0100000 ~ 0X1000000 */
        },
        [2] = {
                .name = "mtdblock2 rootfs 40MB",
                .offset = MTDPART_OFS_NXTBLK,
                .size = SZ_1M*40,
        },
        [3] = {
                .name = "mtdblock3 apps 80MB",
                .offset = MTDPART_OFS_NXTBLK,
                .size = SZ_1M*80,
        },
        [4] = {
                .name = "mtdblock4 data 80MB",
                .offset = MTDPART_OFS_NXTBLK,
                .size = SZ_1M*80,
        },
        [5] = {
                .name = "mtdblock5 backup 40MB",
                .offset = MTDPART_OFS_NXTBLK,
                .size = SZ_1M*40,
        }

};

static struct s3c2410_nand_set smdk_nand_sets[] = {
        [0] = {
                .name           = "NAND",
                .nr_chips       = 1,
                .nr_partitions  = ARRAY_SIZE(smdk_default_nand_part),
                .partitions     = smdk_default_nand_part,
        },

参数解读
jffs2根文件系统区别于initramfs文件系统,jiff2是建立在Nandflash上的根文件系统,开发板掉电不丢失,而且不像initramfs同内核绑定在一起,需要分别烧录内核和根文件系统。
一般性经验

  • u-boot的烧录地址应该是 0,大小不超过1M。该分区对应Linux内核分区表的/dev/mtdblock0;
  • Linux内核的烧录地址应该是0x100000(1M的偏移量处),大小不超过15M。该分区对应Linux
    内核分区表的/dev/mtdblock1;
  • 根文件系统镜像的烧录地址应该是0x1000000(16M的偏移量处),大小不超过40M。该分区对应Linux内核分区表的/dev/mtdblock2;

4.1 内核烧录

[fl2440@lingyun]# tftp 30008000 linuxrom-s3c2440.bin
//Linux内核下载到内存地址30008000
dm9000 i/o: 0x20000300, id: 0x90000a46 
DM9000: running in 16 bit mode
MAC: 00:11:22:33:44:55
could not establish link
Using dm9000 device
TFTP from server 192.168.100.8; our IP address is 192.168.100.18
Filename 'linuxrom-s3c2440.bin'.
Load address: 0x30008000
Loading: T #################################################################
         #################################################################
         ######################################
done
Bytes transferred = 2461920 (2590e0 hex)
[fl2440@lingyun]# nand erase 100000 F00000
NAND erase: device 0 offset 0x100000, size 0xf00000
Skipping bad block at  0x004c0000                                          
Erasing at 0xfe0000 -- 100% complete.
OK
[fl2440@lingyun]# nand write 30008000 100000 400000
//(即1M开始总共15M的空间)全部擦除
NAND write: device 0 offset 0x100000, size 0x400000
Skip bad block 0x004c0000
 4194304 bytes written: OK
[fl2440@lingyun]# 

4.2 烧录根文件系统

[fl2440@lingyun]# tftp 30008000 rootfs-jffs2.bin
dm9000 i/o: 0x20000300, id: 0x90000a46 
DM9000: running in 16 bit mode
MAC: 00:11:22:33:44:55
could not establish link
Using dm9000 device
TFTP from server 192.168.100.8; our IP address is 192.168.100.18
Filename 'rootfs-jffs2.bin'.
Load address: 0x30008000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
done
Bytes transferred = 10485760 (a00000 hex)
[fl2440@lingyun]# nand erase 1000000 2800000
//(即16M开始总共40M的空间)全部擦除
NAND erase: device 0 offset 0x1000000, size 0x2800000
Erasing at 0x37e0000 -- 100% complete.
OK
[fl2440@lingyun]#  nand write 30008000 1000000 $filesize
NAND write: device 0 offset 0x1000000, size 0xa00000
 10485760 bytes written: OK
 [fl2440@lingyun]# 

5. 重启

u-boot烧录进去后,我们可以直接重启开发板或者使用boot命令。

[fl2440@lingyun]# boot
... ... ...
~ >: mount
rootfs on / type rootfs (rw)
/dev/root on / type jffs2 (rw,relatime)
proc on /proc type proc (rw,relatime)
usbfs on /proc/bus/usb type usbfs (rw,relatime)
tmpfs on /dev type tmpfs (rw,relatime)
ramfs on /tmp type ramfs (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,mode=600)
~ >: 

根文件的确挂载到了jffs2文件系统上,同时可以看看分区情况。

~ >: pwd
/
~ >: ls
apps     dev      init     mnt      rtc      tmp
bin      etc      lib      proc     sbin     usr
data     info     linuxrc  root     sys      var
~ >: dmesg | grep mtdblock
Kernel command line: console=tty0 console=ttyS0,115200 root=/dev/mtdblock2 rootfstype=jffs2 init=/linuxrc mem=64M rw noinitrd loglevel=7
0x000000000000-0x000000100000 : "mtdblock0 u-boot 1MB"
0x000000100000-0x000001000000 : "mtdblock1 kernel 15MB"
0x000001000000-0x000003800000 : "mtdblock2 rootfs 40MB"
0x000003800000-0x000008800000 : "mtdblock3 apps 80MB"
0x000008800000-0x00000d800000 : "mtdblock4 data 80MB"
0x00000d800000-0x000010000000 : "mtdblock5 backup 40MB"
~ >: 

  1. Norflash不允许有坏块,擦除比较麻烦。导致了允许出现坏块的Nandflash。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值