linx-2.6.14中NFS 构建根文件系统


在这里只提一下相关的选项,其它选项自己看着办吧!!

对于启动NFS 服务器,以前已经做过了,这里也就省略了!!!


LINUX内核编译


make menuconfig

 

bootoption


noinitrd init=/linuxrc root=/dev/nfs nfsroot=219.245.80.146:/home/armroot

ip=219.245.80.222:219.245.80.146:219.245.80.254:255.255.255.0::eth0: off console=ttySAC0,115200 mem=64M

 

networking -> networking options->IP:kernel level autoconfiguralion项
file systems->network file systems->root file system on NFS


make zImage


在VIVI中下载内核

load flash kernel x


设置VIVI启动参数

param set linux_cmd_line "noinitrd init=/linuxrc root=/dev/nfs nfsroot=219.245.80.146:/home/armroot ip=219.245.80.222:219.245.80.146:219.245.80.254:255.255.255.0::eth0: off console=ttySAC0,115200 mem=64M"


param save


重新启动


出现如下错误

  Vendor: Alcor     Model: Flash Disk        Rev: 8.07                                                                      
  Type:   Direct-Access                      ANSI SCSI revision: 02                                                         
VFS: Mounted root (nfs filesystem).                                                                                         
mount_devfs_fs(): unable to mount devfs, err: -2                                                                            
Freeing init memory: 104K                                                                                                   
Warning: unable to open an initial console.                                                                                 
Failed to execute /linuxrc.  Attempting defaults...                                                                         
Kernel panic - not syncing: No init found.  Try passing init= option to kernel.


初步估计是NFS 共享文件夹里并没有根文件系统,

好吧,再来弄一下根文件系统

先去这里  http://www.busybox.net/downloads/   下载一个busybox-1.16.0


解压,

修改Makefile


ARCH ?=arm

CROSS_COMPILE ?=arm-linux-


make menuconfig

make之后会有很多错误


如:

coreutils/fsync.c: In function `fsync_main':
coreutils/fsync.c:27: error: `O_NOATIME' undeclared (first use in this function)
coreutils/fsync.c:27: error: (Each undeclared identifier is reported only once
coreutils/fsync.c:27: error: for each function it appears in.)
make[1]: *** [coreutils/fsync.o] 错误 1
make: *** [coreutils] 错误 2


解决办法: 重新make menuconfig

去掉coreutils 里的 fsync选项


miscutils/ionice.c:16: error: `SYS_ioprio_set' undeclared (first use in this function)


方法同上


networking/interface.c:818: error: 'ARPHRD_INFINIBAND' undeclared here (not in a function)
make[1]: *** [networking/interface.o] Error 1
make: *** [networking] Error 2


通过查看内核源代码目录中的“include/linux/ifarp.h”文件可得知“ARPHRDINFINIBAND”的值为“32”,然后修改“networking/interface.c”文件,在其中添加:
#define ARPHRD_INFINIBAND 32  /* InfiniBand */



/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/linux/ fd.h:342: error: variable or field `__user'' declared void

/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/linux/fd.h:342: error: parse error before ''*'' token

/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/linux/fd.h:360: error: parse error before ''}'' token

make[2]: *** [getsize.o] Error 1

解决: 在引用 #include 的文档前面加上#include <linux/compiler.h>


gedit /usr/local/arm/3.4.1/arm-linux/sys-include/linux/fd.h

#include <linux/compiler.h>


重新make 生成一个文件busybox


然后make install 生成一个目录 _install


生成如下文件:
     drwxr-xr-x 2 yuaf yuaf 4096 2009-07-30 11:01 bin
     lrwxrwxrwx 1 yuaf yuaf   11 2009-07-30 11:01 linuxrc -> bin/busybox
     drwxr-xr-x 2 yuaf yuaf 4096 2009-07-30 11:01 sbin
     drwxr-xr-x 4 yuaf yuaf 4096 2009-07-30 11:01 usr
    把此文件下所有的文件拷贝到你的NFS共享文件夹下,如我的共享文件夹是:/home/armroot
   4.建立/lib目录。使用动态链接库连接,把你所安装的交叉编译器路径下的lib目录拷贝到此目录下就行。
    $pwd
    /usr/local/arm/gcc-3.4.5-glibc-2.3.6/arm-linux
    $cp -arf lib /home/armroot/
   5.构建/etc目录
    init进程 根据/etc/inittab文件来创建其他子进程。
    创建etc/inittab文件,仿照Busybox的examples/inittab文件。内容如下:
    #/etc/inittab
    ::sysinit:/etc/init.d/rcS
    ttySAC0::askfirst:-/bin/sh
    ::ctrlatldel:/sbin/reboot
    ::shutdown:/bin/umount -a -r
    创建etc/init.d/rcS文件,内容如下:
    #!/bin/sh
    ifconfig eth0 192.168.0.100
    mount -a
    最后还得改变它的属性,使它能够执行
    $chmod +x etc/init.d/rcS
    创建etc/fstab文件,其内容如下:
    # device mount-point type options  dump fsck  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
    其具体的每个字段的意思可以上网去搜。
   6.构建/dev目录
     通过mdev,读取内核信息来创建设备文件。要使用mdev,需要内核支持sysfs文件系统,为了减少对Flash的读写,还要支持tmpfs文件系统。确保内核支持CONFIG_SYSFS、CONFIG_TMPFS配置项。
     要自动运行mdev,需要修改etc/fstab文件。其修改后的文件,见其上面etc/fstab内容。
     修改etc/init.d/rcS
     在其后面加入下面几行
     mkdir   /dev/pts
     mount -t devpts devpts /dev/pts
     echo /sbin/mdev > proc/sys/kernel/hotplug
     mdev -s
     修改etc/inittab文件
     因为开发板通过mdev生成的/dev目录中,s3c2410的串口名是s3c2410_serial0、s3c2410_serial1,不是ttySAC0、ttySAC1等。


  root 身份建立节点文件 /dev/console, /dev/null

 sudo mknod -m 600 dev/console c 5 1

 sudo mknod -m 666 dev/null c 1 3

 


  7.构建其他目录
   $mkdir proc mnt tmp sys root
   这样一个最小的根文件系统就建立起来啦


重新启动,显示如下,还是有问题:



IP-Config: Complete:                                                                                                        
      device=eth0, addr=219.245.80.222, mask=255.255.255.0, gw=219.245.80.254,                                              
     host=219.245.80.222, domain=, nis-domain=(none),                                                                       
     bootserver=219.245.80.146, rootserver=219.245.80.146, rootpath=                                                        
Looking up port of RPC 100003/2 on 219.245.80.146                                                                           
Looking up port of RPC 100005/1 on 219.245.80.146                                                                           
  Vendor: Alcor     Model: Flash Disk        Rev: 8.07                                                                      
  Type:   Direct-Access                      ANSI SCSI revision: 02                                                         
VFS: Mounted root (nfs filesystem).                                                                                         
Mounted devfs on /dev                                                                                                       
Freeing init memory: 104K                                                                                                   
Warning: unable to open an initial console



到这就不动了,再找找原因吧


能运行到上面已经成功了一大半了,再加把劲!!!


再网上查了一下,再做一如下的一些更改


mkdir mnt tmp var

chmod 1777 tmp


mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp

mkdir var/lib var/lock var/log var/run var/tmp

chmod 1777 var/tmp


mkdir home root boot



shell 加入全局变量文件 /etc/profile, 内容如下:

# Ash profile
# vim: syntax=sh

# No core files by default
#ulimit -S -c 0 > /dev/null 2>&1

USER="`id -un`"
LOGNAME=$USER
PS1='[/u@/h /W]/# '
PATH=$PATH:/usr/local/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
HOSTNAME=`/bin/hostname`

export USER LOGNAME PS1 PATH LD_LIBRARY_PATH

/sbin/ifconfig eth0 219.245.80.222 netmask 255.255.255.0


初始化文件 inittab 如下:

# /etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r


初始化文件 fstab如下:

# device mount-point type options  dump fsck  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
none   /tmp         ramfs defaults  0 0
mdev   /dev         ramfs defaults  0 0


初始化文件 init.d/rcS 如下:

#!/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel

#
#    Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
/bin/mount -t proc none /proc
/bin/mount -t tmpfs none /tmp
/bin/mount -t tmpfs none /var

/bin/mkdir -p /var/log

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


建立文件 /etc/mdev.conf ,内容为空


建立主机名存储文件 /etc/host

 gedit host

HOSTNAME=kevin

# 如果不指定主机名,默认的为 www

 


复制主机 /etc/ 下面的文件 passwd, group, shadow 文件到 /etc

cp /etc/group  .

cp /etc/passwd .

cp /etc/shadow .


修改用户 passwd 中用户使用的 shell 名称。 FC8 上默认的为 bash,uboot 中只支持 ash

root:x:0:0:root:/root:/bin/bash -->

root:x:0:0:root:/root:/bin/ash

 

eleday:x:500:500:kevin:/home/kevin:/bin/bash -->

eleday:x:500:500:kevin:/home/kevin:/bin/ash

 

再重新启动,一切都好了!!爽吧??

 





 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值