首页 > 编程知识 正文

嵌入式必须会linux吗,rootfs文件系统打包镜像

时间:2023-05-05 20:43:05 阅读:38970 作者:968

一.什么是文件系统

文件系统是存储在磁盘或分区上的目录结构,包括CD、软盘、闪存驱动器和其他存储设备。 适用的磁盘设备可以包含一个或多个文件系统。 要进入文件系统,必须首先挂载文件系统。 要装载文件系统,必须指定装载点。

二、主要嵌入式设备采用的文件系统

* Linux上rootfs是必不可少的。 PC主要安装有ramdisk和直接挂载HD(Harddisk )上的根文件系统; 中一般不是从硬盘启动,而是从Flash启动。 最简单的方法是使rootfs load成为RAM的RAMDisk。 稍微复杂的是直接从Flash导入的Cramfs。 更复杂的是,在Flash中创建分区并构建文件系统,如JFFS2。

* RAMDisk将创建的rootfs压缩并写入Flash,然后在启动时从Bootloader load解压缩到RAM并装载到/。 此方法操作简单,但RAM中的文件系统未经压缩,因此需要占用许多嵌入式系统中的稀缺资源RAM。

ramdisk是指在内存空间中模拟硬盘分区。 ramdisk通常使用磁盘文件系统压缩存储在flash中,在系统初始化时解压缩到SDRAM中并装载根文件系统。 在linux系统上,ramdisk可以格式化和加载,并且在linux内核2.0/2.2中受支持。 其不足之处有以下两个:另一个由2.4个内核支持。 这是通过ramfs实现的。 他虽然不能格式化,但很容易使用,其大小根据需要的空间而增减,是目前linux上常用的ramdisk技术。

* initrd是RAMDisk的格式,kernel 2.4以前是image-initrd。 Kernel 2.5引入了cpio-initrd,大大简化了Linux的启动过程,并附上了Linux的基本哲学: Keep it simple。 stupid(kiss ) .但是cpio-initrd没有作为新格式得到广泛测试,嵌入式Linux主要采用的是image-initrd。

* CRAMfs是一个简单的文件系统,由雪白的萝莉编写,具有压缩绿色,也可以直接从Flash运行。 因为不需要加载到RAM中,所以可以节约RAM。 但是,由于Cramfs是只读的,对于需要在运行时变更的目录(例如/etc、/var、/tmp )存在很多不便,所以通常将这些目录设为ramfs等可写入的fs。

* SquashFS是对Cramfs的增强。 突破了CRAMfs的一些限制,在Flash和ram的使用量方面也有优势。 但是,根据开发者的说法,性能可能比Cramfs差。 这也是一种新方法,在嵌入式系统被采用之前,需要经过更多的测试

三、建设包含所有档案的目录

1。 生成用于安装文件系统的目录rootfs

2。 mkdirqjdyjdevetclibprocsqjdyjtmpusrvar

3.ln-fsq jdyj/busybox linuxrc (使用busybox ) ) ) ) ) )。

4 .到系统/dev将所有设备组合成一个包,复制到dev下(最快的方法) )。 或者使用mknod自己制作所需的设备。 我自己如下使用。

CRw-Rw-1根路由5,12006-02-241:12控制台

crw-rw-rw-1根路由5,642006-02-241:12 cua 0

crw-rw-rw-1根根根63,02006-02-241:12 dk0

crw-rw-rw-1根根根63,12006-02-241:12 dk1

drwxr-xr-x2根路由40962006-02-241:12闪存

brw-rw-rw-1根路由3,02006-02-241:12 hda

crw-rw-rw-1根根根36,102006-02-241:12 IPSec

crw-rw-rw-1根路由241,02006-02-241:12 IX npe

crw-rw-rw-1根路由1,22006-02-241:12 kmem

crw-rw-rw-1根根根126,02006-02-241:12 ledman

lrwxrwxrwx 1根根根162007-09-1914336008 log-/tmp/var/log/log

crw-rw-rw-1根路由1,12006-02-241:12 mem

crw-rw-rw-1根根根90,02006-02-241:12 MTD 0

宝马- rw-rw

- 1 root root 31, 0 2006-02-24 13:12 mtdblock0

brw-rw-rw- 1 root root 31, 1 2006-02-24 13:12 mtdblock1

brw-rw-rw- 1 root root 31, 2 2006-02-24 13:12 mtdblock2

brw-rw-rw- 1 root root 31, 3 2006-02-24 13:12 mtdblock3

brw-rw-rw- 1 root root 31, 4 2006-02-24 13:12 mtdblock4

brw-rw-rw- 1 root root 31, 5 2006-02-24 13:12 mtdblock5

brw-rw-rw- 1 root root 31, 6 2006-02-24 13:12 mtdblock6

crw-rw-rw- 1 root root 90, 1 2006-02-24 13:12 mtdr0

crw-rw-rw- 1 root root 1, 3 2006-02-24 13:12 null

crw-rw-rw- 1 root root 108, 0 2006-02-24 13:12 ppp

crw-r–r– 1 root root 5, 2 2006-03-29 15:56 ptmx

drwxr-xr-x 2 root root 4096 2006-03-29 15:56 pts

crw-rw-rw- 1 root root 2, 0 2006-02-24 13:12 ptyp0

brw-rw-rw- 1 root root 1, 0 2006-02-24 13:12 ram0

crw-rw-rw- 1 root root 1, 8 2006-02-24 13:12 random

crw-rw-rw- 1 root root 5, 0 2006-02-24 13:12 tty

crw-rw-rw- 1 root root 4, 0 2006-02-24 13:12 tty0

crw-rw-rw- 1 root root 3, 0 2006-02-24 13:12 ttyp0

crw-rw-rw- 1 root root 4, 64 2006-02-24 13:12 ttyS0

crw-rw-rw- 1 root root 1, 9 2006-02-24 13:12 urandom

crw-rw-rw- 1 root root 1, 5 2006-02-24 13:12 zero举例: mknod console c 5 1 这样 crw-rw-rw- 1 root root 5, 1 2006-02-24 13:12 console

5。将编译好的busybox拷贝到/qjdyj下面,除了busybox外,所有其他的命令都是他的link

ash chgrp clear dd echo fgrep gzip ip ls modprobe mv ping pwd sed stty tar true zcat busybox chmod cp df egrep grep hostname kill mkdir more netstat ping2file rm sh sync tftp umount cat chown date dmesg false gunzip ifconfig ln mknod mount pidof ps rmdir sleep sysinfo touch uname

所有的命令你可以在busybox下面用make menuconfig来增减

6。同样/sqjdyj下面也是busybox的link

halt ifconfig init insmod klogd losetup lsmod mkswap modprobe reboot rmmod route swapoff swapon

7。同样/usr/qjdyj下面也是busybox的link

basename dirname env free id logger reset tail tr tty uptime which xargs

awk cut du expr head killall mkfifo sort test traceroute uniq wc whoami yes

上面几乎是最全的link,各个看官可以酌情删减,不过link也不占什么空间!

8。同样/usr/sqjdyj下面放着所有编译完的可执行文件,具体就不多说了

9。非常重要之/lib,务必重视

找到你编译环境的target目录,把需要的lib文件先用strip压縮(非target目录下的,而已编译环境提供的strip),先把最基本的libc, ld等等,必须同样做跟target/lib里面一样的link。

然后根据特定的应用加相应的lib,不要把不用的加进去,lib比较占空间。

10。在/etc下面加上需要的配置文件,最最重要的是rcS

#!/qjdyj/sh

export PATH=/sqjdyj:/qjdyj:/usr/sqjdyj:/usr/qjdyj:/usr/sqjdyj/scripts

UTC=yes

mount -n -t proc proc /proc

mount -n -t ramfs ramfs /tmp

mount -n -t devpts devpts /dev/pts

# build var directories

/qjdyj/mkdir -m 0777 /tmp/var

/qjdyj/mkdir -m 0777 /var/lock

/qjdyj/mkdir -m 0777 /var/log

/qjdyj/mkdir -m 0777 /var/run

/qjdyj/mkdir -m 0777 /var/tmp

#/qjdyj/mkdir -m 0777 /tmp/etc

#/qjdyj/cp -a /usr/etc/* /etc

#/qjdyj/cp -a /usr/dev/* /dev/

# loads the NPE ethernet modules into the kernel.

insmod /lib/modules/2.6.13.2/intel/ixp400.ko

# Firmware code for NPE Engine.

cat /etc/IxNpeMicrocode.dat > /dev/ixNpe

insmod /lib/modules/2.6.13.2/intel/ixp400_eth.ko netdev_max_backlog=500

insmod /lib/modules/led.ko

insmod /lib/modules/push_button.ko

下面的具体应用没有再举例加上了,这个是系统init必须的。

其他的情况类似如此了,下面里面给了一个lunksys的GPL项目的target。

四、生成一个ramdisk

#!/qjdyj/sh

MODULE_NAME=ramdisk

RAMPATH=`pwd`

TMPPATH=${RAMPATH}/tmp

SOURCE=${RAMPATH}/../target

if [ ! -d ${TMPPATH} ]

then

mkdir ${TMPPATH}

fi

if [ `whoami` != ‘root’ ]

then {

echo "You should run the shell as root, Please rerun as a root."

echo "Aborting."

exit 1

}

fi

# Clear in tmp path

rm -rf ${TMPPATH}/tmpmnt

rm -rf ${TMPPATH}/ramrootfs

mkdir ${TMPPATH}/tmpmnt

# Clear the old ramdisk

rm -f ${RAMPATH}/$MODULE_NAME

# Make a temp file which size is suitable

dd if=/dev/zero of=${TMPPATH}/ramrootfs bs=1k count=6144

# Create a ext2 filesystem

mke2fs -F -m 0 -i 2000 ${TMPPATH}/ramrootfs

# Mount it to tmpmnt/

mount -o loop -t ext2 ${TMPPATH}/ramrootfs ${TMPPATH}/tmpmnt

# Copy everything from kernel to this.

cd ${TMPPATH}/tmpmnt

echo ${SOURCE}

cp -av ${SOURCE}/* .

cd ${TMPPATH}

# Unmount it the ext2 filesystem

umount ${TMPPATH}/tmpmnt

cat ${TMPPATH}/ramrootfs | gzip -9 > /${RAMPATH}/ramdisk

echo Copying ramdisk image to ${RAMPATH}

sync

这里给出一个自动生成脚本!

五、生成一个cramfs

找到cramfs的toolchain。/mkcramfs -r $(FS1_DIR) $(FS_NAME).1

六、生成一个mksquashfs

找到squashfs的toolchain。/mksquashfs $(FS_DIR) $(FS_NAME) -noappend -be -lzma -no-fragments -noI

做文件系统最困难和最可能出问题的地方是在/lib库和/dev方面,请大家多注意这两方面。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。