1、DPDK编程指南
见下一个文章
【NFS】Ubuntu安装nfs服务器及使用教程 – 天英科技创新协会
1、nfs指令是否支持
可以通过编译uboot源码,menuconfig勾选来实现,具体编译方法不在此描述。
2、nfs指令使用
nfs 80800000 192.168.1.200:/home/xiaobao/workspace/nfs/rootfs/Image
nfs指令通过挂在192.168.1.200远端NFS服务器,把镜像文件Image加载到内存80800000
3、NFS版本兼容
解决方案:
【NFS】VFS: Unable to mount root fs via NFS. [ 115.256801] devtmpfs: mounted【NFS】 – 天英科技创新协会
4、加载超时一直打印TTTTTTTTTTTTTTT
解决方案:
编辑服务端 /etc/hosts 文件:
sudo vim /etc/hosts
添加开发板 IP 和服务端 NFS 共享文件目录:

再次重启 NFS 服务:
sudo service nfs-kernel-server restart
1、支持nfs客户端及网络环境
配置网络部分
Networking support
Networking options
TCP/IP networking
IP: kernel level autoconfiguration
[*] IP: DHCP support
[*] IP: BOOTP support


配置开启nfs服务
File systems
Network File Systems
<*> NFS client support
[*] NFS client support for NFS version 3
[*] NFS client support for the NFSv3 ACL protocol extension
[*] NFS client support for NFS version 4
[*] Root file system on NFS

uboot启动参数配置
setenv bootargs root=/dev/nfs nfsroot=172.16.27.200:/home/xiaobao/workspace/nfs/rootfs ip=dhcp console=ttyAMA1,115200 earlycon=pl011,0x20001000 rootdelay=10 rw
启动直接挂载远端NFS
nfs全称是network files system(网络文件系统),是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
正是因为nfs文件系统可以使客户端像访问本地文件一样地访问nfs服务器的文件,所以在嵌入式设备开发阶段常常用来挂载到开发板,执行正在开发的程序,这样可以避免频繁地将程序烧录到嵌入式开发板,极大地节省了开发时间。
👉2.1 安装nfs服务器
在Ubuntu安装nfs服务器比较简单,只需要在命令行执行下面这个命令即可:
sudo apt install nfs-kernel-server
2.2 创建nfs服务器共享目录
创建一个目录用于nfs服务器将文件共享给客户端,这个目录将会写入到nfs配置文件中:
sudo mkdir /nfsroot
执行下面命令修改该目录的拥有者为当前用户,我的用户wkd,读者需要改为自己的用户组:用户名:
sudo chown wkd:wkd /nfsroot/
nfs服务器配置文件使用vi命令打开nfs服务器配置文件/etc/exports,
sudo vi /etc/exports
指定nfs服务器共享目录及其属性,内容如下:
/nfsroot *(rw,sync,no_root_squash)
解析:
/nfsroot:指定/nfsroot为nfs服务器的共享目录
*:允许所有的网段访问,也可以使用具体的IP
rw:挂接此目录的客户端对该共享目录具有读写权限
sync:资料同步写入内存和硬盘
no_root_squash:root用户具有对根目录的完全管理访问权限
no_subtree_check:不检查父目录的权限
2.4 重启nfs服务器
执行下面两个命令其中一个可以重启nfs服务器:
sudo service nfs-kernel-server restart
或者
sudo /etc/init.d/nfs-kernel-server restart
到此,Ubuntu安装nfs服务器的过程就完成了,可以执行下面这个命令查看nfs服务器的共享目录:
showmount -e localhost
三、客户端访问nfs服务器共享目录
这一小节使用nfs客户端是嵌入式开发板系统自带的,一般嵌入式开发板移植了Linux系统后,都自带有nfs客户端,如果确实需要在Ubuntu安装,可以执行下面的命令安装:
sudo apt install nfs-common
3.1 在nfs客户端挂载服务器共享目录
下面是在客户端挂载服务器共享目录的命令,在嵌入式开发板或者Ubuntu的nfs客户端挂载都可以使用,需要将192.168.2.183换成自己的nfs服务器ip:
mount -t nfs -o nolock 192.168.2.183:/nfsroot /nfsroot
-t:挂载的文件系统类型-o nolock:不要文件锁192.168.xxx.xxx:/nfsroot:nfs服务器ip:服务器共享目录nfsroot:客户端已存在的目录
-t:挂载的文件系统类型-o nolock:不要文件锁192.168.xxx.xxx:/nfsroot:nfs服务器ip:服务器共享目录nfsroot:客户端已存在的目录

nfs客户端卸载服务器共享目录在nfs客户端执行下面命令,可以查询挂载的·nfs·服务器目录
mount

在nfs客户端执行下面命令,可以卸载的·nfs·服务器目录
umount /nfsroot
至此,在客户端挂载、卸载服务器就演示完成。
NFS配置没问题:NFS服务开启与使用、目录挂载与卸载
使用 NFS 挂载文件系统的时候报错:
[ 101.800373] VFS: Unable to mount root fs via NFS, trying floppy.
[ 101.807335] VFS: Cannot open root device "nfs" or unknown-block(2,0): error -6
[ 101.814718] Please append a correct "root=" boot option; here are the available partitions:
[ 101.823160] 0100 65536 ram0 (driver?)
[ 101.827880] 0101 65536 ram1 (driver?)
[ 101.832573] 0102 65536 ram2 (driver?)
[ 101.837347] 0103 65536 ram3 (driver?)
[ 101.841988] 0104 65536 ram4 (driver?)
[ 101.846695] 0105 65536 ram5 (driver?)
[ 101.851335] 0106 65536 ram6 (driver?)
[ 101.856027] 0107 65536 ram7 (driver?)
[ 101.860667] 0108 65536 ram8 (driver?)
[ 101.865333] 0109 65536 ram9 (driver?)
[ 101.869974] 010a 65536 ram10 (driver?)
[ 101.874720] 010b 65536 ram11 (driver?)
[ 101.879446] 010c 65536 ram12 (driver?)
[ 101.884194] 010d 65536 ram13 (driver?)
[ 101.888922] 010e 65536 ram14 (driver?)
[ 101.893669] 010f 65536 ram15 (driver?)
[ 101.898410] b300 15273984 mmcblk0 driver: mmcblk
[ 101.903768] b301 15269888 mmcblk0p1 9be55837-01
[ 101.909104] b308 7634944 mmcblk1 driver: mmcblk
[ 101.914503] b309 131072 mmcblk1p1 5edd22ea-01
[ 101.919862] b30a 7493632 mmcblk1p2 5edd22ea-02
[ 101.925247] b320 512 mmcblk1rpmb (driver?)
[ 101.930494] b318 4096 mmcblk1boot1 (driver?)
[ 101.935857] b310 4096 mmcblk1boot0 (driver?)
[ 101.941192] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
[ 101.949470] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
[ 112.942790] random: nonblocking pool is initialized
原因:
以前使用的16.04版本的ubuntu没问题,现在更换了18.04.4版本,开始报错。
从Ubuntu17.04开始,nfs默认只支持协议3和协议4,而kernel中默认支持协议2。
sudo vim /etc/default/nfs-kernel-server
2.在末尾添加:
RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"

3.重启 NFS 服务:
sudo /etc/init.d/nfs-kernel-server restart
注:如果kernel版本较高支持nfs协议3的话,可以在Uboot传到Kernel的bootargs参数中加入’nfsvers=3’,使kernel使用nfs协议3。
Environment size: 1420/4092 bytes
S5000C#
arch=arm
baudrate=115200
board=s5000c
board_name=s5000c
boot_fdt=booti 0x90000000 - 0x95000000
boot_usb_fdt=booti 0x90000000 - 0x95000000
bootargs=console=ttyAMA1,115200 earlycon=pl011,0x20001000 root=/dev/sda2 rootdelay=10 rw
bootcmd=run distro_bootcmd
bootdelay=3
cpu=armv8
distro_bootcmd=run load_kernel; run load_fdt; run boot_fdt
ethaddr=11:22:33:44:55:66
ext4_read_check=ext4load scsi 0:1 0x92000000 file_bake.txt
ext4_read_test=ext4load scsi 0:1 0x90000000 dtb/ft2004.dtb
ext4_write_test=ext4write scsi 0:1 0x90000000 /file_bake.txt 0x2DA8
fat_read_check=fatload usb 0:1 0x92000000 file_bake.txt
fat_read_test=fatload usb 0:1 0x90000000 md5sum.txt
fat_write_test=fatwrite usb 0:1 0x90000000 /file_bake.txt 0x5D4A
fdtcontroladdr=f9b40a70
fileaddr=95000000
filesize=87b7
gatewayip=192.168.1.1
ipaddr=192.168.1.250
load_fdt=ext4load scsi 0:1 0x95000000 s5000c-64c.dtb
load_kernel=ext4load scsi 0:1 0x90000000 Image
load_usb_fdt=fatload usb 0:1 0x95000000 s5000c-64c.dtb
load_usb_kernel=fatload usb 0:1 0x90000000 Image
loadaddr=0x90000000
netmask=255.255.255.0
serverip=192.168.1.110
soc=s5000c
start_autoscript=if usb start; then run start_usb_autoscript; fi; if scsi info; then run start_ssd_autoscript; fi;
start_ssd_autoscript=run load_kernel; run load_fdt; run boot_fdt
start_usb_autoscript=run load_usb_kernel; run load_usb_fdt; run boot_usb_fdt
stderr=serial
stdin=serial,usbkbd
stdout=serial
vendor=phytium
pkg-config or pkgconf to be used when building end-user binaries against DPDK.
dnf groupinstall "Development Tools"dnf group install development-toolsapt install build-essentialapk add alpine-sdk bsd-compat-headersmeson & ninja-build packages in most Linux distributionspip3 install meson ninjapyelftools (version 0.22+)
dnf install python-pyelftoolspip3 install pyelftoolsapt install python3-pyelftoolsapk add py3-elftoolsnumactl-devel in RHEL/Fedora;libnuma-dev in Debian/Ubuntu;numactl-dev in Alpine Linux$ cd /usr/src/
$ wget https://fast.dpdk.org/rel/dpdk-21.11.tar.xz
$ tar xf dpdk-21.11.tar.xz
$ export DPDK_DIR=/usr/src/dpdk-21.11
$ cd $DPDK_DIR
$ export DPDK_BUILD=$DPDK_DIR/build
$ meson setup build-arm64
$ ninja -C build
$ sudo ninja -C build install
$ sudo ldconfig
$ pkg-config --modversion libdpdk
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
sudo apt install meson ninja pkg-config gcc-multilib
[binaries]
# 交叉编译器路径(绝对路径/系统PATH中的别名)
c = 'aarch64-linux-gnu-gcc'
cpp = 'aarch64-linux-gnu-g++'
ar = 'aarch64-linux-gnu-ar'
strip = 'aarch64-linux-gnu-strip'
pkgconfig = 'pkg-config' # 若目标机有 pkg-config,可指定目标机路径
ninja = '/usr/bin/ninja'
[host_machine]
# 目标架构:根据实际修改(aarch64/armv7l/mips64等)
system = 'linux'
cpu_family = 'aarch64'
cpu = 'cortex-a72' # 目标CPU型号(可选,如 cortex-a53、x86_64)
endian = 'little'
[properties]
# 目标机内核头文件路径(关键!必须匹配目标机内核版本)
c_args = ['-I/path/to/target/linux-headers-5.15.0-101-arm64/include']
c_link_args = ['-L/path/to/target/lib64', '-lpthread', '-ldl']
# 禁用宿主机依赖检测,强制使用交叉编译环境
pkg_config_libdir = ['/path/to/target/usr/lib/aarch64-linux-gnu/pkgconfig']
# DPDK 特有配置:禁用不支持的驱动/功能
dpdk_cross = true
dpdk_disable_drivers = 'net/e1000,net/ixgbe' # 禁用目标机无的网卡驱动
dpdk_enable_kmods = false # 交叉编译时不编译内核模块(目标机单独编译)
file -i dpdk_cross_arm64.txt
# 输出:charset=utf-8 → 正常;若为 gbk/iso-8859-1,需转换
iconv -f GBK -t UTF-8 dpdk_cross_arm64.txt -o dpdk_cross_arm64_utf8.txt
1. 源码准备
# 下载 DPDK 源码(以 22.11 为例)
wget https://fast.dpdk.org/rel/dpdk-22.11.tar.xz
tar -xf dpdk-22.11.tar.xz
cd dpdk-22.11
2. 初始化 Meson 构建目录
通过 --cross-file 指定交叉配置文件,同时设置关键参数:
# 创建构建目录
meson setup build-arm64 \
--cross-file=/path/to/dpdk_cross_arm64.txt \
--prefix=/opt/dpdk-arm64 # 编译后安装路径
3. 编译与安装
# 编译(-j 后跟核心数,加速编译)
ninja -C build-arm64 -j$(nproc)
# 安装到指定路径
ninja -C build-arm64 install
第一种解决方法 在makefile中添加如下选项
EXTRA_CFLAGS += -Wno-error=date-time
EXTRA_CFLAGS +=-Wno-date-time
注意:在第二段定位中已经说到只有在4.9以及之后的gcc版本中才有这两个选项,如果你在gcc版本小于4.9的系统上编译,比如在centos7.2系统中,centos中默认的gcc版本是4.8.5,编译时就会报"cc1: 错误:-Werror=date-time:没有选项 -Wdate-time"错误,所以这种解决方法如果只是使用4.9以上的gcc版本是没有问题的;
第二种解决方法
修改/lib/modules/'uname -r'/build/Makefile文件,我的是/lib/modules/4.4.0-116-generic/build/Makefile
将KBUILD_CFLAGS += $(call cc-option,-Werror=date-time)这一行注释掉
注意:这种方法虽然解决了这个问题,但是修改了系统本身的属性,不太推荐
第三种解决方法
这一种方法也是我比较推荐的方法,修改内核模块的makefile文件,添加一行
ccflags-y+=$(shell if [ $(call cc-version) -ge 0490 ] ; then echo "-Wno-error=date-time -Wno-date-time"; fi ;)
在linux内核的最顶层目录也就是根目录下面的Makefile文件中,有一个变量"KBUILD_CFLAGS",这个$(KBUILD_CFLAGS)中存放的是传递给gcc编译器的编译选项,如果被编译的文件在被gcc编译时,没有特殊的要求的话就会使用$(KBUILD_CFLAGS)中的编译选项。
但是如果被gcc编译的文件有特殊的编译选项要求的话,使用如下的方式来指定编译选项:
ccflags-y,是指定给$(CC)的编译选项;
asflags-y,是指定给$(AS)的编译选项;
ldflags-y,是指定给$(LD)的编译选项;
linux5.10内核do_gettimeofday函数提示不存在。
解决办法使用ktime_get_real_ts64代替。
具体实例:
修改之前代码:
struct timeval time_now;
struct rtc_time tm;
do_gettimeofday(&time_now);
rtc_time_to_tm(time_now.tv_sec, &tm);
修改之后代码:
struct timespec64 ts64;
struct rtc_time tm;
ktime_get_real_ts64(&ts64);
tm = rtc_ktime_to_tm(ts64.tv_sec);
mysql -u root -p --default-character-set=utf8 xxxxx < xxxx.sql