目录
0. 前言
一个常用的开发嵌入式Linux的技术就是,使用NFS远程挂载文件系统。也就是说,sd卡上并没有文件系统,而是通过网络挂载远在主机上的nfs_rootfs。这样每次更新了应用程序,只需放入主机上的nfs_rootfs,板子上的Linux立即就可以使用。
软件条件:
- Uboot,烧录在sd卡上
- zImage,通过TFTP在开机时下载到板子的DRAM上
- dtb,通过TFTP在开机时下载到板子的DRAM上
- rootfs,通过NFS网络实时使用主机上的nfs_rootfs
1. 搭建局域网
笔者大量参考了《正点原子》和《北京迅为》的教程,并且选择真正的Debian主机作为host,正点原子iMX6ULL开发板作为target。host和target必须在同一网段,能互相ping通。(虚拟机作为host必须选择桥接模式)
在板子上uboot里测试好tftp和nfs功能,即能够用 tftp 和 nfs 命令从host下载文件到板子的DRAM。
nfs [loadAddress] [[hostIPaddr:]bootfilename]
nfs 80800000 192.168.1.253:/home/zuozhongkai/linux/nfs/zImage
tftp [loadAddress] [[hostIPaddr:]bootfilename]
tftp 80800000 zImage
我们可以看到,因为运行uboot时,还没有文件系统运作。所以,loadAddress都是具体的16进制DRAM地址。tftp更加智能,不需输入完整的路径名。
2. bootcmd uboot启动命令
我们现在uboot里面设置bootcmd,
setenv bootcmd 'tftp 80800000 zImage; tftp 83800000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 83800000'
那么下次uboot启动时,就会
1. tftp下载zImage 到8080000;
2. tftp下载dtb 到83800000;
3. 根据内核镜像地址 和 设备树地址加载启动 ( bootz - boot Linux zImage image from memory )
3. bootargs 网络启动参数
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.17:/home/cjh/linux/nfs_rootfs ip=192.168.1.50:192.168.1.17:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc'
bootargs 保存着一些参数,这些参数会传递给Linux 内核。
1. 设置串口终端 console
2. 设置root=/dev/ (暂时还不知道这句话的具体含义,不过都这么写)
3. 设置读写权限
4. 设置nfsroot在主机上的路径
5. 设置一系列网络参数 ( 开发板IP:服务器IP:网关:子网掩码::eth0:off)
6. 设置一个init进程,其他所有的用户进程都直接或间接派生自init进程
4. nfs_rootfs 777
主机上的nfs_rootfs目录下就解压rootfs.tar的内容,即buildroot生成的文件系统。
注意,把nfs_rootfs目录下所有文件和文件夹都开放权限 777
sudo chmod 777 * -R
不然,板子上的系统启动到一半会卡在 permission denied:you can not open/create .......
文件系统虽说是直接使用挂载在主机上的nfs_rootfs,但在启动时会实时写入一些文件。所以板子的身份作为others用户,需要write权限。
另外,buildroot在编译时,不妨使能nfs-utils和rpc-bind。不过,这可能不是必要条件。有待观察。
5. 正式使用
saveenv 后,boot。uboot启动后,就会tftp下载内核镜像和设备树镜像,启动内核。
然后启动文件系统
至此,NFS远程挂载文件系统 大功告成!