snifer

【原创】Linux 文件系统移植全解密

0
阅读(2437)

熟悉Linux文件系统目录结构,创建自己的文件系统,通过NFS方式集成测试,用文件系统生成ramdisk文件系统映象文件。

环境:

1、 Ubuntu 10.10发行版

2、 u-boot-2010.03

3、 FS2410平台

4、 交叉编译器 arm-none-linux-gnueabi-gcc-4.3.2

【实验步骤】

一、根文件系统制作

1、 源码下载

我们选择的版本是busybox-1.17.3.tar.bz2下载路径为:

http://busybox.net/downloads/

2、 解压源码

$tar xvf busybox-1.17.3.tar.bz2

3、 进入源码目录

$tar xvf busybox-1.17.3.tar.bz2

4、 配置源码

$ make menuconfig

Busybox Settings --->

Build Options --->

[*] Build BusyBox as a static binary (no shared libs)

[ ] Force NOMMU build

[ ] Build with Large File Support (for accessing files > 2 GB)

(arm-none-linux-gnueabi-) Cross Compiler prefix

() Additional CFLAGS

5、 编译

$ make

6、 安装

busybox默认安装路径为源码目录下的_install

$ make install

7、 进入安装目录下

$ cd _install

$ ls

bin linuxrc sbin usr

8、 添加其他需要目录

$ mkdirdev etc mnt proc var tmp sys root

9、 添加库

将工具链中的库拷贝到_install目录下

$ cp /home/linux/toolchain/arm-none-linux-gnueabi/lib/ ./

删除lib下的所有目录、.o文件和.a文件

对库进行瘦身以减小文件系统的大小

$ arm-none-linux-gnueabi-strip lib/*

10、 添加系统启动文件

etc下添加文件inittab,文件内容如下:

#this is run first except when booting in single-user mode.

:: sysinit:/etc/init.d/rcS

# /bin/sh invocations on selected ttys

# Start an "askfirst" shell on the console (whatever that may be)

::askfirst:-/bin/sh

# Stuff to do when restarting the init process

::restart:/sbin/init

# Stuff to do before rebooting

::ctrlaltdel:/sbin/reboot

etc下添加文件fstab,文件内容如下:

#device mount-point type options dump fsck order

proc /proc proc defaults 0 0

tmpfs /tmp tmpfs defaults 0 0

sysfs /sys sysfs defaults 0 0

tmpfs /dev tmpfs defaults 0 0

这里我们挂在的文件系统有三个procsysfstmpfs,在内核中procsysfs默认都支持,而tmpfs是没有支持的,我们需要添加tmpfs的支持

修改内核配置:

File systems --->

Pseudo filesystems --->

[*] Virtual memory file system support (former shm fs)

[*] Tmpfs POSIX Access Control Lists

重新编译内核

etc下创建init.d目录,并在init.d下创建rcS文件,rcS文件内容为:

#!/bin/sh

# This is the first script called by init process

/bin/mount -a

rcS添加可执行权限:

chmod +x init.d/rcS

etc下添加profile文件,文件内容为:

#!/bin/sh

export HOSTNAME=farsight

export USER=root

export HOME=root

#export PS1="\[\u@\h \W\]\$ "

export PS1="[$USER@$HOSTNAME \W]\# "

PATH=/bin:/sbin:/usr/bin:/usr/sbin

LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH

export PATH LD_LIBRARY_PATH

11、 设备文件创建

根文件系统中有一个设备节点是必须的,在dev下创建console节点

$ mknod dev/console c 5 1

二、NFS测试

1、备份/source/rootfs

$ cp /source/rootfs /source/rootfs_bak -a

2、将我们的文件系统拷贝到/source目录下

$ cp _install /source/rootfs –a

3、设置uboot环境变量

# setenv bootcmd tftp 33000000 zImage\; go 33000000

# setenv bootargs root=nfs nfsroot=192.168.1.111:/source/rootfs init=/linuxrc console=ttySAC0,115200 ip=192.168.1.112

# savenv

重新启动开发板,查看是否能够正常挂载,功能是否正常

三、制作ramdisk文件系统

通过NFS测试以后,就可以制作ramdisk文件系统了,具体如下:

1、制作一个大小为8M的虚拟磁盘

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

2、格式化这个虚拟磁盘为ext2

$ mkfs.ext2 -F initrd.img

3、在mount下面创建initrd目录作为挂载点

$ mkdir /mnt/initrd

4、将这个虚拟磁盘挂载到/mnt/initrd

注意这里的initrd.img不要和Ubuntu根目录下的initrd.img弄混了,同时initrd.img不能存放在rootfs目录中

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

5、将我们的文件系统写入initrd.img

将测试好的文件系统里的内容全部拷贝到/mnt/initrd目录下面

$ cp /source/rootfs/* /mnt/initrd –a

6、卸载initrd

$ umount /mnt/initrd

7、压缩initrd.imginitrd.img.gz

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

8、配置内核支持RAMDISK

制作完initrd.img.gz后,需要配置内核支持RAMDISK作为启动文件系统

Device Drivers

SCSI device support --->

<*> SCSI disk support

Block devices --->

<*>RAM disk support

(1)Default number of RAM disks

(8192) Default RAM disk size (kbytes) (修改为8M)

General setup --->

[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support

重新编译内核

9、在U-BOOT命令行重新设置启动参数:

# setenv bootcmd tftp 33000000 zImage \; tftp 30800000 initrd.img.gz \; go 33000000

# setenv bootargs root=/dev/ram rw init=/linuxrc initrd=0x30800000,8M console=ttySAC0,115200

# savenv

重新启动开发板查看能否正常启动

四、制作cramfs文件系统

1cramfs文件系统镜像制作

由于系统提供制作cramfs文件系统的工具,则可以利用。具体操作如下;

$ mkfs.cramfs rootfs rootfs.cramfs

2、将rootfs.cramfs拷贝到/tftpboot目录下

$ cp rootfs.cramfs /tftpboot

3、将rootfs.cramfs烧写到nand flash的第三个分区上

u-boot下执行如下命令

# tftp 30008000 rootfs.cramfs

# nand erase 500000 800000

# nand write 30008000 500000 800000

4、重新设置u-boot启动参数

# setenv bootcmd tftp 33000000 zImage\; go 33000000

# setenv bootargs root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200

# savenv

启动开发板,测试是否成功。

[root@farsight /root] # ls /

bin etc linuxrc sbin tmp var

dev lib mnt proc test usr

[root@farsight /root] # mkdir test

mkdir: Cannot create directory `test': Read-only file system

这是由cramfs文件系统决定的,cramfs格式的文件系统是只读文件系统。

五、制作jffs2文件系统

1zlib的编译

解压zlib-1.2.3.tar.bz2并进入zlib-1.2.3配置编译安装

$ tar xvf zlib-1.2.3.tar.bz2

$ cd zlib-1.2.3

$ ./configure

$ make

$ make install

2mtd工具编译

解压mtd-snapshot-20050519.tar.bz2并进入mtd/util编译安装

$ tar xvf mtd-snapshot-20050519.tar.bz2

$ cd mtd/util

$ make

$ make install

这样我们的系统里就有了mkfs.jffs2这个工具了

3jffs2文件系统镜像制作

$ mkfs.jffs2 -r /source/rootfs -o rootfs.jffs2 -e 0x4000 --pad=0x800000 -n

$ cp rootfs.jffs2 /tftpboot

4jffs2文件系统烧写

# tftp 30008000 rootfs.jffs2

# nand erase 500000 800000

# nand write 30008000 500000 800000

5、设置u-boot启动参数

# setenv bootcmd tftp 33000000 zImage\; go 33000000

# setenv bootargs root=/dev/mtdblock2 init=/linuxrc rootfstype=jffs2 rw

console=ttySAC0,115200

# savenv

重新启动开发板,一切OK!

Baidu
map