https://blog.csdn.net/qianxilin/article/details/89282773
最开始使用的是ramfs,每次系统掉电以后保存的配文件就没有了。而且把内核加文件系统的uimage也比较大。
尝试下把文件系统做成ubifs。直接烧写到FLASH里面。
UBIFS 是用於固態硬碟儲存裝置上,並與LogFS相互競爭,作為JFFS2的後繼檔案系
統之一。 UBIFS 在設計與效能上均較YAFFS2、 JFFS2更適合 MLC NAND FLASH。例
如: UBIFS 支援 write-back, 其寫入的資料會被 cache, 直到有必要寫入時才寫到 flash,
大大地降低分散小區塊數量並提高 I/O 效率
操作记录。
1. 安装工具包
sudo apt install mtd-utils
2.把rootfs打包成ubifs文件
这些参数是参考官方文档,具体意思先留坑以后再看。
mkfs.ubifs -F -x lzo -m 2048 -e 126976 -c 732 -o rootfs_ubifs.img -d ./rootfs
ubinize -o ubi.img -p 131072 -m 2048 -s 2048 -O 2048 ubinize.cfg
ubinize.cfg参考文件
[ubifs]
mode=ubi
image=rootfs_ubifs.img
vol_id=0
vol_size=100MiB
vol_type=dynamic
vol_alignment=1
vol_name=system
vol_flags=autoresize
3.内核配置
MTD NAND flash 設置
NAND flash 是使用的驅動是掛在 MTD 子系統之下. 可按照以下設置使能. NANDflash 接口有兩組管腳可選擇, Port C 以及 Port I, 需視硬件接線設置.
驅動中的基本設置如果需要由U-boot環境變數傳入就必須將” Command line partition table parsing” 選上, 否則會使用驅動程式裡的默認配置, 主要會將 MTD 分為三塊空間. 上電進入 shell 後, 分別是/dev/mtdblock0, /dev/mtdblock1, 以及 /dev/mtdblock2. 第一
塊是放置 U-Boot 的空間, 第二塊放置內核文件, 第三塊則是用來掛載 YAFFS2 或UBIFS 文件系統的空間. 若是配置有需要更改, 例如增加或減少分區, 改變分區大小.請直接編輯 uboot/include/nuc970_evb.h 或 drivers/mtd/nand/nuc970_nand.c.
上面是官方文档给出的配置参数。但是我的uboot可能有些问题,导致:
选中选项后,uboot并没有参数正确传递给内核,内核启动信息中看到的也是默认的参数。所以我就把这个选项取消了,直接去修改drivers/mtd/nand/nuc970_nand.c中的配置文件。
参考的内核配置:
drivers/mtd/nand/nuc970_nand.c
UBI相关的启动参数配置
先备份以前的参数
root=/dev/ram0 console=ttyS0,115200n8 rdinit=/sbin/init mem=64M
修改后的参数
noinitrd ubi.mtd=2 root=ubi0:system rw rootfstype=ubifs console=ttyS0,115200n8 rdinit=/sbin/init mem=64M
取消RAM根文件系統設定.
UBIFS文件系統設置
简单总结:
上面的操作步骤来看,NAND 和UBI的配置都已经完成了。UBI的文件系统也准备好了。NAND分为三个区
1.u-boot
2.kernel
3.system
这里的system需要注意下,这个就是存放我们前面生成的ubi.img文件,上面的步骤中很多地方使用了"system", 这个名字可以自定义为rootfs等任何名称,但是前后文必须一致。修改一处,所有的都要修改。uboot ,ubi文件制作,内核引导参数,nuc970_nand.c文件。
我们制作的ubi.img就是存放在system区域,内核在启动的时候,会根据内核配置的引导参数去加载这部分的内容。加载ubi文件系统需要底层的NAND驱动支持,所以内核中需要把NAND的驱动也配置好。
uboot中的配置:
修改:nuc970bsp/uboot/include/configs/nuc970_evb.h
这里的配置需要和内核驱动中的nuc970_nand.c文件一致。注意system的名称。 system当前使用剩余的全部空间。
进入uboot以后使用如下命令
对于新的板子不知道这些步骤是不是强制需要的,留坑后面测试。
加载默认分区
U-Boot> mtdparts default
查看分区
查看分区
U-Boot> mtdparts
device nand0 <nand0>, # parts = 3
#: name size offset mask_flags
0: u-boot 0x00200000 0x00000000 0
1: kernel 0x00600000 0x00200000 0
2: system 0x07800000 0x00800000 0
active partition: nand0,0 - (u-boot) 0x00200000 @ 0x00000000
defaults:
mtdids : nand0=nand0
mtdparts: mtdparts=nand0:0x200000@0x0(u-boot),0x600000@0x200000(kernel),-(system)
擦除分区system
U-Boot> nand erase.part system
NAND erase.part: device 0 offset 0x800000, size 0x7800000
Erasing at 0x7fe0000 -- 100% complete.
OK
对system分区进行ubi格式化
U-Boot> ubi part system
Creating 1 MTD partitions on "nand0":
0x000000800000-0x000008000000 : "mtd=2"
UBI: attaching mtd1 to ubi0
UBI: physical eraseblock size: 131072 bytes (128 KiB)
UBI: logical eraseblock size: 126976 bytes
UBI: smallest flash I/O unit: 2048
UBI: VID header offset: 2048 (aligned 2048)
UBI: data offset: 4096
UBI: empty MTD device detected
UBI: create volume table (copy #1)
UBI: create volume table (copy #2)
UBI: attached mtd1 to ubi0
UBI: MTD device name: "mtd=2"
UBI: MTD device size: 120 MiB
UBI: number of good PEBs: 960
UBI: number of bad PEBs: 0
UBI: max. allowed volumes: 128
UBI: wear-leveling threshold: 4096
UBI: number of internal volumes: 1
UBI: number of user volumes: 0
UBI: available PEBs: 947
UBI: total number of reserved PEBs: 13
UBI: number of PEBs reserved for bad PEB handling: 9
UBI: max/mean erase counter: 1/0
创建system分区:
ubi create rootfs
//这里会有一些提示信息,注意看看有没有错误提示.有的话,就重新把system擦除下.
烧写自己的ubi.img文件系统
更改boot,重新上电,烧写文件。
烧写完成以后,更改boot重新上电。进入uboot。
可以在uboot中验证下我们创建的ubi.img文件对不对。
1. mtdparts default
2. mtdparts
3. ubi part system
4. ubifsmount ubi0:system //挂载
如果都没有错误信息的话,就查看下文件系统中有哪些文件。如果有的话,就检查下哪里出问题了。
这些不通过的话,下面的步骤也做不了。
U-Boot> ubifsls
<DIR> 3440 Sat Apr 13 06:23:09 2019 bin
<DIR> 352 Sat Apr 13 06:23:09 2019 dev
<DIR> 1312 Sat Apr 13 06:23:09 2019 etc
<DIR> 3936 Sat Apr 13 06:23:09 2019 lib
<DIR> 288 Sat Apr 13 06:22:50 2019 mnt
<DIR> 224 Sat Apr 13 06:22:50 2019 opt
<DIR> 160 Sat Apr 13 06:22:50 2019 tmp
<DIR> 160 Sat Apr 13 06:22:50 2019 sys
<DIR> 224 Sat Apr 13 06:22:50 2019 var
<DIR> 872 Sat Apr 13 06:23:09 2019 usr
<DIR> 160 Sat Apr 13 06:22:50 2019 proc
<DIR> 1416 Sat Apr 13 06:23:09 2019 sbin
<LNK> 11 Sat Apr 13 06:23:09 2019 linuxrc
56 Thu Jan 01 00:00:47 1970 .ash_history
<DIR> 432 Thu Jan 01 00:00:40 1970 myApp
如果能看到自己打包的文件,就表明我们的文件系统制作的没有问题。
剩下的就看内核能否正常启动并加载了。。
内核启动信息中看到的分区信息:
Creating 3 MTD partitions on "nand0":
0x000000000000-0x000000200000 : "u-boot"
0x000000200000-0x000000800000 : "Kernel"
0x000000800000-0x000008000000 : "system"
fmi-sm: registered successfully! mtdid=nand0
到此在roomfs里面的文件可以正常的保存了,掉电也不会消失了。
结束。。。
顺便的记录下自己的uboot环境:
U-Boot> print
baudrate=115200
bootcmd=nboot 0x7fc0 0 0x200000; bootm 0x7fc0
bootdelay=3
ethact=emac
ethaddr=00:00:00:11:66:88
stderr=serial
stdin=serial
stdout=serial
watchdog=off
Environment size: 185/65532 bytes
原文链接:https://blog.csdn.net/qianxilin/article/details/89282773