Chinaunix首页 | 论坛 | 博客
  • 博客访问: 90253
  • 博文数量: 14
  • 博客积分: 1472
  • 博客等级: 上尉
  • 技术积分: 172
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-26 09:55
文章分类

全部博文(14)

文章存档

2011年(13)

2007年(1)

我的朋友

分类: LINUX

2011-02-05 19:57:23

1.       移植文件系统

特别说明:文件系统要和内核用同版本的交叉编译器编译!其实同一个目标板上,都用同一个交叉编译器编译所有的软件是最合适的。

               (1)     嵌入式文件系统说明

嵌入式 Linux 中都需要构建根文件系统,构建根文件系统的规则在FHS(Filesystem Hierarchy Standard)文档中,下面是根文件系统顶层目录。

嵌入式Linux系统中,一般使用Busybox移植文件系统。

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

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

n   usr 里面存放的是共享、只读的程序和数据。

n   proc 这是个空目录,常作为proc 文件系统的挂载点。

n   dev 该目录存放设备文件和其它特殊文件。

n   etc 存放系统配置文件,包括启动文件。

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

n   boot 引导加载程序使用的静态文件

n   home 用户主目录,包括供服务账号锁使用的主目录,如FTP

n   mnt 用于临时挂接某个文件系统的挂接点,通常是空目录。也可以在里面创建空的子目录。

n   opt 给主机额外安装软件所摆放的目录。

n   root root 用户的主目录

n   tmp 存放临时文件,通常是空目录。

n   var 存放可变的数据。

               (2)     创建文件系统的常用目录

用如下脚本实现:

#!/bin/sh

echo "------Create rootfs directons start...--------"

mkdir rootfs

cd rootfs

echo "--------Create root,dev....----------"

mkdir root dev etc boot tmp var sys proc lib mnt home usr

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 660 dev/console c 5 1

mknod -m 660 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---------"

可以将上述代码复制到一个文件(mk-rootfs.sh,需要执行权限)中执行即可在当前路径下创建一个文件夹rootfs,其中包含了几个基本的目录。和设备。

#./mk-rootfs.sh

               (3)     下载busybox

下载地址:

下载链接:

               (4)     解压源代码

#tar   -jxvf  busybox-1.18.2.tar.bz2

               (5)     修改Makefile中的交叉链和系统架构

CROSS_COMPILE ?=arm-linux-    //164

ARCH ?=arm                                              //189

               (6)     配置编译选项

#make  menuconfig

                                 [A]              指定安装位置

Busybox Settings  --->

Installation Options ("make install" behavior)  --->

BusyBox installation prefix-->

输入:../rootfs                       //实际中,要根据计划的文件系统根设定!

                                 [B]              指定mdev动态文件系统

Linux System Utilities --->

[*]Support /etc/mdev.conf

[*]Support command execution at device addition/removal

               (7)     编译安装busybox

#make install

               (8)     建立etc 目录下的配置文件。

进入rootfs目录后:

                                  [A]      建立etc/mdev.conf 文件,内容为空。

#touch  etc/mdev.conf

                                  [B]      拷贝主机etc 目录下的passwdgroupshadow文件到rootfs/etc 目录下。

# cp /etc/passwd  /etc/group /etc/shadow etc/

                                  [C]      etc/sysconfig目录下新建文件HOSTNAME,内容为”syd168”

#touch  etc/sysconfig/hostname

#echo  “syd168”  >etc/sysconfig/hostname

                                  [D]      创建etc/inittab文件,内容如下黄色背景部分:

#touch etc/inittab

#etc/inittab

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

s3c2410_serial0::askfirst:-/bin/sh

::ctrlaltdel:/sbin/reboot

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

                                   [E]      创建etc/init.d/rcS文件,内容如下黄色背景部分:

#touch  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 "----------Starting mdev......"

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

mdev -s

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

echo "Kernel Version: Linux-2.6.37"

echo "By  syd168  2011.1.25 13.am"

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

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

                                   [F]      设置rS文件的执行权限

#chmod +x  etc/init.d/rcS

                                  [G]      创建etc/fstab 文件,内容如下黄色背景部分:

#touch  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

                                  [H]      etc/profile 文件,内容如下黄色背景部分:

#touch  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

               (9)     复制相关的支持库到rootfs/lib

首先检查busy的文件类型。进入刚刚完整的文件系统文件夹rootfs。执行如下命令:

#file  bin/busybox

输出

bin/busybox: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped

           (10)     制作根文件系统镜像(需要mkyaffs2image工具)

下载

#tar –zxvf  mkyaffs2image.tgz  –C  rootfs/

#mkyaffs2image  rootfs  rootfs.img

           (11)     设置u-boot让内核启动

                                 [A]              bootargs设置内核参数和文件系统方式

n   nfs启动

bootargs=noinitrd root=/dev/nfs rw nfsroot=10.8.22.244:/root/mywork/mini2440/rootfs,nolock,tcp ip=10.8.22.240:10.8.22.1:10.8.10.244:255.255.255.0:10.8.22.244:eth0:off console=tty0 console=ttySAC0,115200 init=/linuxrc mem=64M

 

关于NFS挂载的提示:

1.             挂载中添加参数nolock可以加快挂载速度

2.             挂载中添加tcp参数,可以解决挂载后,客户端操作服务器返回 nfs server no responding 的错误。

 

n   yaffs启动

bootargs=noinitrd  root=/dev/mtdblock3  init=/linuxrc console=tty0 console=ttySAC0,115200

                                 [B]              bootcmd设置启动命令

n   nfs下载内核

bootcmd=nfs 0x30008000 10.8.22.244:/root/mywork/mini2440/rootfs/uImage;bootm

n   yaffs启动内核

bootcmd=nand read 0x30008000 0x80000 0x250000; bootm

 

                                  [C]              Mini2440 默认的vivi 参数:

linux_cmd_line=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0

n   我修改的:

baudrate=115200

ethaddr=08:08:11:18:12:27

ipaddr=10.8.22.240

serverip=10.8.22.244

gatewayip=10.8.22.1

netmask=255.255.255.0

ethact=dm9000

bootdelay=5

2.       挂载文件系统的错误解决

-> Floating point emulation

[*] NWFPE math emulation

至少要选择一种浮点数模拟器

          (1)         缺少文件系统的错误

错误内容:

List of all partitions:

1f00             384 mtdblock0  (driver?)

1f01             128 mtdblock1  (driver?)

1f02            5120 mtdblock2  (driver?)

1f03          256512 mtdblock3  (driver?)

No filesystem could mount root, tried:  ext3 cramfs vfat msdos romfs

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,3)

          (2)         无法执行/linuxrc

错误现象:

VFS: Mounted root (nfs filesystem) on device 0:14.

Freeing init memory: 144K

Failed to execute /linuxrc.  Attempting defaults...

Kernel panic - not syncing: No init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.

上面的错误表明,根文件系统已经挂载,但在根文件系统下找不到/linuxrc,如果确认/linuxrc存在且有可执行权限,则需要检查该文件的类型是否动态链接的。如果是,则必须同时将相关的动态库复制到根文件系统下的/lib中。这些库文件在交叉编译器的/lib下。其实,复制这些公共库还有个好处,就是后期运行其它程序的时候,用到相关的库就不会找不到库的麻烦。

          (3)         无法挂载nfs根文件系统错误

错误现象:

VFS: Unable to mount root fs via NFS, trying floppy.

VFS: Cannot open root device "nfs" or unknown-block(2,0)

Please append a correct "root=" boot option; here are the available partitions:

1f00             384 mtdblock0  (driver?)

1f01             128 mtdblock1  (driver?)

1f02            5120 mtdblock2  (driver?)

1f03          256512 mtdblock3  (driver?)

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)

#cp  /opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/lib/  rootfs/lib

对于nfs根文件系统的挂载需要确保一下几个方面:

1)  Bootargs必须配置正确

下面是一个挂载的例子(下面内容在同一行):

bootargs=noinitrd root=/dev/nfs rw

nfsroot=10.8.22.244:/root/mywork/mini2440/rootfs,nolock,tcp

ip=10.8.22.240:10.8.22.1:10.8.10.244:255.255.255.0:10.8.22.244:eth0:off

console=tty0 console=ttySAC0,115200

init=/linuxrc mem=64M

   第一行表示没有initrdroot挂载设备为/dev/nfs,而且是可读写的。

   第二行表示根文件系统的位置,nolocktcp是为了提高挂载速度

   第三行表示向串口输出启动信息,第一个表示输出到LCD,第二个表示输出到串口

   第四行表示初始化程序是根文件系统下的/linuxrc,最后的表示内存大小,可不配置。

2)  必须确保开发板能和nfs主机网络是联通

为了确保开发板和nfs主机联通,可以在u-boot下测试。然后正确配置nfs

3)  确保nfs配置正确且根文件系统正确

可以执行service nfs restart   启动nfs服务(fedora/redhat

可以执行showmount  -e  检查nfs输出路径中是否包含根文件系统目录

4)  为了确保挂载速度和操作可靠性

关闭nfs主机防火墙,关闭虚拟机所在主机的防火墙。

在挂载的时候,添加nolocktcp参数。

阅读(2155) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-03-06 14:12:24

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com