为了在虚拟机ubuntu中挂载nfs成功,期间遇到了很多的问题。今天挂载成功后,才觉得那些问题中有很多都是可以避免的。但也许从另一个角度来讲,也是在锻炼自己的能力。
先说一说主要的步骤,然后我就说说要挂载成功的几个关键地方吧,你挂载不成功,很有可能就是这几个关键地方没有做好。
首先第一步就是要为开发板烧写uboot和kernel。
1.先将SD卡格式化为FAT32格式。将启动代码固化到SD卡中。
可能出现的问题:1 volume erro之类的。
解决方法:重新插拔SD卡,某些情况下可能要换一张SD卡试一试。
2.下载Uboot到nandflash中并设置Uboot工作参数。注意的就是串口和波特率要设置对。
可能出现的问题:1.ARNING: OEMMultiBINNotify: Invalid BIN region descriptor(s).
Don't support raw image
解决方法:这种情况请注意选这从USB Port-->UBOOT-->UBOOT”,注意是选Uboot,而不是选transmit。
2.无法将uboot写进nandflash
解决方法:请一直按着ENTER键,直到OK出现。(这一般是nand erase没有干净,一定要等到OK出现。如果不出现,说明没有擦除干净)
3.烧写Kernel。
可能出现的问题一般同上面的2,注意我说的几点即可。
4.安装根文件系统,也是非常重要的一步。如果你要安装yaffs2文件,这其中又会涉及要挂在NFS。
假设我们要安装的是yaffs2文件。
首先第一步:安装NFS
在主机(我是在虚拟机中的ubuntu)上安装NFS服务软件,因为Debian/Ubuntu上默认是没有安装的。
1、安装端口映射器portmap(可选)
$ sudo apt-get install portmap
2、在终端提示符后键入以下命令安装NFS服务器
$ sudo apt-get install nfs-kernel-server
3、安装NFS客户端(可选)
$ sudo apt-get install nfs-common
注意:nfs- kernel-server和nfs-common都依赖于portmap。另外,在一些文档中提出还需要使用apt-get来手动安装NFS的客户端 nfs-common,以及端口映射器portmap,但其实这是没有必要的,因为在安装nfs-kernel-server时,apt会自动把它们安装好。
这样,宿主机就相当于NFS Server。同样地,目标系统作为NFS的客户端,需要安装NFS客户端程序。如果是Debian/Ubuntu系统,则需要安装nfs- common(第3步)。
第二步:配置NFS
1、配置portmap
方法1:编辑/etc/default/portmap,将"-i 127.0.0.1"去掉;
方法2:$ sudo dpkg-reconfigure portmap,出现“正在设定portmap”软件包设置界面,对Should portmap be bound to the loopback address?选择“否(No)”。
第三步:创建共享目录
例如我们采用/home/localhost/arm6410/root作为NFS共享目
$ sudo mkdir arm6410
$ cd arm6410
$ sudo mkdir root
$ chmod 777 arm6410 (更改文件权限,这个一定要改,不然很可能后面会出问题)
$ chmod 777 root (更改文件权限,这个一定要改,不然很可能后面会出问题)
第四步:配置共享目录及yaffs2文件
修改主机上/etc/exports文件的内容,添加一行:/home/localhost/arm6410/root *(rw,sync,no_root_squash)
$ sudo vim /home/localhost/arm6410/root *(rw,sync,no_root_squash)
注:后面设置uboot启动参数的时候,目录名要和这个一样。
其中:
/home/localhost/arm6410/root 表示NFS共享目录,它可以通过NFS挂接作为开发板的根文件系统;
* 表示所有的客户机都可以挂接此目录,当然你也可以指定具体的IP,如192.168.x.x;
rw 表示挂接此目录的客户机对该目录有读写的权力;
sync 表示所有数据在请求时写入共享,即数据同步写入内存和硬盘;
no_root_squash 表示允许挂接此目录的客户机享有该主机的root身份;
配置好文件共享目录后,将yaffs2文件放置在共享目录下,然后解压即可。
第五步:启动NFS服务
在完成前面的配置后,首先需要启动portmap和NFS这两个服务,并且 portmap服务一定要先于NFS服务启动。
$ sudo /etc/init.d/portmap start
$ sudo /etc/init.d/nfs-kernel-server start
其他可能要用到了:
停止NFS服务
在停止NFS服务的时候,需要先停止NFS服务再停止portmap服务,如果系统中还有其他服务需要使用portmap服务,则可以不停止 portmap服务。
$ sudo /etc/init.d/nfs-kernel-server stop
$ sudo /etc/init.d/portmap stop
重新启动portmap和NFS服务
$ sudo /etc/init.d/portmap restart
$ sudo /etc/init.d/nfs-kernel-server restart
检查portmap和NFS服务状态
$ sudo /etc/init.d/portmap status
$ sudo /etc/init.d/nfs-kernel-server status
第六步:配置目标板和主机(我的是虚拟机中ubuntu)IP
这两个IP一定要在同一个网段内,否则会出现很多的问题,很多像Root-NFS: Server returned error -5 while mounting /forlinx/root的问题就是由此引起。
假设:
主机IP:192.168.1.20
目标板IP:192.168.1.10
关于怎么知道目标板的IP,在你设置uboot环境变量后,使用printenv,既可以查看到目标板的IP信息。
那么这一步就有两种选择:1是更改主机IP,这个相对简单。(当然以后为了上网可以再改回去)
$ sudo vim etc/network/interfaces
然后设置:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.1.20
netmask 255.255.255.0
gateway 192.168.1.1
保存后重启
sudo /etc/init.d/networking restart
2是更改目标板IP,这个前提是你能够进入开发板环境,一般也就是你已经安装了类似cramfs文件系统,但是你想要用yaffs2文件系统的。
进入开发板环境,进入到/etc/init.d/目录下会看到一个rcS文件,IP就是在这个文件修改的。
# vim /etc/init.d/rcS
加上一段:
/sbin/ifconfig eth0 192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.1 up
:wq 保存退出
(//也可以命令更改# ifconfig eth0 202.118.212.168 netmask 255.255.255.0 )
改完后就重启一下开发板。
第七步:在开发板上设定启动参数
通过u-boot设置启动参数
u-boot启动时,在命令提示符下设置启动参数如下:
setenv bootargs "root=/dev/nfs nfsroot=192.168.1.20:/home/localhost/arm6410/root/ ip=192.168.1.10:192.168.1.20:192.168.1.1:255.255.255.0:arm6410:eth0:off console=ttySAC0,115200"
其中:
192.168.1.20为主机IP地址
/home/localhost/arm6410/root为共享目录
192.168.1.10为开发板的IP地址
console=ttySAC0,115200为控制台参数。
保存参数:saveenv
第八部:烧写yaffs2文件
重启后在uboot命令中nand erase x x 也即要烧写的区域
然后重启在开发板环境中,在终端输入writeyaffs即可(不同的开发板命令不同,请注意)
到此基本完成,yaffs2文件系统已经烧写好了。
最后一步:设置启动参数
重启开发板,将yaffs2文件配置为根文件系统。
在uboot命令行中输入以下参数:
setenv bootargs "root=/dev/mtdblock2 rootfstype=yaffs2 console=ttySAC0,115200"
saveenv
由此整个挂载NFS及配置yaffs2文件成功!