分类: LINUX
2008-08-29 21:16:40
author:
王敏敏(unc and wmmwang)
date:
2008.08.30
references:
internet and linux内核的nfsroot.c源码以及nfsroot.txt文档。
这几天弄了块9200的新板,板子和PC直连,挂载NFS根文件系统OK,可时用路由器(D-LINK的)了之后,NFS根文件系统挂接总是有问题:
nfs: server 192.168.0.114 not responding
nfs: server 192.168.0.114 not responding
nfs: server 192.168.0.114 OK
总是时一会连上,一会掉,这样反反复复。感觉时丢包引起。
方法一:设置U-BOOT环境变量:
bootargs=root=/dev/nfs nfsroot=192.168.0.114:/home/rootfs/nfs,rsize=1500,wsize=1500 ip=192.168.0.113:192.168.0.114:192.168.0.2:255.255.255.0 console=tty0 ttyS0,115200 mem=64M
增加rsize和wsize参数,增加块大小(默认为1024),我猜想可以减小丢包概率。改了之后,果然还可以了。
方法二:设置U-BOOT环境变量:
bootargs=root=/dev/nfs nfsroot=192.168.0.114:/home/rootfs/nfs,tcp ip=192.168.0.113:192.168.0.114:192.168.0.2:255.255.255.0 console=tty0 ttyS0,115200 mem=64M
这个方法时参考网上的。nfs默认的协议是udp,改用tcp协议可改善网络拥堵处理状况。经使用,也可以。不过,不如方法一的ucp,挂载文件系统明显感觉要慢很多。
引用网上一篇文章供自己参考:
嵌入式linux的开发中,内核移植及根文件系统的建立过程中,为了验证内核移植是否成功,根文件系统的建立是否可行,需要将它们的映像文件烧写到 Flash中反复试验。如此频繁地烧写Flash,既浪费时间,减低了开发效率,还会对Flash造成损伤。因此在内核移植及根文件系统的建立过程中一般采用网络引导。具体操作过程如下:
一 Boot Loader环境变量及内核参数设置
我的开发板的boot loader采用的是U-boot,其环境变量设置如下:
Uboot> printenv
bootdelay=3
baudrate=115200
ethaddr=00:12:34:56:78:9a
ipaddr=192.168.0.9 ①
serverip=192.168.0.1 ②
netmask=255.255.255.0
rootpath=/home/zht/rfsys ③
stdin=serial
stdout=serial
stderr=serial
bootcmd=tftp 21000000 uImage;bootm 21000000 ④
bootargs=root=/dev/nfs rw nfsroot=192.168.0.1:/home/zht/rfsys nfsaddrs=192.168.0.48: 192.168.0.1:192.168.0.1:255.255.255.0 console=ttyS0,115200 mem=32M ⑤
① 设置目标板IP地址
② 设置服务器IP地址
③ 设置根文件系统在服务器上的路径,注意该路径一定要设定为服务器上的nfs目录。
④ bootcmd是u-boot启动后执行的命令,命令之间用分号分隔。
tftp 21000000 uImage 表示通过tftp 将内核映像下载到RAM中地址为0x21000000;
bootm 21000000 启动linux操作系统
⑤ 定义u-boot传送给linux内核的命令行参数,该命令行指定以网络文件系统作为根文件系统。
其中root=/dev/nfs,并非真的设备,而是一个告诉内核经由网络取得根文件系统的旗标。
参数nfsroot这个参数告诉内核以那一台机器,那个目录以及那个网络文件系统选项作为根文件系统使用。参数的格式如下:
nfsroot=[
如果指令列上没有给定 nfsroot 参数,则将使用‘/tftpboot/%s’预设值。其它选项如下:
port = as given by server portmap daemon
rsize = 1024
wsize = 1024
timeo = 7
retrans = 3
acregmin = 3
acregmax = 60
acdirmin = 30
acdirmax = 60
flags = hard, nointr, noposix, cto, ac
参数nfsaddrs设定网络通讯所需的各种网络接口地址。如果没有给定这个参数,则内核核会试著使用反向地址解析协议以及/或是启动协议(BOOTP)以找出这些参数。其格式如下:
nfsaddrs=
此
二 内核配置要求
添加内核对NFS的支持:
选中networking options-》IP:kernel level auloconfiguralion项
选中file systems-》network file systems-》下的root file system on nfs 和nfs file system support
三 TFTP服务器的配置
以root用户登录,运行setup命令
#setup
选择Systme services,选择tftp。
打开tftp配置文件/etc/xinetd.d/tftp
将server_args设定为内核映像文件所在目录,默认为/tftpboot
我的内核映像在/home/zht/sources/kernel/linux-2.4.27目录中,设定如下:
service tftp
{
disable = no
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /home/zht/sources/kernel/linux-2.4.27
per_source = 11
cps = 100 2
flags = IPv4
}
重新启动PC linux操作系统或者运行service xinetd restart命令启动tftp服务器。
运行netstat -a | grep tftp 可以查看tftp服务器是否配置成功。
四 NFS服务器的配置
以root身份登陆Linux服务器,编辑/etc目录下的共享目录配置文件exports,指定共享目录及权限等。
执行如下命令编辑文件/etc/exports:
# vi /etc/exports
在该文件里添加如下内容:
/home/zht/rfsys 192.168.0.*(rw,sync,no_root_squash)
编辑完过后保存退出,然后运行命令exportfs –rav检查输入是否正确。
添加的内容表示:允许ip地址范围在192.168.0.*的计算机以读写的权限来访问/home/zht/rfsys目录。/home/work也称为服务器输出共享目录。
括号内的参数意义描述如下:
rw:读/写权限,只读权限的参数为ro;
sync:数据同步写入内存和硬盘,也可以使用async,此时数据会先暂存于内存中,而不立即写入硬盘。
no_root_squash:NFS服务器共享目录用户的属性,如果用户是 root,那么对于这个共享目录来说就具有 root 的权限。
接着执行如下命令,启动端口映射:
# /etc/rc.d/init.d/portmap start
最后执行如下命令启动NFS服务,此时NFS会激活守护进程,然后就开始监听 Client 端的请求:
# /etc/rc.d/init.d/nfs start
在NFS服务器启动后,还需要检查Linux服务器的防火墙等设置(一般需要关闭防火墙服务,执行iptables -F),确保没有屏蔽掉NFS使用的端口和允许通信的主机,主要是检查Linux服务器iptables,ipchains等选项的设置,以及/etc/hosts.deny,/etc/hosts.allow文件。
我们首先在Linux服务器上进行NFS服务器的回环测试,验证共享目录是否能够被访问。在Linux服务器上运行如下命令:
# mount –t nfs 192.168.0.20: /home/zht/rfsys /mnt
# ls /mnt
命令将Linux服务器的NFS输出共享目录挂载到/mnt目录下,因此,如果NFS正常工作,应该能够在/mnt目录看到/home/work共享目录中的内容。
五 将内核映像文件uImage拷贝到/tftpboot目录,建立的根文件系统拷贝到/home/zht/rfsys目录中。然后重新启动目标板。