s3c2440 支持ubifs作为根文件系统


前言


一.什么是ubfis

UBIFS 是诺基亚工程师在塞格德大学的帮助下开发的一种新的闪存文件系统。 在某种程度上,UBIFS 可以被视为 JFFS2 文件系统的下一代。UBIFS工作在UBI卷之上,不能在MTD设备之上运行,也不能在block设备上运行。

UBIFS需要3个子系统参与:

1.MTD 子系统,它提供了访问闪存芯片的统一接口。 MTD 提供了 MTD 设备的概念(例如,/dev/mtd0),它基本上代表原始闪存;
2.UBI 子系统,这是一个用于闪存设备的磨损均衡和卷管理系统; UBI 在MTD设备之上工作并提供UBI卷的概念; UBI 卷是比 MTD 设备更高级别的实体,它们没有 MTD 设备存在的许多令人不快的问题(例如,磨损和坏块);

3.UBIFS 文件系统,它在 UBI卷之上工作。

二、2440支持ubifs文件系统

1.u-boot修改

首先在uboot 里面对nand flash进行分区设置,源文件在/include/configs/smdk2440.h

#define CONFIG_CMD_UBI
#define CONFIG_CMD_UBIFS
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_DEVICE
#define CONFIG_MTD_PARTITIONS


#define MTDIDS_DEFAULT    "nand0=jz2440_nand.0"
#define MTDPARTS_DEFAULT  "mtdparts=jz2440_nand.0:" \
                          "256k(uboot)ro," \
                          "128k(params)ro," \
                          "4m(kernel)," \
                          "30m(app)," \
                          "30m(data)," \
                          "-(rootfs)"

-指的是后面的空间全部留给rootfs

如果制作的ubi 映像使用了压缩格式,还需要把下面的选项选上:

#define CONFIG_BZIP2
#define CONFIG_LZO
#define CONFIG_LZMA

2.内核修改

2.1 修改分区表,修改smdk_default_nand_part[] 数组如下(arch/arm/mach-s3c24xx/common-smdk.c文件中),需要保持和u-boot里的分区表一致。

static struct mtd_partition smdk_default_nand_part[] = {
        [0] = {
                .name   = "bootloader",
                .size   = SZ_256K,
                .offset = 0,
        },
        [1] = {
                .name   = "params",
                .offset = MTDPART_OFS_APPEND,
                .size   = SZ_128K,
        },
        [2] = {
                .name   = "kernel",
                .offset = MTDPART_OFS_APPEND,
                .size   = SZ_4M,
        },
        [3] = {
                .name   = "app",
                .offset = MTDPART_OFS_APPEND,
                .size   = SZ_1M * 30,
        },
        [4] = {
                .name   = "data",
                .offset = MTDPART_OFS_APPEND,
                .size   = SZ_1M * 30,
        },
        [5] = {
                .name   = "rootfs",
                .offset = MTDPART_OFS_APPEND,
                .size   = MTDPART_SIZ_FULL,
        }
};

2.2 修改内核的配置,把initramfs的根目录设置为空,并且把内核mtd和ubi 文件系统相关的选项都选上。

make menuconfig

Device Drivers  --->
 
       <*> Memory Technology Device (MTD) support  --->
 
             <*>   Enable UBI - Unsorted block images  --->
 
                  --- Enable UBI - Unsorted block images                                     
 
                  (4096) UBI wear-leveling threshold (NEW)                                   
 
                  (1)   Percentage of reserved eraseblocks for bad eraseblocks handling (NEW)
 
                  < >   MTD devices emulation driver (gluebi) (NEW)                          
 
                  [ ]   UBI debugging (NEW)                     
 
       
 
   File systems  --->
 
       [*] Miscellaneous filesystems  --->
 
  
 
             <*>   UBIFS file system support          
 
             [*]     Extended attributes support      
 
             [*]     Advanced compression options     
 
             [*]       LZO compression support (NEW)  
 
             [*]       ZLIB compression support (NEW)
 
             [ ]     Enable debugging support (NEW)      

3.u-boot 启动参数设置和ubifs文件系统制作

3.1 设置 uboot的启动参数,ro是以只读方式挂载文件系统,如果不设置,默认采用读写方式挂载

set bootargs console=ttySAC0,115200 ubi.mtd=5 root=ubi0:rootfs  rootfstype=ubifs

3.2 制作ubifs镜像文件

先用busybox制作文件系统所需要的材料,可以参考:

https://blog.csdn.net/mybelief321/article/details/10001927

然后执行 

mkfs.ubifs -r ubifs -m 2048 -e 126KiB -c 1300 -o fs_ubifs.img //size = 126KiB * 1300 = 160M

ubinize -o fs_ubi.img -m 2048 -p 128KiB -s 512 ubinize.cfg  

 -m 最小 I/O 单元大小,一般是页大小, 是2K,2048
-r 是指定哪个目录,制作文件系统。
-e 是可擦除逻辑块大小,一般等于 (每块的页数 - 2)* 页大小 = 126K
-c 是最大可擦除逻辑块总数,这边总共是105
-o 生成的 ubifs.img

 -p:物理擦除块大小 

 -m:页面大小

 -s: 最小的硬件输入输出页面大小

ubinize.cfg文件的内容

[ubifs]
mode=ubi
image=fs_ubifs.img
vol_id=0
vol_size=160MiB //卷大小
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize

执行上面两条命令后,最终会生成fs_ubi.img镜像文件。

3.3 然后在u-boot里通过 tftp 烧录到rootfs分区里

查看分区信息

 先将镜像文件通过tftp 下载到内存0x30000000里,然后再烧写到rootfs分区里去

tftp 0x30000000 fs_ubi.img
nand erase.part rootfs
nand write 0x30000000 rootfs $filesize 

4.ubifs文件系统查看和验证

1.然后执行rest 重新启动系统后,查看有哪些mtd设备,以及分区名对应分区名字

/ # cat /proc/mtd 
dev:    size   erasesize  name
mtd0: 00040000 00020000 "bootloader"
mtd1: 00020000 00020000 "params"
mtd2: 00400000 00020000 "kernel"
mtd3: 01e00000 00020000 "app"
mtd4: 01e00000 00020000 "data"
mtd5: 0bfa0000 00020000 "rootfs"
/ #

df -h 查看挂载的分区大小

/ # df -h
Filesystem                Size      Used Available Use% Mounted on
ubi0:rootfs             148.5M      5.1M    143.4M   3% /
tmpfs                    29.2M         0     29.2M   0% /tmp
tmpfs                    29.2M         0     29.2M   0% /dev
/ #

/dev目录下默认就会生产ubi0设备和ubi0_0卷

/ # ls /dev/ubi*
/dev/ubi0      /dev/ubi0_0    /dev/ubi_ctrl
/ # 

可以通过文件节点,查看ubi的信息 

/ # ls /sys/class/ubi/ubi0/
avail_eraseblocks  eraseblock_size    mtd_num            total_eraseblocks
bad_peb_count      max_ec             power              ubi0_0
bgt_enabled        max_vol_count      reserved_for_bad   uevent
dev                min_io_size        subsystem          volumes_count
/ # 
/ # ls /sys/class/ubi/ubi0_0/
alignment       dev             power           type            usable_eb_size
corrupted       device          reserved_ebs    uevent
data_bytes      name            subsystem       upd_marker
/ #

查看ubi分区信息 ubinfo -a 

/ # ubinfo -a
UBI version:                    1
Count of UBI devices:           1
UBI control device major/minor: 10:63
Present UBI devices:            ubi0

ubi0
Volumes count:                           1
Logical eraseblock size:                 129024 bytes, 126.0 KiB
Total amount of logical eraseblocks:     1528 (197148672 bytes, 188.0 MiB)
Amount of available logical eraseblocks: 0 (0 bytes)
Maximum count of volumes                 128
Count of bad physical eraseblocks:       5
Count of reserved physical eraseblocks:  15
Current maximum erase counter value:     1
Minimum input/output unit size:          2048 bytes
Character device major/minor:            253:0
Present volumes:                         0

Volume ID:   0 (on ubi0)
Type:        dynamic
Alignment:   1
Size:        1509 LEBs (194697216 bytes, 185.7 MiB)
State:       OK
Name:        rootfs
Character device major/minor: 253:1
/ # 

2.app和data分区的烧写和验证

2.1用制作根文件系统的方法,制作app和data的镜像文件

//app镜像的制作
mkfs.ubifs -r app -m 2048 -e 129024 -c 243 -o app_ubifs.img
ubinize -o app_ubi.img -m 2048 -p 128KiB -s 512 app_ubinize.cfg

//app_ubinize.cfg文件的内容
[ubifs]
mode=ubi
image=app_ubifs.img
vol_id=0
vol_size=25MiB
vol_type=static
vol_name=app
vol_flags=autoresize


//data镜像的制作
mkfs.ubifs -r data -m 2048 -e 129024 -c 243 -o data_ubifs.img
ubinize -o data_ubi.img -m 2048 -p 128KiB -s 512 data_ubinize.cfg

//data_ubinize.cfg文件的内容
[ubifs]
mode=ubi
image=data_ubifs.img
vol_id=0
vol_size=25MiB
vol_type=dynamic
vol_name=data
vol_flags=autoresize


说明:
vol_id  表示volume的编号,一个ubi设备中可以有多个volume。(这种情况下,/dev下会出现 ubi0 和 ubi0_0)
vol_size 表示ubi0_0的大小,即volume0的大小
vol_type 表示volume0的类型,分为dynamic和static两种
vol_name 表示volume0的名称,在挂载ubi分区是会使用到,如在bootargs中的root=ubi0:rootfs

然后将app_ubi.img 和 data_ubi.img 用tftp下载到 app 和 data分区中,由于ubifs是建立再mtd和ubi之上的,rootfs是内核在启动的时候会根据uboot传入的bootargs参数去找mtd设备并创建ubi卷以及挂载,所以就会在dev目录下生成ubi0和ubi0_0节点。可以参考https://blog.csdn.net/oqqYuJi12345678/article/details/103515395 。而其他分区,则需要用ubi相关的命令去创建ubi卷和挂载。挂载操作如下:

一.app分区的挂载

1.与ubi建了连接
 ubiattach -p /dev/mtd3

执行完后,就会多出ubi1
/ # ls /dev/ubi*
/dev/ubi0      /dev/ubi0_0    /dev/ubi1      /dev/ubi1_0    /dev/ubi_ctrl
/ # 

2.挂载ubifs
  mount -t ubifs /dev/ubi1_0  /app

二.data分区挂载

1.与ubi建了连接
  ubiattach -p /dev/mtd4


2.挂载ubifs
  mount -t ubifs /dev/ubi2_0  /data

三.查看分区挂载结果
/ # df -h
Filesystem                Size      Used Available Use% Mounted on
ubi0:rootfs             148.5M      5.1M    143.4M   3% /
tmpfs                    29.2M         0     29.2M   0% /tmp
tmpfs                    29.2M         0     29.2M   0% /dev
/dev/ubi1_0              25.2M     16.0K     25.2M   0% /app
/dev/ubi2_0              25.2M     24.0K     25.2M   0% /data

2.2 也可以通过ubi命令直接格式和写入镜像文件

首先可以使用ubiformat工具将ubi镜像写入FLASH,使用ubiformat工具的好处是它可以保留擦除计数器。

1.格式化,并写入镜像
ubiformat /dev/mtd3 -y -f app_ubi.img

2.写入完成后,首先需要进行attach
ubiattach -p /dev/mtd3

3.最后挂载ubifs
mount -t ubifs /dev/ubi2_0 /test

4.我们也可以挂载一个空的ubifs(不需要ubi镜像),操作步骤和上面差不多:
ubiformat /dev/mtd4

ubiattach -p /dev/mtd4

# Create an UBI volume - the created volume will be empty
ubimkvol -N data -s 25MiB /dev/ubi2

mount -t ubifs /dev/ubi2_0 /data

2.3 ubi常见挂载操作

ubi挂载操作:
(1)格式化ubi分区
  ubiformat /dev/mtd*   格式化mtdblock*

(2)与ubi建了连接
  ubiattach /dev/ubi_ctrl -m *   mtdblock*与ubi建立连接

(3)创建volume
  ubimkvol /dev/ubi* -s 100MiB -N my_ubi_vol 在ubi*上创建一个volume,名字为my_ubi_vol,大小为100MiB

(4)挂载ubifs
  mount -t ubifs /dev/ubi_0  /mnt   挂载对应的/dev/ubi_0,而非/dev/mtd*

(5)卸载ubifs
  umount /mnt

(6)断开ubi连接
  ubidetach -m *

参考链接:

https://www.cnblogs.com/azan777/p/14789172.html

https://blog.csdn.net/qq_24835087/article/details/125336305

https://blog.csdn.net/qq_24835087/article/details/125316583

https://blog.csdn.net/Ceekin/article/details/81334749

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值