snifer

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

0
阅读(2464)

熟悉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、  添加其他需要目录

$ mkdir  dev 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=8192 initrd.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!