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