首次做UBIFS的移植,不足之处欢迎批评指正。
2010-7-15
自从linux2.6.27以后的内核版本都支持UBI文件系统了,新版本的uboot已经支持UBIFS了。
软件平台
VMware
Fedora-10
使用源码:
linux-2.6.30.4.tar.bz2
u-boot-2010.06-rc1.tar.bz2
硬件环境mini2440—64M NAND
关于uboot的移植可以参考《嵌入式Linux之我行》中uboot的移植,那里写得比较详细。我也是参考了其中的文章。
1、 uboot的UBI的移植
关于uboot的UBI的移植几乎没有说明介绍,
移植首先要保证你的flash驱动能够跑起来,我是在nand flash 上跑的UBI。
刚开始的时候我也没有什么头绪,只能够从uboot的readme开始查找一些蛛丝马迹。
- MTD Support (mtdparts command, UBI support)
CONFIG_MTD_DEVICE
Adds the MTD device infrastructure from the Linux kernel.
Needed for mtdparts command support.
CONFIG_MTD_PARTITIONS
Adds the MTD partitioning infrastructure from the Linux
kernel. Needed for UBI support.
因此呢,要UBI支持首先得要MTD支持,因此在配置文件中要添加以上两项的定义。
要移植UBI还要添加:
#define CONFIG_CMD_UBIFS
#define CONFIG_CMD_UBI
总的关于UBI的部分是以下几个宏
/****MTD Support (mtdparts command, UBI support)****/
#if 1
#define CONFIG_MTD_DEVICE 1
#define CONFIG_MTD_PARTITIONS 1
#define CONFIG_CMD_MTDPARTS
#define CONFIG_CMD_UBIFS
#define CONFIG_CMD_UBI
#define CONFIG_LZO 1
#define CONFIG_RBTREE 1
#endif
同时呢要给NAND建立个默认的分区。方便以后操作。我的分区如下:
#define MTDIDS_DEFAULT "nand0=nandflash0"
#define MTDPARTS_DEFAULT "mtdparts=nandflash0:320k@0(uboot)," \
"64k(params)," \
"2m(kernel)," \
"-(root)"
需要注意的是增加UBI的支持之后uboot会增大到260多KB,在NAND中启动,需要修改
//copy U-Boot to RAM
ldr r0, =TEXT_BASE //传递给C代码的第一个参数:u-boot在RAM中的起始地址
mov r1, #0x0 //传递给C代码的第二个参数:Nand Flash的起始地址
mov r2, #0x50000 //传递给C代码的第三个参数:u-boot的长度大小(320KB)
bl nand_read_ll //此处调用C代码中读Nand的函数,现在还没有要自己编写实现
如果uboot传给nand_read_ll 的uboot的参数小于uboot的长度的话,uboot跑不起来,移植的时候被这个问题搞得很郁闷。
另外还有一个地方就是编译的时要求CONFIG_SYS_MALLOC_LEN大于等于512KB,下面两个没有要求我也给改了。
#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE+ 512*1024)
#define CONFIG_SYS_GBL_DATA_SIZE 512 /* size in bytes reserved for initial data */
#define CONFIG_STACKSIZE (512*1024) /* regular stack */
如果没改的话会报错。
这个时候就可以make 了,如果顺利的话会编译出uboot-bin在根目录下。
再通过友善提供的vivi a命令下载到nand 中,启动如下:
U-Boot 2010.06-rc1 (Jul 15 2010 - 16:48:33)
DRAM: 64 MiB
Flash: 2 MiB
NAND: 64 MiB
*** Warning - bad CRC or NAND, using default environment
In: serial
Out: serial
Err: serial
Net: dm9000
Hit any key to stop autoboot: 0
相关的ubi命令如下:
到这里uboot的UBI移植完成了。
2. 第二步是内核对UBI的支持。
linux-2.6.30.4的内核已经包含UBI了
1)Device Drivers --->Memory Technology Device (MTD) support --->UBI - Unsorted block images --->Enable UBI
2)File systems --->Miscellaneous filesystems --->UBIFS file system support
这样我们的内核就支持UBIFS文件系统了
3. UBIFS工具的编译
我是将ubifs直接作为根文件系统挂载的,需要mkfs.ubifs这个工具我是从git直接下载的最新版的mtd-utils,同时编译mtd-utils还需要两个库。
lzo-2.03,zlib-1.2.3 下载完之后就直接按照默认的方式make。
注意:我们是在x86平台上将rootfs文件系统打包成UBIFS格式的因此呢不能够修改编译工具。
最后在mkfs.ubifs目录下生产mkfs.ubifs。
mkfs.ubifs的使用相关参数,照着它的Examples使用就可以了,具体参数的设置可以查看u-boot ubi分区时候所打印出来的参数。
Usage: mkfs.ubifs [OPTIONS] target
Make a UBIFS file system image from an existing directory tree
Examples:
Build file system from directory /opt/img, writting the result in the ubifs.img file
mkfs.ubifs -m 512 -e 128KiB -c 100 -r /opt/img ubifs.img
The same, but writting directly to an UBI volume
mkfs.ubifs -r /opt/img /dev/ubi0_0
Creating an empty UBIFS filesystem on an UBI volume
mkfs.ubifs /dev/ubi0_0
将rootfs打包成镜像:
./mtd-utils/mkfs.ubifs/mkfs.ubifs -m 512 -e 15872 -c 3944-r rootfs -o ubifs.img
Uboot传给内核的启动参数
#define CONFIG_BOOTARGS
"ubi.mtd=3 root=ubi0:rootfs rootfstype=ubifs console=ttySAC0 init=/linuxrc rw"
注意:因为还没找到原因挂载之后文件系统是只读的,所以就加了个rw,有人解决之后请联系我,不胜感激。
内核的默认启动参数和uboot传过来的是一样的。
4、UBI的使用
1内核的烧写
tftp 0x32000000 zImage 将内核通过tftp下载到内存中
nand erase 0x60000 0x200000
nand write 0x32000000 0x60000 0x200000
2 文件系统的烧写
使用默认的分区对nand进行分区:mtdpart default
1)擦除root分区 nand erase root
2)对root分区进行ubi格式化 ubi part root
Creating 1 MTD partitions on "nand0":
0x26000033fc64f4-0x400000000000000 : "<NULL>"
UBI: attaching mtd1 to ubi0
UBI: physical eraseblock size: 16384 bytes (16 KiB)
UBI: logical eraseblock size: 15872 bytes
UBI: smallest flash I/O unit: 512
UBI: sub-page size: 256
UBI: VID header offset: 256 (aligned 256)
UBI: data offset: 512
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=3"
UBI: MTD device size: 261993005056 MiB
UBI: number of good PEBs: 3944
UBI: number of bad PEBs: 0
UBI: max. allowed volumes: 92
UBI: wear-leveling threshold: 4096
UBI: number of internal volumes: 1
UBI: number of user volumes: 0
UBI: available PEBs: 3901
UBI: total number of reserved PEBs: 43
UBI: number of PEBs reserved for bad PEB handling: 39
UBI: max/mean erase counter: 1/0
3)创建rootfs YH2440 # ubi create rootfs
YH2440 # ubi create rootfs
Creating dynamic volume rootfs of size 61916672
4)将文件系统下载到内存 tftp 0x32000000 ubifs.img
YH2440 # tftp ubifs.img
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
could not establish link
Using dm9000 device
TFTP from server 192.168.1.80; our IP address is 192.168.1.252
Filename 'ubifs.img'.
Load address: 0x32000000
Loading: #################################################################
#################################################################
#################################################################
####################################
done
Bytes transferred = 3380736 (339600 hex)
5)将文件系统烧写到rootfs 中YH2440 # ubi write 0x32000000 rootfs 0x339600
YH2440 # ubi write 0x32000000 rootfs 0x339600
Volume "rootfs" found at volume id 0
之后启动就可以看到UBIFS可以运行了。
YH2440 # boot
NAND read: device 0 offset 0x60000, size 0x200000
2097152 bytes read: OK
## Starting application at 0x32000000 ...
Uncompressing Linux............................................................................................................................... done, booting the kernel.
Linux version 2.6.30.4 (root@luoxiaotan.org) (gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72) ) #11 Wed Jul 14 16:24:33 CST 2010
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177
CPU: VIVT data cache, VIVT instruction cache
Machine: S3C2440
Warning: bad configuration page, trying to continue
Memory policy: ECC disabled, Data cache writeback
CPU S3C2440A (id 0x32440001)
S3C24XX Clocks, (c) 2004 Simtec Electronics
S3C244X: core 405.000 MHz, memory 101.250 MHz, peripheral 50.625 MHz
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
Built 1 zonelists in Zone order, mobility grouping off. Total pages: 4064
Kernel command line: ubi.mtd=3 root=ubi0:rootfs rootfstype=ubifs console=ttySAC0 init=/linuxrc rw
NR_IRQS:85
irq: clearing subpending status 00000003
irq: clearing subpending status 00000002
PID hash table entries: 64 (order: 6, 256 bytes)
Console: colour dummy device 80x30
console [ttySAC0] enabled
Dentry cache hash table entries: 2048 (order: 1, 8192 bytes)
Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)
Memory: 16MB = 16MB total
Memory: 12076KB available (3UBIFS: mounted UBI device 0, volume 0, name "rootfs"
UBIFS: file system size: 61456384 bytes (60016 KiB, 58 MiB, 3872 LEBs)
UBIFS: journal size: 8110592 bytes (7920 KiB, 7 MiB, 511 LEBs)
UBIFS: media format: w4/r0 (latest is w4/r0)
UBIFS: default compressor: lzo
UBIFS: reserved for root: 0 bytes (0 KiB)
VFS: Mounted root (ubifs filesystem) on device 253:1.
Freeing init memory: 120K
Please press Enter to activate this console.
BusyBox v1.13.3 (2010-07-13 08:51:35 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.