Linux内核制作与嵌入式根文件系统的构建

来源:互联网 发布:最强nba主网络断开 编辑:程序博客网 时间:2024/05/22 04:51

一、Linux内核的制作<这个制作仅为NFS文件系统而制作>快哭了快哭了

1.1)先抱怨两句再说一大早起来打开电脑发现电脑启动不起来,拆开电脑搞了好久发现原来是显卡出问题了。。。本来最近就穷显卡坏了。无语之中拿这个破机器去看医生咯,修好电脑后再打开电脑一看启动起来了,但是。。。。显示器不显示了!!!!!!!什么逻辑

     闲话少说、手动起来

1.2)准备工作(经移植后的源码准备)

1.3)开始内核制作

1.3.1)进入Linux内核根目录执行makedistclean

         这个是习惯呵呵。。。。清除原有的配置文件和中间文件

1.3.2)加载缺省文件

        配置前首先要加载缺省文件哦。。怎么选择这个缺省文件那就要根据你自己的开发板来定吧

        cp config_mini2440_t35 .config  至于选择哪个缺省文件我想大家都懂的(这个arch/arm/configs目录下很多这样的咚咚的)

1.3.3)嗯,该配置内核了

        还是在Linux主目录下面执行

        make menuconfig ARCH=arm 

        如果上一句你要问我为何要加个ARCH=arm我的回答那是很简单了你可以尝试一下不加这个会有什么后果,我试过了后果很严重啊,我没找到ARMCPU

1.3.4)完了、编译内核吧

       make uImage ARCH=arm CROSS_COMPILE=arm-linux-

       唉我去上个厕所吧,可是外面好黑。。我有点怕。。。。。。

       漫长的等待其实我已经劳了。。。随着这机器的吱吱声,我表示心痛了

       这一说我忘记重点了就是本次是构建NFS文件系统即网络文件系统所以上述的配置过程值得注意地方添个图看看

       选择什么CPU那样的东西就不说了,都不知道选择了多少次了

      

      

      

1.3.5)先睡觉吧。。。。。。。。这个比较的重要

二、根文件系统的制作、清晨我漫步在校园、发现学校的美女似乎都已被泡光了。。。。。<我才出去一百多天而已啊。。。>

2.1.1)根文件系统预备知识介绍

       根文件系统是Linux启动的时候使用的第一个文件系统,没有他系统将无法正常的启动

       然而在这个根文件系统中又包含了一系列的目录,接下来对这些目录做一个简单的介绍。其实这个大家都很懂的

bin
 存放所有用户都可以使用的、基本的命令。
 
sbin

 存放的是基本的系统命令,它们用于启动系统、修复系统等。

sys

一些总线啊设备啊驱动啊。等等都在这里。好像都是动态生成的吧

 
usr
 里面存放的是共享、只读的程序和数据。
 
proc
 这是个空目录,常作为proc文件系统的挂载点。
 
dev
 该目录存放设备文件和其它特殊文件。
 
etc
 存放系统配置文件,包括启动文件。
 
lib

 存放共享库和可加载块(即驱动程序),共享库用于启动系统、运行根文件系统中的可执行程序。

mnt
 用于临时挂接某个文件系统的挂接点,通常是空目录。也可以在里面创建空的子目录。
boot
 引导加载程序使用的静态文件
 
home
 用户主目录,包括供服务账号锁使用的主目录,如FTP
 
opt
 给主机额外安装软件所摆放的目录。
 
root
 root用户的主目录
 
tmp
 存放临时文件,通常是空目录。
 
var

 存放可变的数据。

2.2.2)使用脚本文件创建目录:对于上面这些我应该说点什么呢。应该说前面的那8个目录是最基本要具备的吧

那么好我们编写一个脚本用来创建者些目录吧,这个脚本文件叫creat_rootfs_nfs 内容如下:

#!/bin/sh  
echo "------Create rootfs directons start...--------"    
cd nfs
echo "--------Create root,dev....----------"  
mkdir root dev etc boot tmp var sys proc lib mnt home
mkdir etc/init.d etc/rc.d etc/sysconfig
mkdir usr/sbin usr/bin usr/lib usr/modules
echo "make node in dev/console dev/null"  
mknod -m 600 dev/console c 5 1
mknod -m 600 dev/null    c 1 3
mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp
mkdir var/lib var/lock var/run var/tmp
chmod 1777 tmp
chmod 1777 var/tmp

echo "-------make direction done---------"

当我们执行这个脚本的时候你可能回感觉很尴尬 怎么这也会出错。你会发现程序的第7行会报错,你可别说我这么菜啊,这样做肯定有目的。。这些usr和它的子目录

我们让瑞士军刀来帮我们自动实现好了。另外一个这个脚本的权限的问题chmod 777creat_rootfs_nfs

2.2.3)动态链接库的创建<当然你也可以选择是静态的>
动态链接库直接用友善之臂的,先解压友善之臂的根文件包,拷贝lib的内容到新建的根文件目录lib内。

cd /mnt/hgfs/share

tar –zxvf root_qtopia.tgz –C /opt/studyarm

cp –rfd /opt/studyarm/root_qtopia/lib/* /home/eilianlau/smbservice/rootfs/nfs/lib*

2.2.4)下载busybox下载链接<busybox-1.19.0>:点击下载busybox

2.2.5)进入busybox对它进行配置(为何要选择busybox?网上应该很多资料说了)

#cd busybox-1.19.0

打开Makfile

CROSS_COMPILE   ?=arm-linux-       //第164行

       ARCH                        ?=arm                  //第189行

//什么意思相信大家都懂的,保存退出回到busybox根目录 执行

#make menuconfig

配置过程如下,我也是参考mini2440 Linux移植手册的,我解释我知道,那些解释不了的东西我留给大家来解释,先说声谢谢吧

(a)、Busybox Settings--->

             General Configuration--->

                            [*] Show verbose applet usage messages //这个是现实程序的详细信息吧

                            [*] Store applet usage messages in compressed form

                            [*] Support –install [-s] to install applet links at runtime

                            [*] Enable locale support(system needs locale for this to work)

                            [*] Support for –long-options

                            [*] Use the devpts filesystem for unix98 PTYs

                            [*] Support writing pidfiles

                            [*] Runtime SUID/SGID configuration via /etc/busybox.config

                            [*]  Suppress warning message if /etc/busybox.conf is not readable//这个配置是如果/etc/busybox.conf is是不可读的话则会给用户提示警告信息

Build Options--->//我主要关注这个就是编译选项

                            [*] Build BusyBox as a static binary(no shared libs) //静态链接,如果你要使用静态链接库的话那么这个选项一定要选上了 一定<这里的话随意反正我用动态库>

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

Installation Options->//安装配置

                            [*]Don’t use /usr                     //选上它防止把编译进系统中的/usr下以便破坏宿主系统

                            Applets links (as soft-links) --->  //安装配置 使用软链接

                                   (./_install) BusyBox installation prefix

Busybox Library Tuning ---> //调用那些库呢?这个真不知道怎么解释。。。

                            (6)Minimum password legth

                            (2)MD5:Trade Bytes for Speed

                            [*]Fsater /proc scanning code(+100bytes)

                            [*]Command line editing

                            (1024)Maximum length of input

                            [*]   vi-style line editing commands

                            (15) History size

                            [*]   History saving

                            [*]   Tab completion

                            [*]Fancy shell prompts

                            (4) Copy buffer size ,in kilobytes      

[*]Use ioctl names rather than hex values in error messages

[*]Support infiniband HW

(b)、Linux Module Utilities--->          //这个就是lib/modules的设置

                    (/lib/modules)Default directory containing modules //默认内核模块安装到该目录下

                     (modules.dep)Default name of modules.dep

[*]   insmod           //这些都是支持的命令

[*]   rmmod

[*]   lsmod

[*]   modprobe

-----options common to multiple modutils 

[ ] support version 2.2/2.4 Linux kernels

[*]Support tainted module checking with new kernels

[*]Support for module .aliases file

[*] support for modules.symbols file

(c)、在busybox中配置对dev下设备类型的支持

dev的创建有三种方法:

手动创建:在制作根文件系统的时候,就在dev目录下创建好要使用的设备文件,系统挂接根文件系统后,就可以使用dev目录下的设备文件了。

使用devfs文件系统:这种方法已经过时,具有不确定的设备映射、没有足够的主/次设备号、devfs消耗大量的内存。

udev:它是个用户程序,能根据系统中硬件设备的状态动态的更新设备文件,包括设备文件的创建、删除等。它的操作相对复杂,但灵活性很高

mdev是busybox自带的一个简化版的udev,适合于嵌入式的应用埸合。其具有使用简单的特点。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件。在以busybox为基础构建嵌入式linux的根文件系统时,使用它是最优的选择。下面的选项将增加对mdev的支持。

Linux System Utilities  --->              

           [*]Support /etc/mdev.conf        

           [*]Support command execution at device addition/removal

。。。。。。真不知道说什么自己也不是很懂。。。

2.2.6)说了这么久做完我们编译的内核模块还没安装呢(赶紧的)先安装内核模块再配置busybox吧,在2.2.3操作完后发现lib/modules目录下已经有内核模块了(那是友善提供的),只不过我这个人很特别我不喜欢那个我要自己安装

那么好让我们进入 /home/eilianlau/smbservice/rootfs/nfs/lib下执行rm -fr modules/*吧

再回到之前编译好的那个内核目录下

#cd /home/eilianlau/smbservice/Kernel/linux-2.6.32.2

编译内核模块呢

#make modules ARCH=arm CROSS_COMPILE=arm-linux-

安装模块

#make modules_install ARCH=arm INSTALL_MOD_PATH=/home/eilianlau/smbservice/rootfs/nfs                                                微笑

三、编译busybox

3.1.1)

#cd /home/eilianlau/smbservice/rootfs/busybox-1.19.03

make CONFIG_PREFIX=/home/eilianlau/smbservice/rootfs/nfs install        //这一句就是编译并安装到根文件系统下咯

在rootfs目录下会生成目录bin、sbin、usr和文件linuxrc的内容。 //这下知道那个脚本文件了吧。。。

3.1.2)建立etc目录下的配置文件<这些配置信息都是一些基本不需要改动的东西所以直接从主机下面拷得了>
a、etc/mdev.conf文件,内容为空

b、拷贝主机etc目录下的passwd、group、shadow文件到rootfs/etc目录下

c、etc/sysconfig目录下新建文件HOSTNAME,内容为eilian。

d、etc/inittab文件:

#etc/inittab

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

::askfirst:-/bin/sh

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount -a –r
 

e、etc/init.d/rcS文件:

#!/bin/sh

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

runlevel=S

prevlevel=N

umask 022

export PATH runlevel prevlevel

echo "----------munt all----------------"

mount -a

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

mdev -s

 

echo "***********************************************"

echo "****************Studying ARM*********************"

echo "Kernel version:linux-2.6.32"

echo "Student:Eilianlau"

echo "Date:2011.11.08"

echo "***********************************************"

/bin/hostname -F /etc/sysconfig/HOSTNAME
 

使用以下命令改变rcS的执行权限:

Chmod +x rcS

f、etc/fstab文件:

#device    mount-point     type     option     dump   fsck   order

proc          /proc        proc     defaults    0        0

none          /tmp        ramfs    defaults    0        0

sysfs         /sys          sysfs    defaults    0        0

mdev          /dev        ramfs    defaults    0        0
 

g、 etc/profile文件:

#Ash profile

#vim:syntax=sh

#No core file by defaults

#ulimit -S -c 0>/dev/null 2>&1

USER="id -un"

LOGNAME=$USER

PS1='[\u@\h=W]#'

PATH=$PATH

HOSTNAME='/bin/hostname'

export USER LOGNAME PS1 PATH

/*****************到此为止嵌入式根文件系统就构建就OO了接下来应该要测试一下从NFS启动这个根文件系统了。。。

四、从NFS启动根文件系统

4.1.1)将uboot.bin烧入NORFLASH中,然后打开putty

       

4.1.2)将制作好的内核镜像uImage拷贝到/tftpboot目录下(首先你要保证你的服务端的TFTP服务已经建立好啊)

        

        在putty终端下执行    
[u-boot@MINI2440]#tftp 31000000 uImage

         

4.1.3)从nfs启动根文件系统

[u-boot@MINI2440]#bootm 31000000

         

4.1.4)启动过程中遇到的一些问题

         在上述启动过程中我遇到了这样的问题
Please append a correct "root=" boot option; here are the available partitions:
1f00             256 mtdblock0 (driver?)
1f01             128 mtdblock1 (driver?)
1f02            5120 mtdblock2 (driver?)
1f03          256640 mtdblock3 (driver?)
1f04          262144 mtdblock4 (driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
Backtrace:
[<c0035270>] (dump_backtrace+0x0/0x10c) from [<c033a844>] (dump_stack+0x18/0x1c)
 r7:c39230cb r6:c04920b0 r5:c3923000 r4:c3823f40
[<c033a82c>] (dump_stack+0x0/0x1c) from [<c033a894>] (panic+0x4c/0x134)
[<c033a848>] (panic+0x0/0x134) from [<c0008e9c>] (mount_block_root+0x178/0x234)
 r3:00000000 r2:c3802e6c r1:c3823f40 r0:c03eab70
[<c0008d24>] (mount_block_root+0x0/0x234) from [<c0009008>] (mount_root+0xb0/0xf4)
[<c0008f58>] (mount_root+0x0/0xf4) from [<c0009144>]

这些都是我纠结的。。。。前几个月做这个文件系统的时候就有过这种经历,现在我说下这种错误的原因<个人想法>

我觉得这种错误90%是由于nfs服务引起的

于是我打开我的nfs配置文件一看发现没有错呀,那是为什么呢。。。。你看下面这有错吗?标准做法呢

      

       突然我想起了,这个修改是我刚刚修改过来的,我忘记了关键的一个操作那就是重启nfs

       那我重新启动nfs再看看

      

       重新启动nfs文件系统发现OK了

4.1.5)另外的一个问题就是下载不了内核镜像了

          这个恐怕你要检测一下你的网线和开发板有没有接好了,还有就是你的主机有没有连上网了

4.1.6)如果说你的文件系统做得有问题 那就不用多说了 老老实实的再做一次,做到能启动位置

好了就这样了 没什么可写的了,也写不下去了。。。。。。想想下午还要上课,感觉很是尴尬





    


       

    

原创粉丝点击