怎么在uboot里面设置使用tcp协议详解nfs

我的新浪微博:。
欢迎大家相互交流,共同提高技术。
一、网络文件系统概述
Sun&Microsystems公司于1984年推出了一个在整个计算机工业中被广泛接受的远程文件存取机制,它被称为Sun的网络文件系统(Network&File&System),或者简称为NFS。该机制允许在一台计算机上运行一个服务器,使对其上的某些或所有文件都可以进行远程存取,还允许其他计算机上的应用程序对这些文件进行存取。
它使我们能够达到文件的共享。当使用者想用远端档案时只要用"mount"就可把remote档案系统挂接在自己的档案系统之下,使得远端的文件操作上和本地机器的文件没两样。一个应用程序可以打开(Open)一个远程文件以进行存取,可以从这个文件中读取(Read)数据,向该文件中写入(Write)数据,定位(Seek)到文件中的某个指定位置(开始、结尾或者其他地方),最后当使用完毕后关闭(Close)该文件。并且这些操作都是对编程者透明的,操作方法和对本地文件的操作方法完全一样。
二、NFS协议
NFS协议使用NFS,客户端可以透明地访问服务器中的文件系统,这不同于提供文件传输的FTP协议。FTP会产生文件一个完整的副本;NFS只访问一个进程引用文件部分,并且一个目的就是使得这种访问透明。这就意味着任何能够访问一个本地文件的客户端程序不需要做任何修改,就应该能够访问一个NFS文件。NFS是一个使用SunRPC构造的客户端/服务器应用程序,其客户端通过向一台NFS服务器发送RPC请求来访问其中的文件。尽管这一工作可以使用一般的用户进程来实现,即NFS客户端可以是一个用户进程,对服务器进行显式调用,而服务器也可以是一个用户进程。因为两个理由,NFS一般不这样实现。首先访问一个NFS文件必须对客户端透明,因此NFS的客户端调用是由客户端操作系统代表用户进程来完成的;其次,出于效率的考虑,NFS服务器在服务器操作系统中实现。如果NFS服务器是一个用户进程,每个客户端请求和服务器应答(包括读和写的数据)将不得不在内核和用户进程之间进行切换,这个代价太大。第3版的NFS协议在1993年发布,下图所示为一个NFS客户端和一台NFS服务器的典型结构。&
图1&&NFS客户端和NFS服务器的典型结构&
(1)访问一个本地文件还是一个NFS文件对于客户端来说是透明的,当文件被打开时,由内核决定这一点。文件被打开之后,内核将本地文件的所有引用传递给名为&本地文件访问&的框中,而将一个NFS文件的所有引用传递给名为&NFS客户端&的框中。
(2)NFS客户端通过其TCP/IP模块向NFS服务器发送RPC请求,NFS主要使用UDP,最新的实现也可以使用TCP。
(3)NFS服务器在端口2049接收作为UDP数据包的客户端请求,尽管NFS可以被实现为使用端口映射器,允许服务器使用一个临时端口,但是大多数实现都是直接指定UDP端口2049。
(4)当NFS服务器收到一个客户端请求时,它将这个请求传递给本地文件访问例程,然后访问服务器主机上的一个本地的磁盘文件。
(5)NFS服务器需要花一定的时间来处理一个客户端的请求,访问本地文件系统一般也需要一部分时间。在这段时间间隔内,服务器不应该阻止其他客户端请求。为了实现这一功能,大多数的NFS服务器都是多线程的&&服务器的内核中实际上有多个NFS服务器在NFS本身的加锁管理程序中运行,具体实现依赖于不同的操作系统。既然大多数UNIX内核不是多线程的,一个共同的技术就是启动一个用户进程(常被称为&nfsd&)的多个实例。这个实例执行一个系统调用,使其作为一个内核进程保留在操作系统的内核中。
(6)在客户端主机上,NFS客户端需要花一定的时间来处理一个用户进程的请求。NFS客户端向服务器主机发出一个RPC调用,然后等待服务器的应答。为了给使用NFS的客户端主机上的用户进程提供更多的并发性,在客户端内核中一般运行着多个NFS客户端,同样具体实现也依赖于操作系统。
三、NFS的工作原理和服务进程的作用
在Linux中,NFS和服务进程是两个不同的概念,但它们确实紧密联系在一起。首先,先介绍NFS的工作原理。
第一节、NFS的工作原理
启动NFS文件服务器时,/etc/rc.local会自动启动exportfs程序,指定可以导出的文件或目录,而所能挂载的也只能是其所指定的目录。NFS是基于XDR/RPC协议的。XDR(eXternal&Data&Representation,即外部数据表示法)提供一种方法,把数据从一种格式转换成另一种标准数据格式表示法,确保在不同的计算机、操作系统及程序语言中,所有数据代表的意义都是相同的。RPC(Remote&Procedure&Call,远程程序调用)请求远程计算机给予服务。客户机通过网络传送RPC到远程计算机,请求服务。NFS运用RPC传送数据的方法有以下几步:(1)客户送出信息,请求服务。(2)客户占位程序把客户送出的参数转换成XDR标准格式,并用系统调用把信息送到网络上。(3)信息经过网络送达远程主机系统。(4)远程主机将接受到的信息传给服务器占位程序。(5)把XDR形式的数据,转换成符合主机端的格式,取出客户发出的服务请求参数,送给服务器。(6)服务器给客户发送服务的逆向传送过程。
第二节、服务进程的作用
服务进程是系统在启动计算机后自动运行的程序,包括对网络的连接、网络协议的加载、图形桌面的显示、文件系统的加载等,Linux系统中常见的进程包括以下几种。(1)nfsd根据客户端对文件系统的需求,启动文件系统请求服务进程,响应客户的请求,而一般文件系统请求服务进程的数目是8,这也是在rc.local中写nfsd&8&&的原因。(2)biod此进程是在NFS客户端上用的,用来启动异步块I/O服务进程来建立Buffer&Cache,处理在客户机上的读写。(3)mountd这是个RPC服务器。启动rpc.mountd服务进程后,mountd会读取/etc/xtab查看哪一台客户机正在挂载哪一个文件系统,并回应客户机所要挂载的路径。(4)inetd&Internet&services服务进程当系统启动时,rc.local会启动inetd读取inetd.conf配置文件,读取网络上所有服务器的地址,链接启动inetd.conf中所有的服务器。当客户机请求服务时,inetd就会启动相关的服务进程,如user使用telnet时,inetd启动telnetd配合user&telnet的需求,其余像ftp、finger、rlogin等应用程序,inetd也都会启动相对应的服务程序ftpd、fingerd、rloingd等。(5)portmap服务程序主要功能是将TCP/IP通信协议的端口数字转换成RPC程序数字,因为这样客户端才能进行RPC调用。一般RPC服务器是被inet启动的,所以portmap必须在inetd之前启动,否则无法进行RPC调用。&
四、NFS服务器之RPC
因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动。每启动一个功能就会启用一些端口来传输数据,因此NFS的功能所对应的端口才没有固定,而是采用随机取用一些未被使用的小于724的端口来作为传输之用。但如此一来又造成客户端要连接服务器时的困扰,因为客户端要知道服务器端的相关端口才能够联机,此时我们需要远程过程调用(RPC)的服务。RPC最主要的功能就是指定每个NFS功能所对应的端口号,并且回报给客户端,让客户端可以连接到正确的端口上。当服务器在启动NFS时会随机选用数个端口,并主动地向RPC注册。因此RPC可以知道每个端口对应的NFS功能。然后RPC固定使用端口111来监听客户端的请求并回报客户端正确的端口,所以可以让NFS的启动更为容易。注意,启动NFS之前,要先启动RPC;否则NFS会无法向RPC注册。另外,重新启动RPC时原本注册的数据会不见,因此RPC重新启动后它管理的所有程序都需要重新启动以重新向RPC注册。当客户端有NFS文件要存取请求时,它如何向服务器端要求数据?(1)客户端会向服务器端的RPC(port&111)发出NFS文件存取功能的询问请求。(2)服务器端找到对应的已注册的NFS&daemon端口后会回报给客户端。(3)客户端了解正确的端口后,就可以直接与NFS守护进程来联机。由于NFS的各项功能都必须要向RPC注册,因此RPC才能了解NFS服务的各项功能的port&number、PID和NFS在主机所监听的IP等,而客户端才能够通过RPC的询问找到正确对应的端口。即NFS必须要有RPC存在时才能成功地提供服务,因此我们称NFS为RPC&Server的一种。事实上,有很多这样的服务器都向RPC注册。例如,NIS(Network&Information&Service)也是RPC&Server的一种。所以如下图所示,不论是客户端还是服务器端,要使用NFS都需要启动RPC。
图2&NFS与RPC服务及操作系统的相关性
NFS协议从诞生到现在为止,已经有多个版本,如NFS&V2(rfc794)及NFS&V3(rfc1813)(最新的版本是V4(rfc307))。最早,SUN公司曾将NFS&V2设计为只使用UDP,主要原因是当时机器的内存、网络速度和CPU的影响,不得不选择对机器负担较轻的方式。而到了NFS&V3,SUN公司选择了TCP作为默认的传输方式。V3相对V2的主要区别如下:(1)文件尺寸:V2最大只支持32位的文件大小(4&GB),而V3新增加了支持64位文件大小的技术(2)文件传输尺寸:V3没有限定传输尺寸,V2最多只能设定为8&KB,可以使用-rsize&and&-wsize来设定(3)返回完整的信息:V3增加和完善了返回错误和成功信息,对于服务器的设置和管理能带来很大好处(4)增加了对TCP传输协议的支持:V2只提供了对UDP的支持,在一些高要求的网络环境中有很大限制;V3增加了对TCP的支持。UDP有着传输速度快且非连接传输的便捷特性,但是在传输上没有TCP稳定。当网络不稳定或者黑客入侵时很容易使NFS的性能大幅度降低,甚至使网络瘫痪。所以对于不同情况,网络要有针对性地选择传输协议。NFS的默认传输协议是UDP,然而RHEL&4.0内核提供了对通过TCP的NFS的支持。要通过TCP来使用NFS,在客户端系统上挂载NFS导出的文件系统时包括一个&-o&tcp&选项。使用TCP的优点和缺点如下:1)被提高了的连接持久性,因此获得的NFS&stale&file&handles消息就会较少。2)载量较大的网络的性能会有所提高,因为TCP确认每个分组,而UDP只在完成时才确认。3)TCP具有拥塞控制技术(UDP根本没有),在一个拥塞情况严重的网络上,UDP分组是被首先撤销的类型。使用UDP意味着,如果NFS正在写入数据(单元为8&KB的块),所有这8&KB数据都需要被重新传输。由于TCP的可靠性,8&KB数据中只有一部分需要重新传输。4)错误检测。当TCP连接中断(由于服务器停止),客户端就会停止发送数据而开始重新连接。UDP是无连接的,使用它的客户端就会继续给网络发送数据直到服务器重新上线为止。5)TCP的费用在性能方面的提高并不显著。(5)异步写入特性。(6)改进了服务器的mount性能。(7)有更好的I/O写性能。(8)更强的网络运行效能,使得网络运行更为有效。(9)更强的灾难恢复功能。
在Linux上,UDP是默认使用的协议。作为服务器别无选择。但作为客户端,可以使用TCP和其他使用TCP的UNIX&NFS服务器互联。在局域网中使用UDP较好,因为局域网有比较稳定的网络保证。使用UDP可以带来更好的性能,Linux默认使用V2,但是也可以通过mount&option的nfsvers=n选择。NFS使用TCP/IP提供的协议和服务运行于OSI层次模型的应用层,如表1所示。
表1&&OSI层次模型上的NFS
数据链路层
阅读(...) 评论()怎么在uboot里面设置使用tcp协议nfs_百度知道
怎么在uboot里面设置使用tcp协议nfs
nfs默认使用udp;uboot面设置使用tcp协议nfs
我来帮他解答
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁您所在的位置: &
NFS协议的优化设置
NFS协议的优化设置
下面我们来对NFS协议的调优步骤进行一下介绍。首先我们需要测量当前网络的效率,之后对于一些资源的使用进行调查,然后调整服务器,重复此步骤,完成调优。
NFS,是网络文件系统。这个大家是知道的。那么对于这个协议的使用,我们在前面也介绍过一部分。今天说一下NFS协议的调优过程,这个也是比较简单的。在下面我们用了四个步骤来完成这个过程,大家可以看一下具体的内容,进行一下操作。
调优的步骤:
1、测量当前网络、服务器和每个客户端的执行效率.
2、分析收集来的数据并画出图表.查找出特殊情况,例如很高的磁盘和CPU占用、已经高的磁盘使用时间
3、调整服务器
4、重复第一到第三步直到达到你渴望的性能
与 NFS协议性能有关的问题有很多,通常可以要考虑的有以下这些选择:
WSIZE,RSIZE参数来优化NFS的执行效能
WSIZE、 RSIZE对于NFS的效能有很大的影响.
wsize和rsize设定了SERVER和CLIENT之间往来数据块的大小,这两个参数的合理设定与很多方面有关,不仅是软件方面也有硬件方面的因素会影响这两个参数的设定(例如LINUX KERNEL、网卡,交换机等等).
下面这个命令可以测试NFS协议的执行效能,读和写的效能可以分别测试,分别找到合适的参数.对于要测试分散的大量的数据的读写可以通过编写脚本来进行测试.在每次测试的时候最好能重复的执行一次MOUNT和unmount.
time dd if=/dev/zero of=/mnt/home/testfile bs=16k count=16384
用于测试的WSIZE,RSIZE最好是1024的倍数,对于NFS V2来说8192是RSIZE和WSIZE的最大数值,如果使用的是 NFS V3则可以尝试的最大数值是32768.
如果设置的值比较大的时候,应该最好在CLIENT上进入mount上的目录中,进行一些常规操作(LS,VI等等),看看有没有错误信息出现.有可能出现的典型问题有LS的时候文件不能完整的列出或者是出现错误信息,不同的操作系统有不同的最佳数值,所以对于不同的操作系统都要进行测试.
设定最佳的NFSD的COPY数目.
linux中的NFSD的COPY数目是在/etc/rc.d/init.d/nfs这个启动文件中设置的,默认是8个NFSD,对于这个参数的设置一般是要根据可能的CLIENT数目来进行设定的,和WSIZE、RSIZE一样也是要通过测试来找到最近的数值.
UDP and TCP
可以手动进行设置,也可以自动进行选择.
mount -t nfs -o sync,tcp,noatime,rsize=1024,wsize=1024 EXPORT_MACHINE:/EXPORTED_DIR /DIR
UDP有着传输速度快,非连接传输的便捷特性,但是UDP在传输上没有TCP来的稳定,当网络不稳定或者黑客入侵的时候很容易使NFS协议的 Performance 大幅降低甚至使网络瘫痪.所以对于不同情况的网络要有针对的选择传输协议.nfs over tcp比较稳定,nfs over udp速度较快.在机器较少网络状况较好的情况下使用UDP协议能带来较好的性能,当机器较多,网络情况复杂时推荐使用TCP协议(V2只支持UDP协议).在局域网中使用UDP协议较好,因为局域网有比较稳定的网络保证,使用UDP可以带来更好的性能,在广域网中推荐使用TCP协议,TCP协议能让NFS在复杂的网络环境中保持最好的传输稳定性.可以参考这篇文章:.tw/ssn/unix/0212/unix021204.
版本的选择
V3作为默认的选择(RED HAT 8默认使用V2,SOLARIS 8以上默认使用V3),可以通过 vers= mount option来进行选择.
LINUX通过mount option的nfsvers=n进行选择.【责任编辑: TEL:(010)】
关于的更多文章
TCP/IP(传输入控制地议/网际协议)是一种网络通信协议,它规范
2014年,锐捷网络开启精简设备、管理的“极简网络”新时代。
随着高清视频、社交游戏、云计算、物联网等新兴业务
一年前的IPv6启动日之后,IPv6现状如何?为何IPv6的流
SDN究竟能给客户带来什么?究竟是不是雾中花?其发展一
本书全面阐述Java应用安全的基本知识并介绍一种强大的结构化安全设计方法;介绍独立于厂商的安全架构;列出详细的评估核对表以及
51CTO旗下网站U-boot的环境变量值得注意的有两个: bootcmd 和bootargs。
&&&&前面有说过bootcmd是自动启动时默认执行的一些命令,因此你可以在当前环境中定义各种不同配置,不同环境的参数设置,然后设置bootcmd为你经常使用的那种参数。
u-bootargs
&&&&bootargs是环境变量中的重中之重,甚至可以说整个环境变量都是围绕着bootargs来设置的。bootargs的种类非常非常的多,我们平常只 是使用了几种而已,感兴趣的可以看看这篇文章说的很全:http://blog.chinaunix.net/u2/79570 /showart_1675071.html。bootargs非常的灵活,内核和文件系统的不同搭配就会有不同的设置方法,甚至你也可以不设置
bootargs,而直接将其写到内核中去(在配置内核的选项中可以进行这样的设置),正是这些原因导致了bootargs使用上的困难。
&&&&下面介绍一下bootargs常用参数,bootargs的种类非常的多,而且随着kernel的发展会出现一些新的参数,使得设置会更加灵活多样。
用来指定rootfs的位置, 常见的情况有:
&&&&root=/dev/ram rw&&&
&&&&root=/dev/ram0 rw
&&请 注意上面的这两种设置情况是通用的,我做过测试甚至root=/dev/ram1 rw和root=/dev/ram2 rw也是可以的,网上有人说在某些情况下是不通用的,即必须设置成ram或者ram0,但是目前还没有遇到,还需要进一步确认,遇到不行的时候可以逐一尝 试。
&&&&root=/dev/mtdx rw
&&&&root=/dev/mtdblockx rw
&&&&root=/dev/mtdblock/x rw
&&&&root=31:0x
上 面的这几个在一定情况下是通用的,当然这要看你当前的系统是否支持,不过mtd是字符设备,而mtdblock是块设备,有时候你的挨个的试到底当前的系 统支持上面那种情况下,不过root=/dev/mtdblockx rw比较通用。此外,如果直接指定设备名可以的话,那么使用此设备的设备号也是可以的。
&&&&root=/dev/nfs
在文件系统为基于nfs的文件系统的时候使用。当然指定root=/dev/nfs之后,还需要指定nfsroot=serverip:nfs_dir,即指明文件系统存在那个主机的那个目录下面。
B. rootfstype
&&&&这个选项需要跟root一起配合使用,一般如果根文件系统是ext2的话,有没有这个选项是无所谓的,但是如果是jffs2,squashfs等文件系统的话,就需要rootfstype指明文件系统的类型,不然会无法挂载根分区.
C. console
console=tty&&使用虚拟串口终端设备 .
console=ttyS[,options] 使用特定的串口,options可以是这样的形式bbbbpnx,这里bbbb是指串口的波特率,p是奇偶位(从来没有看过使用过),n是指的bits。
console=ttySAC[,options] 同上面。
看 你当前的环境,有时用ttyS,有时用ttySAC,网上有人说,这是跟内核的版本有关,2.4用ttyS,2.6用ttySAC,但实际情况是官方文档 中也是使用ttyS,所以应该是跟内核版本没有关联的。可以查看Documentation/serial-console.txt找到相关描述。
mem=xxM 指定内存的大小,不是必须的
E. ramdisk_size
ramdisk=xxxxx&&&&&&&&&&&不推荐&&&
ramdisk_size=xxxxx&&&推荐
上 面这两个都可以告诉ramdisk 驱动,创建的ramdisk的size,默认情况下是4m(s390默认8M),你可以查看Documentation/ramdisk.txt找到相关 的描述,不过ramdisk=xxxxx在新版的内核都已经没有提了,不推荐使用。
F. initrd, noinitrd
当你没有使用ramdisk启动系统的时候,你需要使用noinitrd这个参数,但是如果使用了的话,就需要指定initrd=r_addr,size, r_addr表示initrd在内存中的位置,size表示initrd的大小。
init 指定的是内核启起来后,进入系统中运行的第一个脚本,一般init=/linuxrc, 或者init=/etc/preinit,preinit的内容一般是创建console,null设备节点,运行init程序,挂载一些文件系统等等操 作。请注意,很多初学者以为init=/linuxrc是固定写法,其实不然,/linuxrc指的是/目录下面的linuxrc脚本,一般是一个连接罢 了。
H. mtdparts
mtdparts=fc000000.nor_flash:1920k(linux),128k(fdt),20M(ramdisk),4M(jffs2),38272k(user),256k(env),384k(uboot)
要 想这个参数起作用,内核中的mtd驱动必须要支持,即内核配置时需要选上Device Drivers&&---& Memory Technology Device (MTD) support&&---&
Command line partition table parsing
mtdparts的格式如下:
mtdparts=[;
&&:= [@offset][][ro]
&&&:= unique id used in mapping driver/device
&&&&:= standard linux memsize OR &-& to denote all remaining space
&&&&:= (NAME)
因此你在使用的时候需要按照下面的格式来设置:
mtdparts=mtd-id:@(),@()
这里面有几个必须要注意的:
a.&&mtd-id 必须要跟你当前平台的flash的mtd-id一致,不然整个mtdparts会失效
b.&&size在设置的时候可以为实际的size(xxM,xxk,xx),也可以为'-'这表示剩余的所有空间。
假设flash 的mtd-id是sa1100,那么你可以使用下面的方式来设置:
mtdparts=sa1100:-&&&&&→&&只有一个分区
mtdparts=sak(ARMboot)ro,-(root)&&→&&有两个分区
可以查看drivers/mtd/cmdlinepart.c中的注释找到相关描述。
指定系统启动之后网卡的ip地址,如果你使用基于nfs的文件系统,那么必须要有这个参数,其他的情况下就看你自己的喜好了。设置ip有两种方法:
ip = ip addr
ip=ip addr:server ip addr:gateway:netmask::which netcard:off
这两种方法可以用,不过很明显第二种要详细很多,请注意第二种中which netcard 是指开发板上的网卡,而不是主机上的网卡。
说完常见的几种bootargs,那么我们来讨论平常我经常使用的几种组合:
1). 假设文件系统是ramdisk,且直接就在内存中,bootargs的设置应该如下:
setenv bootargs ‘initrd=0xxa00000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’
2). 假设文件系统是ramdisk,且在flash中,bootargs的设置应该如下:
setenv bootargs ‘mem=32M console=ttyS0,115200 root=/dev/ram rw init=/linuxrc’
注意这种情况下你应该要在bootm命令中指定ramdisk在flash中的地址,如bootm kernel_addr ramdisk_addr (fdt_addr)
3). 假设文件系统是jffs2类型的,且在flash中,bootargs的设置应该如下
setenv bootargs ‘mem=32M console=ttyS0,115200 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 init=/linuxrc’
4). 假设文件系统是基于nfs的,bootargs的设置应该如下
setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5:192.168.0.3:192.168.0.3:255.255.255.0::eth0:off’
setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5’
上面就是我们经常使用的几种bootargs的组合,老实说,bootargs非常非常的灵活,所以设置的方法有很多中形式,具体的还应该根据你的平台具体的情况来设置。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:51132次
积分:1019分
排名:第16601名
原创:50篇
转载:14篇
评论:21条
(1)(1)(1)(1)(1)(3)(3)(3)(3)(1)(1)(10)(18)(11)(4)(2)}

我要回帖

更多关于 天猫游戏兑换码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信