在这里只提一下相关的选项,其它选项自己看着办吧!!
对于启动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
再重新启动,一切都好了!!爽吧??