斗之气阶段三----ARM板系统的基本使用(使用NFS两种方法挂接根文件系统,挂载失败问题分析)

注:网络文件系统放在服务器上,内核启动时直接识别文件系统目录当做根文件系统,避免一遍一遍烧写。(开发==在服务器上编译,在网络文件系统上启动,成功后下载到板子上)

Windows通过WIFI上网,开发板离无线路由器很近
(Windows、Ubuntu、开发板三者一定要ping通!)

一、手工挂接NFS

1、从FLASH上启动根文件系统,再用命令挂接nfs(网络文件系统)

挂接NFS条件:
1):服务器“允许”那个目录可被挂接
2):然后单板去挂接
1)如何实现呢?

① 我们通过NFS服务,即在它的配置文件(etc/exports)里定义要挂接的目录
/nfs_root/first_fs         *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)

②最后,重启NFS服务,在Ubuntu上执行以下命令:
sudo /etc/init.d/nfs-kernel-server restart

③ 在Ubuntu上通过NFS挂载自己,验证一下NFS可用:
sudo  mount  -t  nfs  -o  nolock,vers=3  127.0.0.1:/home/book   /mnt
ls  /mnt

2)直接在单板上用命令挂载就可以啦

 mount  -t  nfs  -o  nolock,vers=3  127.0.0.1:/home/book   /mnt
ls  /mnt
会出现我们之前创建好的文件系统(相应的应用程序)
bin      etc      linuxrc  sbin     usr
dev      lib      proc     sys

自从有了NFS,再也不用担心繁琐烧写映像啦!

我们在根文件系统用echo命令创建文件并赋予内容
[email protected]:/work/nfs_root/first_fs$ echo hello > test.txt
它在开发板上立刻就能看到这个文件喽!
 ls /mnt
bin       etc       linuxrc   sbin      test.txt
dev       lib       proc      sys       usr
但问题是用命令挂载的根文件系统只是根文件系统的目录而已,并不具备虚拟系统文件(数学上的子集)
而我们用linnux内核启动这个根文件系统会自动创建虚拟文件系统(/proc目录)

也就是说被挂载的根文件系统=根文件系统目录 != 根文件系统

我们可以从黄色箭头中发现一个问题:内核启动的根文件系统下/proc目录里有devices等设备文件,然而通过手工nfs挂接的根文件系统目录里proc没有内容,也验证了上面的解说。

如果我在ubuntu服务器上创建了一个驱动模块,firstdrv.ko,那么这个驱动模块同时会出现在内核启动后的根文件系统的mnt目录下(红色箭头)
斗之气阶段三----ARM板系统的基本使用(使用NFS两种方法挂接根文件系统,挂载失败问题分析)_第1张图片
但当我insmod firstdrv.ko后,/mnt/proc里仍没有相关设备文件
所以说通过手工nfs挂载的根文件系统=根文件系统目录 != 根文件系统
但我们可以通过cp命令把/mnt里的firstdrv.ko复制到根文件系统下进行insmod。

二、直接从NFS上启动

修改bootargs命令行参数,让它从nfs上启动
(原始)               bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200
 我们让它从nfs上启动    bootargs=noinitrd root=/dev/nfs init=/linuxrc console=ttySAC0,115200

最终结果如下:
set bootargs noinitrd root=/dev/nfs  nfsroot=192.168.2.199:/work/nfs_root/first_fs,**proto=tcp,nfsvers=3, nolock** ip=192.168.2.120:192.168.2.199:192.168.2.1:255.255.255.0::eth0:off  
nfs启动参数:(要挂载谁的)服务器IP,目录;开发板的IP(挂载到哪里去)

前提:启动nfs虚拟设备所必需的起始参数是nfsroot,我们在服务里去查找相关说明:

Step1:
[email protected]:/work/system/linux-2.6.22.6$ grep “nfsroot=” * -nR

Documentation/nfsroot.txt:52:nfsroot=省略
我们可以看到Documentation/nfsroot.txt,有相关说明;所以我们去windows下所下载的内核源码里找到相应txt文件

bootargs=noinitrd root=/dev/nfs init=/linuxrc console=ttySAC0,115200
在这里插入图片描述
如果你挂载nfs失败,如下图问题:
斗之气阶段三----ARM板系统的基本使用(使用NFS两种方法挂接根文件系统,挂载失败问题分析)_第2张图片
A1: 请注意(在韦老师视频基础上)补充上使用的协议和使用的版本号,也要注意你的服务器IP和开发板IP是否填写正确。

set bootargs noinitrd root=/dev/nfs nfsroot=192.168.2.199:/work/nfs_root/first_fs,proto=tcp,nfsvers=3, nolock ip=192.168.2.120:192.168.2.199:192.168.2.1:255.255.255.0::eth0:off
A2: 内核配置NFS有问题:进入内核配置界面,选择File system->Net work file system,勾选对NFS的支持:如下
斗之气阶段三----ARM板系统的基本使用(使用NFS两种方法挂接根文件系统,挂载失败问题分析)_第3张图片
我是程序员牛虻,我将继续更新分享韦东山老师视频的学习笔记,期待你的关注哦!

你可能感兴趣的:(linux就该这么学)