部署linux系统

一、文件系统类型

EXT2/EXT3

JFS

cramfs

JFFS/JFFS2

YAFFS

 

二、MTD类型设备

MTD(Memory Technology Device)是Linux内核采纳的一种设备子系统,它为底层的存储芯片提供了统一的设备接口。MTD子系统接口如图:

MTD芯片驱动程序必须向MTD子系统注册,通过结构体mtd_info给add_device()函数提供一组缺省的回调函数和属性。MTD驱动程序必须实现这些回调函数,让MTD子系统能够通过函数调用执行删除、读出、写入和同步等操作。

 

MTD子系统同时可以提供2类MTD驱动程序。一类驱动程序是MTD设备地址空间的映射,提供直接访问设备的操作,属于字符设备驱动;另一类驱动程序则为建立文件系统提供基础,属于快设备驱动。

 

内核配置界面MTD子菜单的选项如下:

1 Direct char device access to MTD devices

2 Caching block device access to MTD devices

3 Readonly block device access to MTD devices

4 FTL(Flash Translation Layer) support

这是FTL(Flash传输层)驱动程序。它为PCMCIA标准的原始Flash转换层提供支持。它在Flash设备上使用一种伪文件系统来仿真块设备的512B扇区,从而在设备上建立普通的文件系统。

5 NFTL(NAND Flash Translation Layer) support

这是NFTL(NAND Flash转换层)驱动程序。它为M_System的DiskOnChip设备的NANDFlash转换层提供支持。它在Flash设备上使用一种伪文件系统来仿真块设备的512B扇区,从而在设备上建立普通的文件系统。

 

三、部署Linux系统

3.1 安装MTD工具

有些MTD工具必须安装到目标机上执行,例如:flash_erase。也有些既可以在开发主机上使用,也可以在目标机上使用,例如:mkfs.jffs2。这样就需要分别为开发主机和目标机安装编译这些工具。

 

3.1.1 为开发主机安装MTD工具

 

如果在主机端可以使用移动MTD存储设备,就需要创建MTD设备的节点。在mtd/utils目录下有MAKEDEV的脚本,到/dev目录下执行这个脚本,就可以自动创建MTD相关的节点。

 

3.1.2 为目标机安装MTD工具

大多数嵌入式系统使用板上Flash,无法移到主机端操作,因此还需要在目标机文件系统中安装MTD工具。

目标机安装使用MTD工具的时候,需要zlib库的支持,安装zlib库:

 

这样zlib库就安装到/usr/local/arm/3.3.2/rootfs/lib目录下了。

接下来为目标机安装MTD工具集。修改mtd/util/Makefile中的CROSS变量定义为交叉编译器的前缀。

 

然后交叉编译安装MTD工具

 

这样,目标机的MTD工具就安装到/usr/local/arm/3.3.2/rootfs/bin目录下了。后面部署MTD的操作主要使用目标机端的工具。

 

 

3.2 使用RAMDISK设备

RAMDISK就是把指定的内存区域模拟成磁盘程序,它属于块设备驱动程序

基于RAMDISK的块设备,可以建立EXT2格式的磁盘文件系统。在内核启动之前,通常需要把EXT2文件系统的压缩镜像解压到内存指定位置,然后就可以把RAMDISK设备挂载成根文件系统。

RAMDISK的最大特点是运行速度快,因为文件系统内容全部保存在内存中。反过来就成了缺点,因为它会占用一些物理内存,而且系统重启无法保存上次运行中的信息。所以,RAMDISK比较适合较小并且不需要永久保存数据的文件系统。

在磁盘文件系统中,/boot/initrd-x.x.x.img文件就是一个RAMDISK映像。Initrd(Initial RAMDISK)一般可以用来辅助引导Linux系统。它包含一个基本的文件系统和必要的驱动程序(例如:EXT3)以及文件系统检查修复工具。还包含一个linuxrc的脚本,执行initrd具体操作命令,实现加载一些模块和安装文件系统等。

 

启动过程中,Bootloader先把initrd映像加载到内存,内核再把RAMDISK设备挂接成根文件系统,然后加载需要的驱动程序并且挂接真正的硬盘分区,最后把硬盘分区的文件系统转换成根文件系统。

 

在使用Flash的嵌入式系统中,RAMDISK一般可以直接作为根文件系统使用,也可以结合可存储的文件系统使用,例如:把一块JFFS2类型的文件系统MTD分区挂接到指定目录下。

 

在Linux主机系统下面,通常可以通过下列步骤制作RAMDISK映像。

(1)创建空的文件系统映像

$ dd if=/dev/zero of=initrd.img bs=1k count=4096

$ mkfs.ext2 -F initrd.img

 

上面的命令创建了一个4096KB的文件系统镜像,并通过/dev/zero设备进行初始化清空。

(2)作为loop设备挂接RAMDISK映像

$ mkdir /mnt/initrd

$ mount -t ext2 -o loop initrd.img /mnt/initrd

这样,/mnt/initrd目录就对应initrd.img存储设备了。

(3)创建目录并安装文件

$ cd /mnt/initrd

$ mkdir bin dev etc lib mnt proc sbin sys usr

然后再创建设备节点,添加相应的程序。

(4) 压缩映像

把目标板需要的文件系统内容添加上去以后,先要把loop设备卸载下来,然后用gzip命令把映像压缩一下

$ cd ~

$ unmount /mnt/initrd

$ gzip --best -c initrd.img > initrd.img.gz

这样一个压缩的RAMDISK映像就制作好了。使用RAMDISK还需要配置内核命令行参数,指定RAMDISK的物理内存地址。例如把上面4MB的RAMDISK解压到0x30800000,内核的命令行参数应该包含下列内容。

root=/dev/ram rw initrd=0x30800000,4M

另外,还可以使用转换成U-Boot的格式,这样U-Boot可以识别这个RAMDISK映像,并且解压到内存中。

$ mkimage -n 'RAM disk' -A arm -O linux -T ramdisk -C gzip -d initrd.img.gz initrd.uboot

 

3.3 使用MTD设备和JFFS2文件系统

Linux内核的MTD驱动可以支持分区功能,它可以把一块Flash分成几个区。比如可以分成Boot、Kernel、和Filesystem分区,分别存储Bootloader、内核和文件系统。

对于Flash分区表是通过mtd_partition结构体来描述的。对于不同的目标板,既可以通过引导程序传递分区参数,也可以直接在程序中定义。以内核源码的/driver/mtd/maps/phymaps.c为例,它可以支持从内核命令行参数或者Redboot读取分区表,也可以直接添加下列程序的定义结构体。

 

为MTD驱动添加分区表并且驱动成功以后,在目标机端可以看到MTD有关的其他信息。还可以通过/proc/mtd接口查看分区信息。

 

接下来制作JFFS2的文件系统。通过mkfs.jffs2工具可以把为目标板定制好的文件系统目录转换成一个JFFS2映像。假设定制文件系统目录rootfs在当前目录下,执行下列命令。

#mkfs.jffs2 -r rootfs -o rootfs.jffs2

然后通过MTD工具把内核映像和文件系统映像写到对应的MTD分区。对于板上的Flash,MTD工具需要运行在目标板上。

# flash_eraseall /dev/mtd1

# cp uImage /dev/mtd1

# flash_eraseall /dev/mtd2

# cp rootfs.jffs2 /dev/mtd2

这样就可以把内核映像和文件系统映像写到MTD中了。可以检查一下JFFS2文件系统是否能够正常挂接。

#mount -t jffs2 /dev/mtd/block2 /mnt

#ls

#umount /mnt

最后要让目标板挂接本地的文件系统,还要修改命令行参数root。

root=/dev/mtdblock2 rw

 

3.4系统启动和升级

对于Flash存储设备来说,内核和文件系统一般都是作为映像烧写到Flash中的。因此升级的过程还需要相关的工具。MTD工具在这里仍然有效,但是多数情况下不会把这些工具包含到产品中去。多数Bootloader具备擦写Flash的功能。可以作为软件更新的工具。

下面以S3C2410的U-Boot为例,说明部署内核和文件系统映像的过程。系统升级过程也完全可以这样做。

==> tftp 30100000 uImage

==> erase 40000 13ffff

==> cp.b 30100000 40000 <size>

==> tftp 30100000 initrd.uboot

==> erase 140000 3fffff

==> cp.b 30100000 100000 <size>

这样uImage写到Flash物理地址0x40000,initrd.uboot写到Flash物理地址0x140000。这样U-Boot的bootm命令就可以从本地启动Linux系统了

==> bootm 40000 140000

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值