【记录】挂接NFS

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.x

exportfs: /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 /mnt
mount.nfs: mount to NFS server '192.168.10.175:/work/nfs_root/first_fs' failed: RPC Error: Program not registered
book@book-desktop:~$ 

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

book@book-desktop:~$ sudo mount -t nfs 192.168.10.175:/work/nfs_root/first_fs /mnt
book@book-desktop:~$ ls /mnt
bin  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 /mnt
bin      etc      linuxrc  sbin     usr
dev      lib      proc     sys

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

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

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

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

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

# ls /mnt
bin       etc       linuxrc   sbin      test.txt
dev       lib       proc      sys       usr

直接从NFS上启动开发板

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

OpenJTAG> print 
bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0
bootdelay=2
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
ipaddr=192.168.7.17
serverip=192.168.7.11
netmask=255.255.255.0
stdin=serial
stdout=serial
stderr=serial
mtdids=nand0=nandflash0
mtdparts=mtdparts=nandflash0:256k@0(bootloader),128k(params),2m(kernel),-(root)
partition=nand0,0
mtddevnum=0
mtddevname=bootloader

Environment size: 443/131068 bytes
OpenJTAG> 

发现根目录的参数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=ttySAC0
OpenJTAG> save
Saving Environment to NAND...
Erasing Nand...Writing to Nand... done

print查看一下参数信息

OpenJTAG> print
bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0
bootdelay=2
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
ipaddr=192.168.7.17
serverip=192.168.7.11
netmask=255.255.255.0
stdin=serial
stdout=serial
stderr=serial
mtdids=nand0=nandflash0
mtdparts=mtdparts=nandflash0:256k@0(bootloader),128k(params),2m(kernel),-(root)
partition=nand0,0
mtddevnum=0
mtddevname=bootloader
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=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.175
Looking up port of RPC 100005/1 on 192.168.10.175
VFS: Mounted root (nfs filesystem).
Freeing init memory: 140K
init 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'
# ls
bin      etc      linuxrc  sbin     usr
dev      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.c
book@book-desktop:/work/nfs_root/first_fs$ ls
bin  dev  etc  hello  hello.c  lib  linuxrc  proc  sbin  sys  usr

开发板上执行hello程序。

# ./hello
Hello, 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.x

exportfs: /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 start
portmap 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.x

exportfs: /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 /mnt
mount.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.175
rpcbind: server 192.168.10.175 not responding, timed out
Root-NFS: Unable to get nfsd port number from server, using default
Looking up port of RPC 100005/1 on 192.168.10.175
rpcbind: server 192.168.10.175 not responding, timed out
Root-NFS: Unable to get mountd port number from server, using default
mount: server 192.168.10.175 not responding, timed out
Root-NFS: Server returned error -5 while mounting /work/nfs_root/first_fs
VFS: 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 start
portmap start/running, process 2190
book@book-desktop:~$ sudo /etc/init.d/nfs-kernel-server restart

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值