一.前言

下文以泰山派RK3566开发板为例

  • 本文系统使用: Ubuntu 20.04.6 LTS
  • Linux 内核版本为:5.15.0-136-generic
  • 嵌入式Linux学习交流群:1005210698
  • 更多免费资料可加群获取

概述

什么是 NFS 协议?
  • NFS(Network File System) 称为网络文件系统, 实现了一个跨越网络的文件访问功能,如下图可以简要说明其原理。其整个架构为 Client-Server 架构,客户端和服务端通过 RPC 协议进行通信。
  • RPC 协议可以简单的理解为一个基于 TCP 的应用层协议,它简化命令和数据的传输。
  • NFS 最大的特点是将服务端的文件系统目录树映射到客户端,而在客户端访问该目录树与访问本地文件系统没有任何差别,客户端并不知道这个文件系统目录树是本地的还是远在另外一台服务器

在这里插入图片描述

设置NFS的好处
  • 在 NFS 服务器上编译应用软件,客户端(开发板)通过 NFS 访问并运行应用程序进行测试。
  • 把 NFS 作为根文件系统来启动

二、操作流程

1.虚拟机安装 NFS

1.安装 NFS

sudo apt-get install nfs-kernel-server rpcbind

2. 在虚拟机上新建文件夹,并开通访问权限

  • 需要在用户根目录下创建一个文件夹(我这里是 /home/nan/tspi/Linux/code )。
  • 记住自己创建的文件路径(可以使用 pwd 然后复制)。
sudo vim /etc/exports
  • 打开 /etc/exports 文件 ,在最后添加一句话
/home/nan/tspi/Linux/code *(rw,sync,no_root_squash)

在这里插入图片描述

  • /home/nan/tspi/Linux/code:是可以被挂载的ubuntu文件地址。
  • *:表示局域网下的任务地址都可以挂载该虚拟机的共享文件夹,等同于 192.168.1.0/24,如果要指定ip地址则按照如下格式替换:192.168.1.230/24,其中24表示子网掩码 255.255.255.0
  • rw: 表示客户机的权限,rw 表示可读写,具体的权限还受文件系统的 rwx 及用户身份影响。
  • sync:则代表数据会直接写入硬盘。
  • no_root_squash:客户端使用 NFS 文件系统的账号若为 root 时,系统该如何判断这个账号的身份?
    • 预设的情况下,客户端 root 的身份会由 root_squash 的设定压缩成 nfsnobody, 如此对服务器的系统会较有保障。
    • 但如果你想要开放客户端使用 root 身份来操作服务器的文件系统,那么这里就得要开 no_root_squash 才行。

3.重启 NFS 服务

sudo /etc/init.d/nfs-kernel-server restart

在这里插入图片描述

4.查看是否启动 NFS 服务

ps -A | grep nfs

在这里插入图片描述

  • d 表示服务

查看服务器端 NFS 共享情况:

showmount -e

在这里插入图片描述


2.开发板安装 NFS

注意!
全程操作路径在 SDK 根目录上,不要进到其他目录中

1.配置环境

  • 编译 buildroot 系统(根据自己的选择)
export RK_ROOTFS_SYSTEM=buildroot

2.加载环境变量

  • 要执行 buildroot/build/envsetup.sh 脚本,将其中定义的环境变量、函数等加载到当前 shell 环境中。
source buildroot/build/envsetup.sh

选择:65

3.添加 nfs

make menuconfig

按下 \ 然后输入 nfs_utils

这里按下 1 可直接跳转到对应的模块

按下 y 勾选 nfs-utils

之后一路 esc 退出就可以了,最后选择保存修改

4.保存配置

  • 保存退出 menuconfig 菜单后,在SDK根目录下输入以下命令将刚刚保存的配置生效为默认配置。
make savedefconfig

5.编译

./build.sh rootfs

此时可以输入命令查看

ls buildroot/output/rockchip_rk3566/build/ | grep "nfs"

6.打包

  • 一切没有问题了,在SDK根目录下输入以下命令生成打包。
./mkfirmware.sh
  • 打包成功后,固件会输出到 rockdev 目录
ls rockdev/ -lh
  • 如果只想烧录 rootfs.img 镜像,这时候就可以去SDK根目录下的 rockdev 文件夹中寻找 rootfs.img 烧录即可。
  • 如果想要烧录完整镜像,则可以继续运行下面的命令,即可生成完整的系统镜像 update.img
./build.sh updateimg

7.烧录

  • 选择 roofts.img 进行烧录。

3.开发板连网

  • 这里以使用 wifi 进行连网为主。
  • 最新 sdk 集成 wifi_start.sh 脚本,可以在脚本后面直接跟 wifi 名字和密码就能实现连接 wifi。
wifi_start.sh ssid passwd



4.设置开机自动设置 ip

  1. 创建一个脚本文件
vi /etc/init.d/S99ip-auto-set
  1. 在脚本里写入
# /bin/sh

wifi_start.sh ssid passwd
  1. 然后添加权限
chmod 755 /etc/init.d/S99ip-auto-set

此时就可以开机后自动配置 IP 了


5.挂载网络文件系统

  • 在开发板输入
// 这里的 IP 是虚拟机的
// 路径则是前面配置的
mount -t nfs -o nolock 192.168.9.5:/home/nan/tspi/Linux/code /mnt
cd /mnt

6.使用无线 adb 连接

  • 因为使用串口连接开发板时,老是周期性弹出这个电源域的警告。
  • 此时可以使用无线 adb 连接板子,然后使用网络挂载。
  • 此时不会有警告弹出,也不会因为串口线过短而各种麻烦,只需要给板子供电即可。
  • 在虚拟机终端输入
// 查看自己的板子 IP 
// 板子是自动获取 IP 的,有时可能连接不上,需要自己多尝试几个 IP
// 或者串口连接查看 IP
adb connect 192.168.9.6:5555
adb shell
// 此时进到了板子里,然后再挂载网络文件系统
mount -t nfs -o nolock 192.168.9.5:/home/nan/tspi/Linux/code /mnt

三、参考

NFS网络文件挂载【虚拟机到开发板】

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐