嵌入式NFS文件系统



NFS文件系统服务端配置


下面我们就来看下一个NFS,那么NFS顾名思义叫做网络文件系统。


nfs1.png


如图,所谓的网络文件系统,其实我们的思路就是开发板上(图左侧的四边形),其实就有一个核心(图中圆圈)然后他的硬盘一般来说非常小,甚至来说,在实际开发中,我们nandflash的驱动,可能还不支持,这样的话我们驱动开发人员就需要花大量的时间进行相应的驱动开发包括驱动接口的编写等等,所以说非常的耗时。但是你可以想象一下我们在写这样的驱动或应用开发的时候,我们肯定不会因为nandflash没有烧好让我们这个产品就一直拖在那里,所以这是不现实的。所以一般来说我们会选择很方便的方法把文件系统跑起来,让我们的应用开发工程师有很多的时间去彻查,等我们最终烧写到开发版过后,我们再说最后系统是以什么样的方式部署这个文件系统的。


所以这样,我们还有一种比较常规的思路开发,就是我们可以借助PC(图右侧的大长方形)我们的PC1般情况下都是linux或者windows,Linux是作为开发主机为主,Windows只是我们查资料或其他什么可能会用得到。然后在linux中我们是不是就可以考虑这样一个问题,把linux其中一个目录块(图右侧大长方形中的小长方形)因为linux虚拟机里面一般来说硬盘肯定很大,肯定是要比实际的开发板要大。那么我现在就可以想一个办法把PC里面的文件通过网络线跟我们开发板进行相连,然后这就是传说介子,把这样的数据想办法通过一定的格式让我们的另一款内核能够挂上去。就相当于我们U盘是通过网线这个介子把它插到我们的开发板上。然后这个开发板也是通过这个网线的形式去读数据,这样的话就相当于外界的存储器跟我们的开发板相连了。


当时是这样思考的,但是现在思考中,我们就把这个挂接到U盘上的东西在加一些。也就是说这不仅仅是U盘了而是我们的根,也就是说我现在不仅仅把它当成一个普通U盘插上去,我干脆就把这个东西当成根文件,也就是说我们的根系统直接运行到这个地方,然后剩下在说其他挂载的问题。


这也是我们在实际开发中经常使用的,因为Linux尤其在涉及具体操作编写的时候,直接操作这个根文件就非常方便。而如果像我们之前ramdisk一样,做完之后在想办法烧写到开发板上,烧写到开发板过后我们在测试,这样就比较麻烦,或者说比较浪费时间。


所以说我们用NFS作为开发来说效率应该是最高的。


下面我们就来看一看NFS怎么来用。首先来说我们一定要搞清楚NFS其实是我们网络也就是说走tcp/ip协议的(传输层走tcp协议网络层走ip协议)然后他的服务端是c-s架构的,就是说比较典型的客户服务器架构。所以说对于这样的架构程序来说我们开发一般情况下都涉及到服务端(PC)和客户端(开发板)。那么就是说我们的开发板我们需要把它配置成或者说是支持NFS来做。


因为现在我们给大家的内核是客户端已经支持NFS,也就是说客户端已经做进去了。


然后就是服务端,一般情况下Ubuntu是默认不装NFS服务的,所以说我们需要通过一个命令去把它安装上去。


nfs2.png


如图,一般情况下我都是用搜索的方法去安装,也就是说一般我们记不住它的全名,又怕拼写错误所以我们搜索一下,输入命令“sudo apt-cache search nfs-”为了搜的更加仔细所以我们在nfs后面加了“-”就说明它后面肯定是有东西的,然后点击回车键,我们可以看到“nfs-kernel-server”把它安装上去就可以,安装方法非常简单,输入命令“sudo apt-get insta nfs-kernel-server”。


以上只是安装,下面还要配置,配置 对于这个服务来说一样,一般情况下我们想要学习一个服务第一个是安装,第二个就一定要记住这个服务的配置脚本。然后我们的tftp可能就是根据你服务的安装会有不同的目录,那对于NFS一样我们把它记住是/etc/exports这样的文件,这个文件实际上就有点像我们要把哪一个目录共享出去,下面我们来编辑或者是去修改一下这个文件。


nfs3.png


如图,因为我这个机器是已经装好了的,下面我们就来看一下服务在哪里,输入命令“sudo vi /etc/exports”点击回车键。


nfs4.png


如图,这个地方我已经把它做好,因为之前我测试的时候已经用了一个,大家来看其实很简单,主要配置的就两列,第一列就是你要共享的目录,比如说我的习惯是放到“/home/rocky/work/”这样的目录,在这个目录中专门用一个rootfs的子目录专门存放所有的根的管理信息,这就是你要想开放权限的目录。


然后第二列中的“*”代表IP也就是说允许任意主机来访问,也就是不限制,因为我们做开发无所谓的。然后后面括号里面就是关于访问服务是所有权限,一般来说,我们开发肯定是要读要写,所以一般习惯“rw”可读可写的意思,然后sync一般情况下就是同步,就是我现在编的东西可以在开发板中看到,或者说开发板上编的东西也可以在服务器中看到,他俩的数据是一个同步关系。


所以你只需要把这样一个目录开发出来,然后把这个服务重启。


nfs5.png


如图,重启服务,输入命令“sudo /etc/init.d/nfs-kernel-server restart”点击回车键,然后正常情况下没有什么问题。然后剩下的事情还没有完,我们可以看到我们的work目录下的rootfs,我们会发现目前rootfs目前是空的。以后我们会告诉大家怎么把里面的文件系统做好,现在我们先告诉大家一个方法,可能有其他芯片厂商或者说你们公司买的解决方案中他可能已经把文件系统给你做好了,我们其实可以在它的现有基础上修修改改,这也是种比较好的方法。


nfs6.png


如图,在tftpboot里面已经做好了“initrd.img.gz”,那我现在已经把“initrd.img.gz”里面的内容取出来然后拷到那个目录,然后把那个目录里通过NFS挂在开发板上,所以说我们下面的步骤就是想办法把“initrd.img.gz”里面的内容给取出来然后把它拷出去相当于备份一份。


至于做法如下,大家还是把它记住一下,因为“initrd.img.gz”其实是个逆方法,我们后面会讲文件系统做的方法,而做的方法跟这个方法恰好是相反的,就是说你怎么做出来我就怎么反过来,然后首先来说是压缩包,所以我们是先解压,输入命令“gunzip initrd.img.gz”然后我们就把这样一个文件解压出去,这个时候其实就是一个“initrd.img.gz”文件了,这个跟Linux很像。


但是这只是个文件怎么办呢?其实这个文件实际是个镜像,就很像Windows下的ISO文件,下面我们就把这个文件给挂出来,就相当于这是个光盘,把这个光盘插到光驱里面,这样我们就可以把内容给它拷出来了。输入命令“mount -t ext2 initrd.img./swap/”也就是说这个分区格式是ext2,后面两个选项就是光盘和挂载点,然后点击回车键,因为只有root用户才能执行,所以我们输入命令“sudo mount -t ext2 initrd.img./swap/”这个时候我们在进入swap看如下图:


nfs7.png


如图,我们就会发现swap里面其实就有东西了,这个东西其实就跟我们刚刚在开发板中看到的目录结构一样,包括内容其实也是一致的,因为我们就是靠开发板来做的。


nfs8.png


如图, 因为我们要把目录结构里的东西给弄出来,所以我们要先把它回到work /rootfs/里面,因为他是空的,然后输入命令

“cp -a/home/rocky/tftpboot/swap/*./”(-a就是把所以类型按照原类型的形式拷出来,因为里面涉及到很多快捷方式以后我们会看到,所以不能直接拷贝要加-a,如果直接拷贝那么内存会非常庞大)然后点击回车键,因为涉及到一些权限所以要sudo,在输入命令“sudo cp  -a/home/rocky/tftpboot/swap/*./”那么我们就会发现这个目录已经具备这个能力了。


现在我们可以认为服务端已经准备好了,包括数据都准备好了,剩下就是客户端的事情了,客户端就是让我们的内核去找到服务端的一些具体的目录或者是具体的数据然后把它以根的形式去取出来。所以对于客户端也是一样的,我们开发板去设置“bootargs”,利用这个选项来设置告诉我们内核该怎么去处理,然后剩下的事情就是部署,但是部署我们刚刚在服务端已经把它cp出来了,所以就相当于已经部署完了。所以这样来说我们部署就不用做了,我们只需要让uboot告诉内核该从哪里去取就可以。



【本文由麦子学院独家原创,转载请注明出处并保留原文链接】

logo
© 2012-2016 www.maiziedu.com
蜀ICP备13014270号-4 Version 5.0.0 release20160127

麦子大聚惠,豪华礼包你领了吗?

客服热线 400-862-8862

回到顶部