`
wodamazi
  • 浏览: 1414040 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

一、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)如果说你的文件系统做得有问题 那就不用多说了 老老实实的再做一次,做到能启动位置

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









分享到:
评论

相关推荐

    冬天的秘密-Linux内核制作与嵌入式根文件系统的构建.doc

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

    嵌入式Linux内核的移植与文件系统制作.pdf

    嵌入式Linux内核的移植与文件系统制作

    嵌入式主机环境的构建及UBOOT-LINUX内核-文件系统的烧录

    嵌入式主机环境的构建及UBOOT-LINUX内核-文件系统的烧录

    嵌入式Linux_的Cramfs_根文件系统配置成可读可写

    从软件角度上看,构建基于ARM技术的linux系统要涉及到引导加载程序、Linux内核、文件系统、用户应用程序几部分的设计。文件系统是操作系统中用来管理用户文件的内核软件层。文件可能存在于磁盘、网络或者是一些虚拟...

    ARM嵌入式Linux+系统构建与驱动开发范例

    《ARM嵌入式Linux系统构建与驱动开发范例》介绍μClinux内核编程的一个方面,使用内核模块编写设备驱动程序。主要内容包括:介绍如何建立基于ARM7的交叉开发环境以及如何向ARM7芯片上移植μClinux;分析μClinux上一...

    嵌入式Linux系统移植开发-(1)基于Yocto构建嵌入式u-boot,内核,文件系统.pdf

    简单地概括,它是一个工具,可以用来构建u-boot,kernel,文件系统,交叉编译工具链,等等。Yocto提供了一套完整的全面的嵌入式Linux移植解决方案。使嵌入式Linux系统移植告别了以前通过源码一步步移植的刀耕火种...

    精通ARM嵌入式Linux系统开发1

    全书共25章,从嵌入式处理器ARM开始,讲解了ARM处理器的资源、ARM的指令集、ADS开发工具、嵌入式系统硬件环境的构建、Bootloader、Linux内核移植、嵌入式文件系统、嵌入式Linux多任务程序开发、嵌入式Linux设备驱动...

    基于S3C2440与Linux的ARM9嵌入式系统的构建

    摘要:研究了ARM9中$3C2440与Linux的嵌入式系统构建。开发嵌入式Linux系统最方便的方法是...映像文件,制作根文件系统,加载引导程序。至此,就完成了一个ARM9嵌入式系统构建,可以开始进行Linux .嵌入式系统开发。

    精通ARM嵌入式Linux系统开发代码

    》全书共25章,从嵌入式处理器arm开始,讲解了arm处理器的资源、arm的指令集、ads开发工具、嵌入式系统硬件环境的构建、bootloader、linux内核移植、嵌入式文件系统、嵌入式linux多任务程序开发、嵌入式linux设备...

    嵌入式Linux系统的移植及其根文件系统的实现

    本文以AT91RM9200微处理器为实例,介绍了在基于ARM9核的硬件平台上构建带有根文件系统 的嵌Linux系统的方法....的配置、Linux内核的裁剪移植、ramdisk根文件系统的制作以及应用NFS文件系统进行基本应用程序开发的

    构建嵌入式实验步骤yaffs文件系统制作

    实验环境的搭建: 交叉编译工具,内核源代码,根文件系统压缩包,yaffs2文件夹,Busybox源代码包,mkyaffs2image-128M工具 ...3.使用Busybox工具包(配置,编译,安装)创建自己的文件系统,制作文件系统映像

    嵌入式Linux内核编译

    因为 Motorola MX1 处理器是基于 ARM 架构的,所以我们需要创建基于 ARM 的交叉开发环境,进行 linux 嵌入式开发。我们所谓的 ARM 交叉编译环境就是要在开发主机上创建一个用于编译将在表1所示的硬件环境中运行的...

    精通ARM嵌入式Linux系统开发2

    全书共25章,从嵌入式处理器ARM开始,讲解了ARM处理器的资源、ARM的指令集、ADS开发工具、嵌入式系统硬件环境的构建、Bootloader、Linux内核移植、嵌入式文件系统、嵌入式Linux多任务程序开发、嵌入式Linux设备驱动...

    基于linux嵌入式系统的内核编译实验

    基于linux嵌入式系统的内核编译实验的ppt

    嵌入式linux系统构建

    基于ARM9的嵌入式linux系统构建,包括交叉编译器的安装,U-BOOT的配置,linux系统内核的配置与制作,根文件系统的制作。

    嵌入式Linux应用开发完全手册.pdf

    硬件部件的使用及编程(囊括了常见硬件,比如UART、I*IC、LCD等),UBoot、Linux内核的分析、配置和移植,根文件系统的构造(包括移植busybox、glibc、制作映象文件等),内核调试技术(比如添加kgdb补丁、栈回溯等),...

    iMX6ULL采用Yocto构建嵌入式Linux系统

    构建嵌入式Linux系统实际上就是将U-Boot、Linux内核、根文件系统移植到所使用的硬件平台,并且根据实际项目需要,可能会涉及到新增第三方提供的软件安装至构建的嵌入式Linux系统中,以便应用程序快速、便捷、可靠地...

    精通ARM嵌入式Linux系统开发3

    全书共25章,从嵌入式处理器ARM开始,讲解了ARM处理器的资源、ARM的指令集、ADS开发工具、嵌入式系统硬件环境的构建、Bootloader、Linux内核移植、嵌入式文件系统、嵌入式Linux多任务程序开发、嵌入式Linux设备驱动...

    构建嵌入式LINUX系统

    《构建嵌入式LINUX系统》是业界第一本深入探讨基于Linux内核的嵌入式系统开发的权威指南。这本不可或缺的书总结了下面这些过程中的秘诀,这些过程甚至以前从未形成过正式文档: · 建立自己的GNU开发工具链 · 为...

    嵌入式Linux视频教程完整视频

    嵌入式Linux系统构建) U-Boot移植) 硬件访问) 设备模型) 块设备驱动程序) 网卡触摸屏) USB驱动程序开发) USB系统架构) PCI串口) LCD驱动程序) 硬件访问) LINUX USB系统) 时钟与定时器驱动...

Global site tag (gtag.js) - Google Analytics