DM368开发 -- 制作ubifs文件系统
生活随笔
收集整理的這篇文章主要介紹了
DM368开发 -- 制作ubifs文件系统
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、Ubifs 文件系統的制作和啟動
(重點)參看:UBIFS Support
參看:UBIFS - UBI File-System
UBI 文件系統是 JFFS2 的下一代文件系統,更適合 NAND FLASH。看到一些用戶在應用 UBIFS 時遇到些問題,現在做個簡要介紹。
1. 在 U-boot 和 kernel 中使能對 UBIFS 的支持
1.1 U-boot 的\include\configs\am335x_evm.h 中加入如下宏的定義:
#define CONFIG_CMD_NAND #define CONFIG_CMD_UBI #define CONFIG_CMD_UBIFS #define CONFIG_RBTREE #define CONFIG_MTD_DEVICE #define CONFIG_MTD_PARTITIONS #define CONFIG_CMD_MTDPARTS #define CONFIG_LZO1.2 Kernel 中的 menuconfig:
Enabling UBI support on MTD devices. Device Drivers ---> Memory Technology Device (MTD) support ---> Enable UBI - Unsorted block images --->Enabling UBIFS file-system support. File systems ---> Miscellaneous filesystems ---> UBIFS file system support2. 下載和編譯 MTD Utilites
2.1 下載 MTD Utilites:
通過 Git://git.infradead.org/mtd-utils.git 下載最新的 MTD-Utils 源代碼。下載 3 個編譯所需的依賴庫
Zlib: ?http://zlib.NET/
Lzo: ?http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gze2fsprogs
e2fsprogs : ?https://www.kernel.org/pub/Linux/kernel/people/tytso/e2fsprogs/v1.42.12/
下載:ubifs文件系統 相關軟件包
在制作 ubifs 文件系統的過程中需要如下:
為方便操作,把下面將要安裝的數據包的解壓文件到存放在:/home/user/mtd
再mkdir install,下面將要運行的數據包生成的文件將會存放在:/home/user/mtd/install?
1),正確安裝數據包:
? ? ?zlib-1.2.5;lzo-2.06;e2fsprogs-1.42,mtd-utils-1.5.0? ? ?這些數據包的版本最好如上所述,否則可能會導致無法生成所需的文件或生成的文件不正確
? ? ?這是制作 ubifs 過程中將要用到的所有的軟件包的連接:ubifs
?
1,zlib
? ? host$ tar xvf zlib-1.2.5.tar.gz
? ? host$ cd zlib-1.2.5/
? ? host$ ./configure --prefix=/home/user/mtd/install ? ? ?
打開其根目錄下的 Makefile,替換 ? gcc, ldshared, cpp, ar , ranlib 為如下:
? ? host$ gedit Makefile
? ? ? ? ? ?CC=arm-arago-linux-gnueabi-gcc
? ? ? ? ? ?LDSHARED=arm-arago-linux-gnueabi-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
? ? ? ? ? ?CPP=arm-arago-linux-gnueabi-gcc -E
? ? ? ? ? ?AR=arm-arago-linux-gnueabi-ar rc
? ? ? ? ? ?RANLIB=arm-arago-linux-gnueabi-ranlib
保存,退出
? ? host$ make
? ? host$ make install
? ? host$ cd ..
?
生成的 zlib.a 存放在 /home/user/mtd/install/lib 中;
生成的 zlib 的頭文件存放在 /home/user/mtd/install/include中。
zlib安裝完成!
?
2,lzo
? ? host$ tar xvf lzo-2.06.tar.gz
? ? host$ cd lzo-2.06/
? ? host$ ./configure --build=i686-pc-linux --prefix=/home/user/mtd/install --host=arm-arago-linux-gnueabi
? ? host$ make
? ? host$ make install
? ? host$ cd ..
?
生成的 liblzo2.a 存放在 /home/user/mtd/install/lib 中;
生成的 lzo 的頭文件 存放在 /home/user/mtd/install/include/lzo中
lzo安裝完成!
?
3,e2fsprogs
? ? host$ tar xvf e2fsprogs-1.42.tar.gz
? ? host$ cd e2fsprogs-1.42/
? ? host$ ./configure --build=i686-pc-linux --prefix=/home/user/mtd/install --host=arm-arago-linux-gnueabi
? ? host$ make
? ? host$ make install
? ? host$ cd lib/uuid/
? ? host$ make install
? ? host$ cd ../../../
?
生成的 libuuid.a 存放在 /home/user/mtd/install/lib 中;
生成的 uuid 的頭文件 存放在 /home/user/mtd/install/include/uuid 中。
e2fsprogs安裝完成!
?
4,mtd-utils
? ? host$ tar xvf mtd-utils-1.5.0.tar.gz
? ? host$ cd mtd-utils-1.5.0/
?
打開其根目錄下的Makefile,加入如下語句
? ? host$ gedit Makefile
? ? ? ? ? ?PREFIX = /home/user/mtd/install
? ? ? ? ? ?ZLIBCPPFLAGS = -I$(PREFIX)/include
? ? ? ? ? ?LZOCPPFLAGS = -I$(PREFIX)/include
? ? ? ? ? ?ZLIBLDFLAGS = -L$(PREFIX)/lib
? ? ? ? ? ?LZOLDFLAGS = -L$(PREFIX)/lib
? ? ? ? ? ?LDFLAGS += $(ZLIBLDFLAGS) $(LZOLDFLAGS)
? ? ? ? ? ?CFLAGS ?= -O2 -g $(ZLIBCPPFLAGS) $(LZOCPPFLAGS)
? ? ? ? ? ?CROSS=arm-arago-linux-gnueabi-
?
保存,關閉,再打開 common.mk 文件,注釋 PREFIX=/usr 語句:
? ? host$ gedit common.mk
? ? ? ? ? ?# PREFIX=/usr
保存,關閉。
?
? ? host$ make WITHOUT_XATTR=1?
? ? host$ make install ?DESTDIR=/home/user/mtd/install
? ? host$ cd ..
?
交叉環境編譯的MTD通用工具就存放在 /home/user/mtd/install/sbin/中。
如mkfs.ubifs,ubinize 的工具(可執行文件)
至此,安裝數據包應該算是完成了??上忍D到 ? 2),生成鏡像文件,
?
5,安裝 mtd-utils 的疑難雜癥及其解決方法
如果在使用生成的 mkfs.ubifs 和 ubinize 可執行文件的過程中發生了如下錯誤,再回過頭來看這部分的內容
如:1,mkfs.ubifs 和 ubinize 這兩個文件無法執行;
? ? ? ?2,mkfs.ubifs 無法使用 命令參數 -F;
發生這些問題的原因是 mtd-ubifs 數據包沒有安裝正確,安裝的 mtd-ubifs 版本過低。
? ? ? ? ? ?解決方法:下載數據包 :mtd-utils_1.5.0-1_i386.deb
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?host$sudo dpkg -i ? mtd-utils_1.5.0-1_i386.deb
?
? ? ? 3,acl 庫版本過低,如 需要libacl1 的版本要大于 2.2.51,可當前的為:libacl1_2.2.49。
? ? ? ? ? ? 解決方法:下載數據包:libacl1_2.2.51-8_i386.deb
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?host$sudo dpkg -i ? libacl1_2.2.51-8_i386.deb
?
? ? ? 4,attr 庫版本過低,如 需要libattr1 的版本要大于 2.4.46,可當前的為:libacl1_2.1.11。
? ? ? ? ? ? 解決方法:下載數據包:libattr1_2.4.46-8_i386.deb
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?host$sudo dpkg -i ? libattr1_2.4.46-8_i386.deb
?
? ? ? 5,uuid 庫版本過低,如 需要libacl1 的版本要大于 2.19.1,可當前的為:libacl1_2.12.1。
? ? ? ? ? ? 解決方法:下載數據包:uuid-dev_2.19.1-2ubuntu3_i386.deb
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?host$sudo dpkg -i ? uuid-dev_2.19.1-2ubuntu3_i386.deb
?
對 dpkg命令有興趣的請看:ubuntu下用命令行運行deb安裝包
執行完更新庫版本的命令后,重新操作:1),正確安裝數據包:-> ?4,mtd-utils。
PS:Ubifs 的制作需要以下兩個命令
mkfs.ubifs: 制作 UBIFS image
ubinize: ? 根據 UBIFS image 制作 ubi.img,這個 ubi.img 是通過 u-boot 直接燒寫在 nand flash 分區上的。
?
2),生成鏡像文件
? ? 1,在使用 mkfs.ubifs 生成 ubifs.img 前,需要如下:? ? ? ?1,把可執行文件 mkfs.ubifs , ubinize 這兩個文件放在某個目錄下。
? ? ? ? ? 并在在目錄下: ? host$mkdir filesystem
?
? ? ?2,把用于生產 ubifs.img 映像文件的 sbin,etc 等文件夾等復制到 filesystem 目錄下
? ? ? ? 如:本人將要用到的是:ti-sdk-am335x-evm/filesystem/base-rootfs-am335x-evm.tar.gz。
? ? ? ? 把以下文件或文件夾放于 filesystem目錄下:bin/,boot/,dev/,etc/,home/,lib/,
? ? ?media/,mnt /,proc/,sbin/,srv/,sys/,tmp/,usr/,var/, linuxrc。
? ? ? ? 其中 linuxrc是一個可執行文件,其余的都是文件夾
?
? ? ? ? !!!注意:linuxrc 這個可執行文件是用以引導內核加載文件系統的。
? ? ? ? 這個文件名在uboot設置環境變量中使用到。
?
?
U-Boot#setenv bootargs 'console=ttyO0,115200n8 noinitrd ip=off mem=256M rootwait=1 rw ubi.mtd=7,2048 rootfstype=ubifs root=ubi0:rootfs init=/linuxrc'
?
如果 init=*** 設置不正確的話,將會導致下面的錯誤:
? ? ? Kernel panic - not syncing: No init found. ?Try passing init= option to kernel.
? ? ? 3,執行以下命令生成 ubifs.img 映像文件
? ? ? ? ?開發板類型為am335x的需要添加 -F 命令參數,否則在加載 ubi.img 時內核可能會崩潰。
? ? ? ? host$mkfs.ubifs -r filesystem/ -F -o ubifs.img -m 2048 -e 126976 -c 1580
?
參數簡介:
-F:使能"white-space-fixup",如果是通過 u-boot 燒寫需要使能此功能。
-r:待制作的文件系統目錄
-m: NAND FLASH 的最小讀寫單元,一般為 page size
-e: LEB size,對于 AM335x 的 NAND driver,為 block size-2x(page size)
-c:文件系統所占用的最大 block 數,一般小于等于 block count -1
-o:輸出的 ubifs.img 文件
?
? ? ? 4,生成ubi.img 映像文件。
? ? ? ? ? ?1,創建以下文件:
? ? ? ? ? ? ? host$ gedit ? ubinize.cfg
? ? ? ? ? ? ? 在該文件寫入如下內容:
? ? ? ? ? ? ? ? ? ? [ubifs] ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? mode=ubi ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? image=ubifs.img ? ? ?
? ? ? ? ? ? ? ? ? ? vol_id=0 ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? vol_size=192MiB ? ? ?
? ? ? ? ? ? ? ? ? ? vol_type=dynamic ? ? ?
? ? ? ? ? ? ? ? ? ? vol_name=rootfs ? ??
? ? ? ? ? ? ? ? ? ? vol_flags=autoresize
?
? ? ? ? ? ? ?2,執行如下命令,生成 ubi.img 映像文件
? ? ? ? ? ? ? ? ? ? host$ ubinize -o ubi.img -m 2048 -p 128KiB -s 512 -O 2048 ubinize.cfg
?
參數簡介:
-p: block size。
-m: NAND FLASH 的最小讀寫單元,一般為 page size
-o:輸出的 ubi.img 文件
?
當使用這些命令的過程中,如果遇到了問題請轉到:1),正確安裝數據包:-> ?5,安裝 mtd-utils 的疑難雜癥及其解決方法。
?
至此,生成的 ubi.img 映像文件應該是正確的。
?
二、UBIFS文件系統鏡像的燒寫
以下主要說以下將UBIFS鏡像燒寫到NAND FLASH中的三種方法。(1)在u-boot下通過nand write命令燒寫
使用ubinize命令制作的帶有卷標的UBIFS文件系統鏡像可以直接使用nand flash的燒 寫命令燒寫到NAND FLASH上,具體命令為:tftp 0xc1180000 ubi.img
nand erase 0x400000 0x7c00000
nand write.e 0xc1180000 0x400000 0x3660000
關于tftp,nand 等命令使用格式請參見u-boot的help。
?
(2) 在u-boot下通過ubi write命令燒寫
使用mkfs.ubifs命令制作的UBIFS文件系統鏡像可以使用命令ubi write燒寫到NAND ?FLASH上,具體命令為:1. 設置FLASH的分區,此處以128M NAND FLASH為例,分為5個區:
setenv mtdids nand0=nand0setenv mtdparts mtdparts=nand0:0x20000(u-boot env),0x20000(UBL),0x1c0000(u-boot),0x200000(kernel),0x7c00000(filesystem)
?
設置完后,使用mtdparts命令可以看到分區信息:
device nand0 <nand0>, # parts = 5
#: name size offset mask_flags
?0: u-boot env 0x00020000 0x00000000 0
1: UBL 0x00020000 0x00020000 0
2: u-boot 0x001c0000 0x00040000 0
3: kernel 0x00200000 0x00200000 0
4: filesystem 0x07c00000 0x00400000 0
active partition: nand0,0 - (u-boot env) 0x00020000 @ 0x00000000
2. 燒寫文件系統:
nand erase 0x400000 0x7c00000tftp 0xc1180000 ubifs.img
ubi create rootfs
ubi part nand filesystem
ubi write 0xc1180000 rootfs 0x1d1000
通過以上命令,可以將文件系統燒寫到第4個分區上,UBIFS文件系統卷標為rootfs。
3. 設置內核啟動參數:
setenv bootargs 'console=ttyS2,115200n8 ubi.mtd=4,2048 root=ubi0:rootfs rootwait rootfstype=ubifs rw ip=off'這樣就可以將燒寫的UBIFS文件系統用作根分區了。
4. 要在u-boot下使用ubi,mtd等命令,需要配置一下u-boot
具體可參見: http://blog.csdn.net/longfeey/article/details/5881433
(3)在linux系統下燒寫
在linux系統下,可以使用ubiformat工具燒寫使用ubinize工具制作的UBIFS文件系統映像,此處以燒寫到NAND FLASH的5個分區上為例,具體命令為:1. 查看FLASH的當前分區:
# cat /proc/mtddev: size erasesize name
mtd0: 00020000 00020000 "u-boot env"
mtd1: 00020000 00020000 "UBL"
mtd2: 00080000 00020000 "u-boot"
mtd3: 00200000 00020000 "kernel"
mtd4: 07c00000 00020000 "filesystem"
2. 擦除要燒寫的分區:
flash_eraseall /dev/mtd/mtd43. 燒寫UBIFS文件系統:
?ubiformat /dev/mtd/mtd4 -f /ubi.img4. 掛載燒寫好的文件系統:
ubiattach /dev/ubi_ctrl -m 4 -O 2048mount -t ubifs ubi0:rootfs /mnt/
5.在linux下創建UBIFS分區 ?
flash_eraseall /dev/mtd/mtd4ubiattach /dev/ubi_ctrl -m 4 -O 2048
ubimkvol /dev/ubi0 -N rootfs -s 100MiB
mount -t ubifs ubi0:rootfs /mnt/
(4)從主機linux燒寫ubi文件系統
<1>啟動開發板,通過nfs根文件系統啟動開發板<2>flash_eraseall /dev/mtd3
<3>ubiattach /dev/ubi_ctrl -m 3
<4>ubimkvol /dev/ubi0 -s 193MiB -N rootfs
<5>mount -t ubifs ubi0_0 /mnt
<6>cp -a /arago/* /mnt //arago/arago為要燒寫的文件系統,放在了nfs根文件系統之中。
<7>umount /mnt
<8>bootargs參數設置
ubi:setenv bootargs 'mem=364M@0x80000000 mem=320M@0x9FC00000 console=ttyO0,115200n8 noinitrd ip=off rootwait=1 rw ubi.mtd=3 rootfstype=ubifs root=ubi0:rootfs init=/init vmalloc=500M notifyk.vpssm3_sva=0xBF900000';saveenv
?
nfs: setenv bootargs mem=364M@0x80000000 mem=320M@0x9FC00000 console=ttyO0,115200n8 root=/dev/nfs rw nfsroot=192.168.2.104:/home/yxz1295324/targetfs,nolock ip=192.168.2.85:192.168.2.104:192.168.2.1:255.255.255.0::eth0:on vmalloc=500M notifyk.vpssm3_sva=0xBF900000
?
官方指導:
http://processors.wiki.ti.com/index.PHP/UBIFS_Support
參考網址:
http://processors.wiki.ti.com/index.php/UBIFS_Support#Flashing_UBIFS_image_to_a_NAND_partition
http://blog.sina.com.cn/s/blog_afeaebf00101figp.html
http://www.360doc.com/content/14/1015/18/18578054_417224516.shtml
http://www.360doc.com/content/15/1201/15/27345215_517173625.shtml
http://www.deyisupport.com/question_answer/dsp_arm/sitara_arm/f/25/t/59921.aspx
總結
以上是生活随笔為你收集整理的DM368开发 -- 制作ubifs文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 排序二叉树 SortBinaryTree
- 下一篇: Hi3516A开发-- UBI 文件系统