注:网络文件系统放在服务器上,内核启动时直接识别文件系统目录当做根文件系统,避免一遍一遍烧写。(开发==在服务器上编译,在网络文件系统上启动,成功后下载到板子上)
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目录下(红色箭头)
但当我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失败,如下图问题:
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的支持:如下
我是程序员牛虻,我将继续更新分享韦东山老师视频的学习笔记,期待你的关注哦!