1.前期准备
1.1 开发板通过串口连接至Windows主机
1.2 在Windows主机上开启虚拟机Ubuntu主机
1.3 已制作好的网络根文件系统为:Ubuntu主机的 /work/nfs_root/ 这个目录
1.4 通过 $ ifconfig 命令确定Ubuntu主机IP为192.168.0.7
2.Ubuntu主机上的操作
2.1 查看是否安装nfs服务器
$ sudo apt-get install nfs-kernel-server
我们看到“nfs-kernel-server is already the newest version. ”,说明已安装
2.2 修改服务器的配置文件
服务器的配置是放在/etc/exports这个文件下的,编辑它即可
$ sudo vi /etc/exports
加上如下一行,把我们想作为根文件系统的目录/work/nfs_root/放进去,并作配置,然后保存退出:
/work/nfs_root *(rw,sync,no_root_squash)
2.3 重启nfs服务器
$ sudo /etc/init.d/nfs-kernel-server restart
可以看到,exportfs: /etc/exports……/work/nfs_root,说明/work/nfs_root/这个目录已经作为exportfs(输出文件系统)了,当然我们也可以通过这个命令来查看
$ showmount -e
可以看到一个export list,下面就有“/work/nfs_root”这个目录
3.开发板上的操作
3.1 启动开发板进入Uboot
3.2 查看配置信息
(这一步是为了后面能重新通过设置uboot参数来重新实现从flash启动)
OpenJTAG> print
记录下bootargs
“bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0”
3.3 设置bootargs,并保存
OpenJTAG> set bootargs noinitrd root=/dev/nfs nfsroot=192.168.0.7:/work/nfs_root
ip=192.168.0.17:192.168.0.7:192.168.0.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
OpenJTAG> save
3.4 重启开发板
这时候开发板就以网络根文件系统来启动了,也就是说,在Ubuntu主机上的/work/nfs_root/这个目录现在成了开发板的根目录。
让我们来验证一下:
在Ubuntu主机的/work/nfs_root/,建立一个名为“666haha”的文件
$ cd /work/nfs_root/
$ touch 666haha
然后我们在串口界面下查看开发板的根目录,看一下这个文件是否存在
# ls 666haha -l
可见它在开发板的根目录下也是存在的
现在,通过串口我们在根目录下把它删除
# rm 666haha
然后,回到Ubuntu主机上的/work/nfs_root/目录查看一下是否也是删除掉了
$ ls /work/nfs_root/666haha -l
我们可以看到如下信息:
ls: cannot access 666haha: No such file or directory
即这个文件已经不见了
由此可见,我们在开发板的根目录下的操作,和我们在Ubuntu主机的/work/nfs_root/目录下的操作是同步的
说明1. bootargs
说明2. 开发板的Linux IP和Uboot IP
我们在设置bootargs的时候用的是Linux系统下的IP,而非Uboot下的"ipaddr"!两者有何区别?
在3.2里,我们在Uboot输入print命令后可看到如下一行:
ipaddr=192.168.0.16
这个就是Uboot IP
而Linux IP和Uboot IP是两个独立的IP,可以不一样(当然也可以一样)。那么它是怎么来的?
其实是我们在构建根文件系统的时候设置好的,它放在Ubuntu主机的/work/nfs_root/etc/init.d/rcS这个文件里
$ cd work/nfs_root/etc/init.d
$ vi rcS
查看这个文件(它其实就是一个shell脚本),有如下一行:
ifconfig eth0 192.168.0.17
当开发板从uboot跳入kernel,开始进行初始化的时候,就会调用这个脚本,这时候开发板的Linux IP就被设定好了
问题:如何改为重新由NandFlash启动根目录?
还记得在3.2里面记录的信息吗?
bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
稍微修改一下:
set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
然后,启动开发板进入Uboot,输入上面这条命令,重新设定bootargs即可:
OpenJTAG> set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
OpenJTAG> save
再启动开发板,这时候开发板使用的就是NandFlash上面的根文件系统了
如果我们想再次使用NFS启动根文件系统,就再改一下bootargs就可以了
OpenJTAG> set bootargs noinitrd root=/dev/nfs nfsroot=192.168.0.7:/work/nfs_root/first_fs ip=192.168.0.17:192.168.0.7:192.168.0.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
OpenJTAG> save