最開始使用的是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
參考:
http://www.360doc.com/content/11/0429/17/496343_113206690.shtml