分类: 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 目录下的passwd、group、shadow文件到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
第一行表示没有initrd,root挂载设备为/dev/nfs,而且是可读写的。
第二行表示根文件系统的位置,nolock和tcp是为了提高挂载速度
第三行表示向串口输出启动信息,第一个表示输出到LCD,第二个表示输出到串口
第四行表示初始化程序是根文件系统下的/linuxrc,最后的表示内存大小,可不配置。
2) 必须确保开发板能和nfs主机网络是联通
为了确保开发板和nfs主机联通,可以在u-boot下测试。然后正确配置nfs。
3) 确保nfs配置正确且根文件系统正确
可以执行service nfs restart 启动nfs服务(fedora/redhat)
可以执行showmount -e 检查nfs输出路径中是否包含根文件系统目录
4) 为了确保挂载速度和操作可靠性
关闭nfs主机防火墙,关闭虚拟机所在主机的防火墙。
在挂载的时候,添加nolock和tcp参数。
chinaunix网友2011-03-06 14:12:24
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com