制作linux根文件系统
1、cramfs只读闪存文件系统,只读,通过建立目录,拷贝需要放到文件系统的文件到这个目录,例如建立rootfs目录的文件系统镜像命令为
mkcramfs rootfs rootfs.ramfs
mkcramfs下载地址http://sourceforge.net/projects/cramfs/
2、jfss2日志闪存文件系统,可读写,日志结构的文件系统,包含数据和元数据,jfss2记录了每个擦写块的擦写次数,当闪存上各个擦写块的擦写次数差距达到某个预订阀值,开始进行磨损平衡的调整,将擦写次数小的擦写块上的数据迁移到擦写次数大的擦写块上以达到磨损平衡的目的
,例如制作/bin目录为jffs2文件系统的命令为
mkfs.jffs2 -d /bin -o jffs2.img
3、jaffs,可读写,为嵌入式系统设计的闪存设备读写,比jffs2更快的启动速度和更好的闪存使用寿命保护机制,通过将其对应的驱动加入到内核中fs/yaffs/,并修改内核配置文件
mkyaffs可以将nand flash中的分区格式化为yaffs格式,如/bin/mkyaffs /dev/mtdblock/0将第一个mtd块设备分区格式化为yaffs
mkyaffsimage可以将某个目录生成为yaffs文件系统镜像
yaffs2用在chunk大于1k的nand flash,512+16B类型的只能用yaffs
在/dev/mtd/dev/mtdblock目录下创建一个新的mtd设备,然后就可以在上面创建yaffs系统,mount或umount
4、nfs网络文件系统,经常用来作为调试使用的文件系统,通过在挂接主机上生成交叉编译版本的目标文件,直接装载执行
5、修改bootloader的启动参数来支持不同文件系统启动,如
root=/dev/bon/2()
root=/dev/mtdblock/0
root=/dev/nfs
bootargs root=/dev/mtdblock2 rootfstype=cramfs rw console=ttySAC0,115200 init=/linuxrc mem=64m
bootargs noinitrd init=/linuxrc root=/dev/nfs nfsroot=192.168.8.16:/home/tetra/liangshoulong/cram ip=192.168.8.33:192.168.8.16 console=ttySAC0,115200
几个u-boot工具
printenv、setenv修改环境变量
tftp 0x33000000 uImage
bootm 0x33000000
如果设置了bootcmd,那么自动启动内核,设置为空,则手动启动内核
set bootcmd tftpboot 0x33000000 uImage\; bootm 0x33000000\;
6、使用busybox裁剪bin工具包
编译时选交叉编译前缀和安装目录,在gcc-4.3.2、linux-2.6.26.8、glibc-2.9、binutils-2.19.1和busybox-1.14.2环境下编译通过
7、文件说明
/dev是devfs或udev的挂载点,devfs的shell启动需要/dev/console,udev需要/dev下的console和null两个节点
/bin,/sbin,/usr/bin,/usr/sbin是安装busybox时产生
/lib,存放动态链接库
/etc,存放初始化脚本和其他配置
/proc,用来挂载系统信息虚拟文件系统,例如ifconfig就是使用/proc下的信息,proc文件系统使用初始化脚本挂载
/sys,用于挂载sysfs文件系统,配置内核时可选,使用初始化脚本挂载
/tmp,/mnt,/swp,/var不是必须
8、制作根文件系统root filesystem,包括使用busybox编译shell,编译库,制作脚本,制作根文件系统四部分
建立rootfs目录,拷贝busybox默认安装下的_install到rootfs下,建立dev,etc,lib,proc,sys,tmp文件夹,进入dev目录下,建立2个静态节点
mknod -m 660 null c 1 3
mknod -m 660 console c 5 1
使用udev时需要拷贝udevd,udevstart,udevadmin三个文件到/sbin下
访问映像文件的方法,如rootfs.cramfs
建立目录evb_rootfs,然后挂载
mount -o loop rootfs.cramfs evg_rootfs
进入evg_rootfs的lib,就可以进行拷贝库等操作了
制作根文件系统的方法
kernel command line:
console=ttyAM1,115200 init=/linuxrc1
表示从设备ttyAM1引导执行linuxrc1脚本
格式如下
#! /bin/ash
/bin/busybox init
制作脚本,配合busybox-1.14.2版时拷贝example下面的etc目录
/etc/inittab是根文件系统挂载之后必须的一个文件,列角了shell和整个系统初始化、关闭所需的命令,修改/etc/inittab加入一行
::askfirst:/bin/bash
表示启动这个叫bash的shell,shell名字取决于busybox编译时选择的shell,如hush,lash,msh之类
完整脚本参考busybox的example目录下文件,busybox可以支持没有inittab文件的环境,通过固定执行格式
还需要增加
/etc/fstab和/etc/init.d/rcS两个文件
文件/etc/fstab是用来执行mount -a命令的,是文件系统的挂载表,内容如下
# <file system> <mount pt> <type> <options> <dump> <pass>
/dev/root / ext2 rw,noauto 0 1
proc /proc proc defaults 0 0
devpts /dev/pts devpts defaults,gid=5,mode=620 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
文件/etc/init.d/rcS是用来执行/etc/init.d下所有初始化脚本的一个脚本,对于嵌入式系统,可直接写在/etc/init.d/rcS里面,内容如下
#! /bin/ash
/bin/mount -a
# Start udev
/bin/mount -t tmpfs tmpfs /dev
/sbin/udevd --daemon
/sbin/udevstart
# Configure net interface
/sbin/ifconfig lo 127.0.0.1 up
/sbin/ifconfig eth0 192.168.8.33 netmask 255.255.255.0 hw ether 33:33:33:33:33:33 up
/sbin/route add default gw 192.168.8.1 eth0
/sbin/inetd
/usr/sbin/makelinks
这里面使用的是udev,还需要有udev的配置脚本,可以直接拷贝使用udev目录下的etc/udev/udev.conf和etc/udev/rules.d里面的文件,到对应根目录下的/etc/udev目录
最后一步是制作文件映像,使用mkcramfs或mkyaffs之类工具