本文虽标为原创,实际都是参考的网上的资源,权当一个记录
启动方式采用tftp模式载入uImage,然后用nfs载入文件系统
一、设置tftp载入uImage
开发板自带的Uboot功能很强大,启动Uboot后设置变量如下
baudrate=115200
serverip=192.168.1.178
bootdelay=3
ethact=macb0
ethaddr=192.168.1.20
bootcmd=tftp 22000000 uImage;bootm 22000000
bootargs=mem=128M console=ttyS0,115200 root=/dev/nfs nfsroot=192.168.1.178:/nfsboot,proto=tcp,nolock ip=192.168.1.20:192.168.1.178:192.168.1.1:255.255.255.0::eth0:off
实际启动时报错 TFTP error: 'Access violation' (2) 根据http://blog.csdn.net/david_xtd/article/details/7881347的文章解决了问题,需要把/tftproot/uImage的权限改为可读写
sudo chmod 666 /tftproot/uImage
二、用nfs启动文件系统
首先,开发板给的内核是不支持nfs启动的,要先重新编译内核,加入必要的选项才行,过程如下
将内核源代码解压,在源代码目录下执行 make menuconfig 此时会报错,要安装ncurse的相关包
sudo apt-get install libncurses5-dev libncurses5
进入界面后,选择下面的相关项 (引自http://blog.csdn.net/do2jiang/article/details/4195182)
添加内核对NFS的支持:
n Networking Options
(*)TCP/IP networking
(*)IP: kernel level autoconfiguration
(*)IP: DHCP support
(*)IP: Bootp support
(*)IP: Rarp support
n File systems
l Network File Systems
(*)NFS file system support
(*)Root file system on NFS
添加支持内核调试的项目 (引自http://www.myir-tech.com/resource/500.asp)
选择“kernel hacking”>“Kernel debugging”选项,其符号为“DEBUG_KERNEL”
选择“kernel hacking”>“compile the kernel with debug info”选项,符号为“DEBUG_INFO”
最后保存退出
执行编译
进入Makefile,修改
ARCH := arm
CROSS_COMPILE := arm-none-linux-gnueabi-
make at91sam9x5ek_defconfig
make uImage
实际上这里要先执行 make at91sam9x5ek_defconfig然后再修改nfs和kernel debug的支持。教训深刻!
编译完后将uImage拷贝到设置的tftp根目录下,内核就准备好了
然后将文件系统解压到nfsboot目录下。开发板自带的文件系统都是准备烧录到flash上的,就是将可执行程序制作成img格式
nfs启动不需要这样的文件。本次实验用的是real6410板带的qt系统,直接解压到nfs启动目录即可。
连好板子后上电启动,前期一切正常,在最后报如下错误
eth0: link up (100/Full)
VFS: Mounted root (nfs filesystem) on device 0:13.
Freeing init memory: 148K
mount: mounting none on /proc/bus/usb failed: No such file or directory
hwclock: can't open '/dev/misc/rtc': No such file or directory
eth0: link down
nfs: server 192.168.1.178 not responding, still trying
问百度,多数认为是nfs配置问题导致丢包,按提供的方法改nfs的协议,从udp该到tcp,然后一个就是该每次传输的块,更改rsize和wsize,多种尝试都没有解决,最后有一位大神说是可能是根文件系统启动的时候更改了目标板的ip,最后搜到http://bbs.chinaunix.net/thread-3633824-1-1.html的帖子,基本和他的问题一样,照葫芦画瓢,找到etc/init.d目录下对网卡的配置ifconfig-eth0文件,内容如下
#!/bin/sh
echo -n Try to bring eth0 interface up......>/dev/ttySAC0
if [ -f /etc/eth0-setting ] ; then
source /etc/eth0-setting
if grep -q "^/dev/root / nfs " /etc/mtab ; then
echo -n NFS root ... > /dev/ttySAC0
else
ifconfig eth0 down
ifconfig eth0 hw ether $MAC
ifconfig eth0 $IP netmask $Mask up
route add default gw $Gateway
fi
# echo nameserver $DNS > /etc/resolv.conf
else
if grep -q "^/dev/root / nfs " /etc/mtab ; then
echo -n NFS root ... > /dev/ttySAC0
else
/sbin/ifconfig eth0 192.168.1.20 netmask 255.255.255.0 up
fi
fi
inetd
telnetd
echo Done > /dev/ttySAC0
仔细比对首先发现串口不对,将/dev/ttySAC0改为/dev/ttyS0,然后添加各种打印语句,再重试,发现确实是这个配置文件执行了 ifconfig eth0 down,然后再没启动,问题最后定位在文件系统重新设置eth0时,网络关闭后没有成功的再启动网络, 将这几句 ifconfig eth0 down
ifconfig eth0 hw ether $MAC
ifconfig eth0 $IP netmask $Mask up
route add default gw $Gateway
全部注释掉,再重启一切ok