|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
0 w" @ @3 B9 M. ]+ u+ v3 z
经历了两天的时间的NFS文件系统工作,终于在我的FPGA开发板DE2上的uClinux和Ubuntu9.10上做好了NFS文件系统,现在总结一下,便于以后自己的学习。" H: f$ y8 [7 F3 M$ W; J1 ^( h
! g7 X8 t4 C% N, h' ~( w, y
一、理论篇* J. s* j, ]% }
1、什么是NFS?
( ]9 Q' b) ^6 C$ L% A& _5 _9 Q+ Z3 Z& |2 _& Q5 S
NFS是Network File System(网络文件系统)的缩写,最初是由Sun公司开发出来的分布式文件系统。提供NFS服务的一方是NFS Server(远程主机),使用NFS服务的一方是NFS Client(客户机)。利用它,客户机可以将远程主机提供的共享目录挂载到自己的目录上,在本地的操作如同对远程主机的操作。/ O% ~1 m4 V; l! L; ^# r7 w
4 l7 I* q) [1 G. l3 n# E+ j' }
2、NFS的原理
' Y' V# l% R5 h7 s
' C- k' N8 o! f2 R! {9 s NFS有自己的协议与端口号(2049),它本身并没有提供传输资料的协议,但是NFS却能通过网络进行资料的共享。这是因为在资料传送或者其它相关数据交互的时候,NFS用远程过程调用(Remote Procedure Call, RPC)的传输协议。RPC服务portmap负责管理服务与相关端口映射的工作。因此,使用NFS服务必须先激活RPC服务portmap,在主机和目标机上都要实现RPC服务,才可以使用NFS。
* _3 x7 r/ S2 F1 p) ~
9 T- R, P) B2 m二、实践篇
6 K# X* T" {5 E# {1、服务器(主机)上的配置9 v2 N* V, C+ W- S% c+ s" o
# e! d3 Z% ~3 p `: N
1.1、root下,配置NFS需要的软件包,命令如下:
3 |: b u; c, Z
0 ^' Z0 j) ]0 v sudo apt-get install nfs-kernel-server nfs-common portmap& V: |. i6 A! p. D; v3 Y
5 S4 R. |$ p3 o: d8 s- r1.2、配置portmap(其实这一步在Ubuntu里面可以省略),命令如下:
; Z J# |6 C) {& w! |& C! `3 t) b2 Z
sudo dpkg-reconfigure portmap 出现界面,选“否”! h% N+ H! O. M9 q( w" h# b
' G8 N4 J- g+ A- Z, h0 Y* d- G+ a
1.3、配置挂载目录和权限,如下图所示:增加自己挂载的目录,这里为/home/nios2(当然之前你需要mkdir /home/nios2)) X6 l s( `0 [' g
: c6 _8 U( u$ q6 }
; a) f% Z6 v7 V7 V/ n$ v0 ?
# l8 t( K2 A6 K6 ]4 b1 h
rw:读写权限 ro:只读权限
' d9 ]$ ~& J: Q4 _
2 S# {- b5 f% fno_root_squash:如果是root使用共享目录,那么他的权限将被压缩成匿名者。
h/ c4 k6 ]3 L, d+ k
) O" E7 |* U- ysync:资料同步写入内存与硬盘中 I% V. e6 _1 A. V8 N9 R# Q
h7 s3 g2 g# `, }# Y* d
async:资料会暂存于内存当中,而不会直接写入硬盘
. L9 E$ P! Z0 x# C/ c, e, Q! I/ y( C8 K* p3 U2 O
前面的*表示任何ip段的客户机都可以访问共享文件。
2 l7 U) N! x3 s3 w# ^3 _
- z. P; l4 R6 s' G1.4、刷新重载一下exports文件
+ t; N+ J- M( v( j( a+ W: W# F5 D1 u- B) u
sudo exportfs –r; N2 s+ Z# ^* L/ I
& } h* C8 V1 O$ P. m
1.5、重新启动NFS服务
8 F4 R6 z* _% O8 @. _) v7 l% z% U2 I2 w
/etc/init.d/portmap restart& g/ I8 i+ [1 L
$ r* ]/ b& N) g# e; d/ y8 b /etc/init.d/ nfs-kernel-server restart
* |; p2 N1 p$ F6 z$ U) \7 q) q i% ]: @
1.6 、测试能否挂载本地的目录* Y! Z5 ]- ^: W$ b& L
9 p5 L& C4 \' c( ?/ c* ] mount –t –nfs 192.168.1.110:/home/nios2 /mnt+ T( b% U, G6 J5 q
- [; W5 [2 T8 ~) s
ls /mnt
/ i6 k- t3 m1 }6 b' t# }5 j6 ]. q9 H7 W$ B/ M
( Z$ e! L* s! F: \2 K1 W6 C+ ?
1 U: y0 x: i( I同时,你也可以运用df命令来观察挂载的内容$ d& w* S& K7 I7 j
2 V; X2 k9 E# e$ X# g3 h
8 J: Q1 q* W0 F! ^( i# {* r1 K8 L' h
$ n. r5 w, O0 f( w. K你就可以发现/mnt目录下挂载了/home/nios2的内容。至此,主机上的配置就完成。
# r' w1 c$ i/ q& P x
$ l X2 n8 [/ T) a2、目标机(嵌入式开发板FPGA开发板的配置)
3 S& ?7 Z+ C2 ? A8 }2 E E, G/ h8 K8 K& A7 o7 w
由于我之前做过一个实验就是测试EtherNet的实验,在开发板和主机之前是相通的,并且开通了boa服务器,ftp服务器,所以硬件连接方面就没有问题。同时,由于我只是将主机和开发板直连,就不涉及到网关的概念啦!所以在开发板上就很容易就成功了!
( G; b8 P: S, l* V% g- x0 B j$ H" h6 v4 u% q. B
2.1、配置uClinux的内核,让它支持客户机NFS文件系统
! F2 ~: Q& H5 `* B$ S$ ` M* `' F% K# B& W9 p# g: ~% i; u- m, N
通过命令:make menuconfig进入内核配置界面,界面如下:$ Y" P2 i( a4 w% ]6 s" J
, c% q: i8 u$ F; z2 o
% O$ n8 m9 c2 u( K, J( j
exit---exit---yes,进入到内核子界面,如下:进入File systems -> Network File Systems -->,选择如下图所示:
% R3 s+ h5 Y* m5 o2 K
2 k* \& O0 C m% I+ V7 @3 b) r! A6 k* ~
之后,退出,进入下一个用户应用和库设定界面,Network Applications --> portmap,如下图所示:
- @0 M. T- d( T8 B$ ?+ d& _8 }1 O2 d$ [- i3 B
) k4 O3 v; A7 `# F5 d$ u. O5 v1 ]$ T+ A1 k9 E
之后,make,编译内核生成内核镜像,下载到开发板DE2上。
/ p' P$ i: T, n% W) z* R2 M' }) c0 d% k+ T
2.2 下载开发板,挂载主机中的目录
5 k: R! Q2 r, V, j0 E( e( x
* _0 o$ J4 y# C2 P通过nios2-configure-sof DE2_NIOS2.sof和nios2-download –g zImage和nios2-terminal启动DE2开发板上的uClinux系统,关于开发板网络通信的实验稍后再写一篇文章吧!3 l; V- C$ T3 Q" e# h, u
) x5 \/ n3 v! p! ]; P& l2 j
我们首先运行portmap命令和自己建立一个挂载的文件夹:
) q; B2 J5 O. z. N
+ ?4 \8 _7 g$ F3 @, B& P" ]/ \4 iportmap &
( v$ Z+ z6 l3 ^ S" ^4 }( g0 ?( b4 r
mkdir /ff
9 L& p- ]( P, s6 K# }: R6 `
+ T1 p: E3 \: \8 W. `5 T# Q4 B之后再将主机上/home/nios2的内容挂载到新建立的文件中,表示NFS文件系统挂载成功。如下图所示
7 x# ?" V2 O- v, _5 }1 q* N! {: R1 Q$ h- R" c* R! B, R
. G, m% ^' i$ Z! e* }/ f, W, V
4 {: q' P/ W7 m% I+ d
可以看到新建立的ff里面有了/home/nios2里面的东西,说明成功啦!但是,我们第一次的命令出现RPC错误,可能是硬件上碰了一下吧,一般都会成功的。/ Z& H C5 m9 P" z) g2 u `, H
# b1 |8 q/ ^0 F- x2.3、测试软件代码是否运行成功。
9 H9 Z5 z: q4 ]/ c/ i [+ _! |/ D l. F+ P: b4 _- c& I
上面的hi.c就是在Ubuntu里面利用下面命令生成的hi可执行文件,这个文件在Ubuntu里面是执行不了,引用用的编译命令是nios2-linux-uclibc-gcc,不是linux下的命令,是一种' H( T, b% y+ U9 l2 r8 M
' k+ d6 c5 f- J4 {0 |
交叉命令。6 H6 m/ K7 v) R( z$ W- e2 {! ?! a
) w8 L- i4 `1 v% l2 X/ c
nios2-linux-uclibc-gcc hi.c -o hi –elf2flt' m u0 `/ \. N M
: {' U, F- r0 i/ x
# B: h4 E: T* L8 b4 D% e) e
: x9 l0 w( k. p) _/ [+ C6 W总结:
4 R+ `4 d' [2 _4 f2 u- r1、理论上其实没有多少难点,关键在于首先要虚心看懂理论,切勿盲目开始做,因为你很有可能网上搜到的资料都不适合你的开发环境,所以理论知识很重要,需要静下心来学习。+ k3 K1 @6 \' D: C% Z
4 V+ |6 |4 Z z: k C% N" Z6 n1 l* s2、内核编译切勿乱添加东西,之前,我添加了一个客户机根目录NFS系统文件,后来,发现连/etc/rc里面的网卡配置都不好用,让我弄了一个多晚上,最终找到原因啦。这里,如果你想一启动就挂在的话,就把上面的命令添加到/etc/rc里面,就可以啦!
, }1 `& T+ M+ u/ H, N. c1 Q. w! S1 p/ T
3、linux之路还有很长的路,下次准备做一下web服务器的实验,boa好像自带就有,希望自己搭建一个socket的服务器。 |
|