1.最小根文件系统制作

时间:2022-02-10 00:35:31

 

根据busybox源码可知,最小的根文件系统要具备如下条件:

第一.init(来源于busybox,主要是一些命令,如cp,ls等,等编译busybox时,就得到)

第二./dev/console 和/dev/null(open()打开设备)

第三./etc/inittab

第四.配置指定的程序

第五.C库(r如:标准输入,输出,错误等)

--根据韦东山老师电子书参考--

【环境】

1:Ubuntu 10.10

2:u-boot-2010.03

3:linux-2.6.35

4:busybox-1.17.3

5:优龙FS2410

6:交叉编译器:arm-none-linux-gnueabi-gcc version 4.3.2

第一步:busybox的编译

1)解压缩busybox

tar xjvf busybox-1.17.3.tar.bz2

 解压后,可以在当前busybox目录下,看INSTALL或README,教你如何编译

   make menuconfig     # This creates a file called ".config"
   make                # This creates the "busybox" executable
   make install        # or make CONFIG_PREFIX=/path/from/root install

第一步是:make menucofig

第二步是:make

第三步是:make intall (可以根据自己指定的目录去安装)

第一步:配置源码

@Ubuntu:~/busybox-1.17.3$make menuconfig

BusyboxSettings  --->

        BuildOptions  --->

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

                [ ] Force NOMMU build (NEW)

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

                (/home/tony/toolchain/bin/arm-none-linux-gnueabi-)Cross Compiler prefix

                ()  Additional CFLAGS (NEW)

第二步:编译

@Ubuntu:~/busybox-1.17.3$make

第三步:安装

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

但是最好不要用默认目录,不然很容易破坏我们得东西,组号再创建一个目录

@Ubuntu:~/busybox-1.17.3$ mkdir  -p /home/gx/first_fs install  (根据INSTALL文件就可以知道,这样做是问了防止安装后回破坏原有文件)

附加:进入生成得目录

@Ubuntu:~/busybox-1.17.3$ make CONFIG_PREFIX=/home/lsb/gx/first_fs install 

 @Ubuntu:~/busybox-1.17.3$ cd /home/lsb/gx/first_fs

@Ubuntu:~/home/lsb/gx/first_fs $ ls

bin      linuxrc      sbin     usr

@Ubuntu:~/home/lsb/gx/first_fs $ ls bin/ls -l

上面busybox编译完成

---------------------------------------------------------------------------------------------------------------------------------------

第二步:创建设备节点(打开标准输入,输出,错误等)

1.@Ubuntu:~/home/lsb/gx/first_fs  $  ls /dev/console /dev/null -l
crw------- 1 root root 5, 1 2011-11-11 19:50 /dev/console
crw-rw-rw- 1 root root 1, 3 2011-11-11 19:49 /dev/null
2.@Ubuntu:~/home/lsb/gx/first_fs $mkdir dev

3.@Ubuntu:~/home/lsb/gx/first_fs $cd dev/

4. sudo mknod console c 5 1

5.sudo mknod null c 1 3

6.@Ubuntu:~/home/lsb/gx/first_fs /dev$ls -l
total 0
crw-r--r-- 1 root root 5, 1 2011-11-11 20:01 console
crw-r--r-- 1 root root 1, 3 2011-11-11 20:03 null

---------------------------------------------------------------------------------------------------------------------------------------
第三步:构造inittab

进是因为当我们不构造的时候,busybox就会使用默认项

::ctrlaltdel:/sbin/reboot

::shutdown:umount -a -r

::restart:init

::askfirst:-/bin/sh

tty2::askfirst:-/bin/sh

tty3::askfirst:-/bin/sh

tty4::askfirst:-/bin/sh

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

而我们不需要多项,所以我们就构造inittab项

@Ubuntu:~/home/lsb/gx/first_fs $sudo mkdir etc

@Ubuntu:~/home/lsb/gx/first_fs $vim etc/inittab

添加的内容是:

console::askfirst:-/bin/sh

(解析:console表示为终端,就会执行/bin/sh程序,是用来回显信息用的,而标准得输出,输入和错误就会定位到console终端去)

---------------------------------------------------------------------------------------------------------------------------------------

第四,暂时不管

第五,C库

@Ubuntu:~/home/lsb/gx/first_fs  $ sudo mkdir lib

@Ubuntu:~/home/lsb/gx/first_fs $cp /home/lsb/toolchain/arm-none-linux-gnueabi/lib/*so* ./lib/ -a

                                                                     (-d是保持原有得连接文件,不然得到的文件很大)

附加:在管理员模式对库瘦身

@Ubuntu:~/home/lsb/gx/first_fs $ $sudo su

root@Ubuntu:~/home/lsb/gx/first_fs install  #source /home/tony/.bashrc            //如果在etc/profile中不用

root@Ubuntu:~/home/lsb/gx/first_fs install  #arm-none-linux-gnueabi-strip./lib/*

root@Ubuntu:~/home/lsb/gx/first_fs install  #exit

上面步骤完成一个最小的根文件系统                                                          

2.yaffs2文件系统制作

---------------------------------------------------------------------------------------------------------------------------------------

- 文件系统做成了,要烧写到板子上去,所以,就得做成映像文件-

 

1.先下载yaffs工具

2.解压yaffs2(s1是小页的nand faslh用的,只有512个字节。。而yaffs2是对大页nand faslh用的2048个字节)

@Ubuntu:~/home/lsb/gx/first_fs $  fmkyaffsimage_2  filesystem     filesystem.yaffs2

把它考到板子上去

---------------------------------------------------------------------------------------------------------------------------------------

2.1.完善yaffs2文件系统(一)

方法一:实现PS命令

1.再板子上执行PS 命令,无法实现

直接mkdir proc是不行的,还要的挂载一个虚拟的根文件系统,而内核提供proc文件系统用来收集正在执行的文件

 2.若我们想在板子上执行 PS命令的话,就得用

在板子上# mount -t proc none /proc (手动挂载的)

#cd  proc

#cd 1

# ls -l fd  (以查看,标准输出,输入和错误)

3.可以实现自动挂载,那就得去更改配置文件

@Ubuntu:~/home/lsb/gx/first_fs $ vim etc/inittab

增加内容:

console::askfirst:-/bin/sh

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

4.再对这个配置文件增加点内容(脚本):

@Ubuntu:~/home/lsb/gx/first_fs $ sudo mkdir  init.d

@Ubuntu:~/home/lsb/gx/first_fs $ vim  etc/init.d/rcS

填写mount -t proc none /proc

上面就实现增加:自动

@Ubuntu:~/home/lsb/gx/first_fs $ chmod +x rcS (修改它的属性)

方法二:实现PS命令

# mount -a (执行 mount -a 命令时,就会去读/etc/fstab,根据这个配置文件的内容去挂载根文件系统)

我们再到

@Ubuntu:~/home/lsb/gx/first_fs $ vim  etc/init.d/rcS

#mount -t proc none /proc(注册掉)

/bin/ mount -a(而mount -a 依赖于etc/fstab文件)

@Ubuntu:~/home/lsb/gx/first_fs $ vim etc/fstab

fastab格式:

#device    mount-point     type       options        dump        fsch   order

  proc               /proc         proc        defaults         0                 0

@Ubuntu:~/home/lsb/gx/first_fs $ sudo mkdir   proc

cp到板子去:

@Ubuntu:~/home/lsb/gx/first_fs $  fmkyaffsimage_2  filesystem     filesystem.yaffs2

在板子上:#cat  /proc/mounts  参看正在挂载的文件

2.2.完善yaffs2文件系统(二)

自动创建设备节点文件

由于我们的设备有很多,而我们不一一手动去挂载设备节点,所以我们就用udev机制=mdev机制

udev机制是=自动创建/dev/设备节点(在busybox里面是mdev是udev的简化版本)

板子上:#ls /dev

                     console            null

@Ubuntu:~/home/lsb/gx/first_fs $ vim  etc/init.d/rcS

/bin/ mount -a

mkdir  /dev/pts

mount -t  devpts devts /devpts

mount -t  sysfs sysfs    /sys

echo /bin/mdev > /proc/sys/kernel/hotplug

mdev -s

在板子上: # ls  /dev   就会产生很多设备文件,是由mdev自动给我们创建的

@Ubuntu:~/home/lsb/gx/first_fs $ vim etc/fstab

fastab格式:

#device    mount-point     type       options        dump        fsch   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

@Ubuntu:~/home/lsb/gx/first_fs $ sudo mkdir  tmp  mnt  var  sys root 

cp到板子去:

@Ubuntu:~/home/lsb/gx/first_fs $  fmkyaffsimage_2  filesystem     filesystem.yaffs2

---------------------------------------------------------------------------------------------------------------------------------------

3.jffs2文件系统制作

(一般放于NOR FLASH)

1)zlib工具的编译

解压:tar xjvf zlib-1.2.3.tar.bz2

@Ubuntu:~/home/lsb/gx/$ cd zlib-1.2.3

@Ubuntu:~/home/lsb/gx/zlib-1.2.3$ ./config  --shared --prefix=/usr  (shared表示为动态库,而prefix则表示为安装路径)

@Ubuntu:~/home/lsb/gx/zlib-1.2.3/$ make

@Ubuntu:~/home/lsb/gx/zlib-1.2.3/$ sudo make install

为什么要安装这个?是因为制作jffs2文件系统时,需要MTD设备工具包,编译它生成mkjs.jffs工具,用它来将一个目录制作成jffs文件系统镜像文件

又因为,这个MTD工具包,需要zlib压缩包,所以得先安装它

2)mtd工具包的编译

tar xjvf mtd-snapshot-20050519.tar.bz2

@Ubuntu:~/home/lsb/gx/$ cd Util

@Ubuntu:~/home/lsb/gx/Util$ make

@Ubuntu:~/home/lsb/gx/Util$sudo  make install

3)  文件系统镜像制作

@Ubuntu:~/home/lsb/gx/$ sudo mkfs.jffs2 -n -s 2048 -e 128KiB -d first_fs -o first_fs .jffs2

1.-n 表示不要在每个擦除块上都加上清除标志

2.-s 2048  指明一页得大小为2048字节

3.-e 128 KiB 指明擦除块大小为128Kb

4.-d 表明根文件系统目录

5.-o 表示输出文件

 

tony@Ubuntu:/opt$sudo mkfs.jffs2 -r filesystem -o filesystem.jffs2

tony@Ubuntu:/opt$cp filesystem.jffs2 /tftpboot/

 

4)将jffs2文件系统烧写到nand

tftp 30008000 filesystem.jffs2

nand erase 500000 800000

nand write 30008000 400000 实际大小

setenv bootargs root=/dev/mtdblock2 init=/linuxrcrootfstype=jffs2 rw console=ttySAC0,115200 

当你重启板子是,板子默认为yaffs2,所以在传参时,加上文件系统类型

 5.挂载方式NFS

1.从 falsh启动根文件系统,再用命令去挂载NFS

2.直接从NFS启动

nfs格式:

 

ootargs console=ttySAC0,115200 init=/init
                  root=/dev/nfs nfsroot=192.168.7.102:/opt/fs100
                  ip=192.168.7.162:192.168.7.102:192.168.7.1:255.255.255.0:farsight_02:eth0(第一个网卡):off(不需要自动挂载)