【记录】挂接NFS

来源:互联网 发布:货车软件有哪些 编辑:程序博客网 时间:2024/05/18 03:15

1. 目的

每次修改文件系统,或者驱动程序,重新烧写开发板,这样频繁的操作没有必要,我们希望在服务器中,修改文件系统或者驱动程序,调试,待一切都稳定后,再去烧写到开发板上验证。

解决方法就是网络文件系统,NFS。因为开发板可以通过网络与服务器连接,那么就可以让开发板启动服务器上的文件系统。这样,可以直接远程登录服务器,操作服务器中的文件系统,这些修改也会直接反应到开发板上。

2. 具备的条件

条件:
1. 服务器允许那个目录被挂接
2.开发板挂接服务器上的文件系统

服务器允许那个目录被挂接

服务器启动NFS服务。
①配置文件为/etc/exports,添加指定的文件(被挂接为NFS的目录/work/nfs_root/first_fs)

book@book-desktop:/work/nfs_root/first_fs$ sudo vi /etc/exports# /etc/exports: the access control list for filesystems which may be exported#               to NFS clients.  See exports(5).## Example for NFSv2 and NFSv3:# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)## Example for NFSv4:# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)#/work/nfs_root *(rw,sync,no_root_squash)/work/nfs_root/first_fs   *(rw,sync,no_root_squash)

②重启NFS服务

book@book-desktop:~$ sudo /etc/init.d/nfs-kernel-server restart * Stopping NFS kernel daemon   ...done. * Unexporting directories for NFS kernel daemon...   ...done. * Exporting directories for NFS kernel daemon...exportfs: /etc/exports [1]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/work/nfs_root".  Assuming default behaviour ('no_subtree_check').  NOTE: this default has changed since nfs-utils version 1.0.xexportfs: /etc/exports [2]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/work/nfs_root/first_fs".  Assuming default behaviour ('no_subtree_check').  NOTE: this default has changed since nfs-utils version 1.0.x   ...done. * Starting NFS kernel daemon   ...done.book@book-desktop:~$ 

测试一下,将文件系统挂载到/mnt目录下

book@book-desktop:~$ sudo mount -t nfs 192.168.10.175:/work/nfs_root/first_fs /mntmount.nfs: mount to NFS server '192.168.10.175:/work/nfs_root/first_fs' failed: RPC Error: Program not registeredbook@book-desktop:~$ 

参考错误2。
再次挂载,并查看/mnt目录下是否有对应的文件夹。

book@book-desktop:~$ sudo mount -t nfs 192.168.10.175:/work/nfs_root/first_fs /mntbook@book-desktop:~$ ls /mntbin  dev  etc  lib  linuxrc  proc  sbin  sys  usr

2.2.开发板挂接服务器上的文件系统

手动挂载

从Flash上启动根文件系统,再用命令挂接NFS

# mount -t nfs -o nolock 192.168.10.175:/work/nfs_root/first_fs /mnt# ls /mntbin      etc      linuxrc  sbin     usrdev      lib      proc     sys

挂载完成。测试一下,在/first_fs目录下增加一个文件

book@book-desktop:/work/nfs_root/first_fs$ echo hello > test.txtbook@book-desktop:/work/nfs_root/first_fs$ lsbin  dev  etc  lib  linuxrc  proc  sbin  sys  test.txt  usr

/mnt目录下出现增加的文件

book@book-desktop:/work/nfs_root/first_fs$ ls /mntbin  dev  etc  lib  linuxrc  proc  sbin  sys  test.txt  usr

开发板上/mnt目录下也出现该文件

# ls /mntbin       etc       linuxrc   sbin      test.txtdev       lib       proc      sys       usr

直接从NFS上启动开发板

1.重启开发板,进入u-boot目录

OpenJTAG> print bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0bootdelay=2baudrate=115200ethaddr=08:00:3e:26:0a:5bipaddr=192.168.7.17serverip=192.168.7.11netmask=255.255.255.0stdin=serialstdout=serialstderr=serialmtdids=nand0=nandflash0mtdparts=mtdparts=nandflash0:256k@0(bootloader),128k(params),2m(kernel),-(root)partition=nand0,0mtddevnum=0mtddevname=bootloaderEnvironment size: 443/131068 bytesOpenJTAG> 

发现根目录的参数root=/dev/mtdblock3,修改启动参数,使其从NFS启动
参考内核文档nfsroot.txt有参数格式说明。

OpenJTAG> set bootargs noinitrd root=/dev/nfs nfsroot=192.168.10.175:/work/nfs_root/first_fs ip=192.168.10.11:192.168.10.175:192.168.10.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0OpenJTAG> saveSaving Environment to NAND...Erasing Nand...Writing to Nand... done

print查看一下参数信息

OpenJTAG> printbootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0bootdelay=2baudrate=115200ethaddr=08:00:3e:26:0a:5bipaddr=192.168.7.17serverip=192.168.7.11netmask=255.255.255.0stdin=serialstdout=serialstderr=serialmtdids=nand0=nandflash0mtdparts=mtdparts=nandflash0:256k@0(bootloader),128k(params),2m(kernel),-(root)partition=nand0,0mtddevnum=0mtddevname=bootloaderbootargs=noinitrd root=/dev/nfs nfsroot=192.168.10.175:/work/nfs_root/first_fs ip=192.168.10.11:192.168.10.175:192.168.10.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0

启动一下,查看信息。

IP-Config: Complete:      device=eth0, addr=192.168.10.11, mask=255.255.255.0, gw=192.168.10.1,     host=192.168.10.11, domain=, nis-domain=(none),     bootserver=192.168.10.175, rootserver=192.168.10.175, rootpath=Looking up port of RPC 100003/2 on 192.168.10.175Looking up port of RPC 100005/1 on 192.168.10.175VFS: Mounted root (nfs filesystem).Freeing init memory: 140Kinit started: BusyBox v1.7.0 (2016-08-03 20:18:39 CST)starting pid 765, tty '': '/etc/init.d/rcS'Please press Enter to activate this console. starting pid 770, tty '/dev/console': '/bin/sh'# lsbin      etc      linuxrc  sbin     usrdev      lib      proc     sys# 

测试,服务器上编写hello,world程序,编译。

book@book-desktop:/work/nfs_root/first_fs$ vi hello.c #include <stdio.h>int main(){        printf("Hello, world!\n");        return 0;}~"hello.c" 7L, 74C written                                                      book@book-desktop:/work/nfs_root/first_fs$ arm-linux-gcc -o hello hello.cbook@book-desktop:/work/nfs_root/first_fs$ lsbin  dev  etc  hello  hello.c  lib  linuxrc  proc  sbin  sys  usr

开发板上执行hello程序。

# ./helloHello, world!# 

错误

错误1:重启NFS失败

错误信息

book@book-desktop:~$ sudo /etc/init.d/nfs-kernel-server restart * Stopping NFS kernel daemon                                            [ OK ]  * Unexporting directories for NFS kernel daemon...                      [ OK ]  * Exporting directories for NFS kernel daemon...                               exportfs: /etc/exports [1]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/work/nfs_root".  Assuming default behaviour ('no_subtree_check').  NOTE: this default has changed since nfs-utils version 1.0.xexportfs: /etc/exports [2]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/work/nfs_root/first_fs".  Assuming default behaviour ('no_subtree_check').  NOTE: this default has changed since nfs-utils version 1.0.x                                                                         [ OK ] * Starting NFS kernel daemon                                                   Cannot register service: RPC: Unable to receive; errno = Connection refused                                                                         [fail]

解决方法

启动portmap

book@book-desktop:~$ sudo service portmap startportmap start/running, process 2044

重启NFS,正常

book@book-desktop:~$ sudo /etc/init.d/nfs-kernel-server restart * Stopping NFS kernel daemon                                            [ OK ]  * Unexporting directories for NFS kernel daemon...                      [ OK ]  * Exporting directories for NFS kernel daemon...                               exportfs: /etc/exports [1]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/work/nfs_root".  Assuming default behaviour ('no_subtree_check').  NOTE: this default has changed since nfs-utils version 1.0.xexportfs: /etc/exports [2]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/work/nfs_root/first_fs".  Assuming default behaviour ('no_subtree_check').  NOTE: this default has changed since nfs-utils version 1.0.x                                                                         [ OK ] * Starting NFS kernel daemon                                            [ OK ] 

错误2:挂载错误

错误信息:

book@book-desktop:~$ sudo mount -t nfs 192.168.10.175:/work/nfs_root/first_fs /mntmount.nfs: mount to NFS server '192.168.10.175:/work/nfs_root/first_fs' failed: RPC Error: Program not registered

解决方法

重启NFS服务,好像第一次重启没有生效。

book@book-desktop:~$ sudo /etc/init.d/nfs-kernel-server restart

错误3:开发板NFS挂载失败

错误信息

IP-Config: Complete:      device=eth0, addr=192.168.10.11, mask=255.255.255.0, gw=192.168.10.1,     host=192.168.10.11, domain=, nis-domain=(none),     bootserver=192.168.10.175, rootserver=192.168.10.175, rootpath=Looking up port of RPC 100003/2 on 192.168.10.175rpcbind: server 192.168.10.175 not responding, timed outRoot-NFS: Unable to get nfsd port number from server, using defaultLooking up port of RPC 100005/1 on 192.168.10.175rpcbind: server 192.168.10.175 not responding, timed outRoot-NFS: Unable to get mountd port number from server, using defaultmount: server 192.168.10.175 not responding, timed outRoot-NFS: Server returned error -5 while mounting /work/nfs_root/first_fsVFS: Unable to mount root fs via NFS, trying floppy.VFS: Cannot open root device "nfs" or unknown-block(2,0)Please append a correct "root=" boot option; here are the available partitions:1f00        256 mtdblock0 (driver?)1f01        128 mtdblock1 (driver?)1f02       2048 mtdblock2 (driver?)1f03     259712 mtdblock3 (driver?)Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)

原因,中间重启过服务器,导致NFS服务没有启动。

解决方法:重启NFS服务

book@book-desktop:~$ sudo service portmap startportmap start/running, process 2190book@book-desktop:~$ sudo /etc/init.d/nfs-kernel-server restart

总结这几个错误,原因都是因为挂载时,NFS服务没有启动导致,所以在NFS挂载时,一定先重启一下服务器的NFS服务。

book@book-desktop:~$ sudo service portmap startportmap start/running, process 2190book@book-desktop:~$ sudo /etc/init.d/nfs-kernel-server restart

参考
NFS常见错误
nfs常见问题解决方法

0 0