15AH, San Francisco

California, United States.

Send Your Mail At:

tianyingkejishe@sina.cn

Working Hours

Mon-Sat: 9.30am To 7.00pm

归档标题

Autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et dolore feugait.

月度归档 12月 24, 2025

【NFS】Linux开发挂载远程NFS服务器

一、NFS服务器配置

见下一个文章

【NFS】Ubuntu安装nfs服务器及使用教程 – 天英科技创新协会

二、Uboot挂在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 版本不兼容导致的共享文件找不到
    • U-Boot 中 NFS 为 V2 版本
    • 服务端 NFS 为 V3、V4 版本

解决方案:

【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

三、kernel挂在NFS服务器

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】Ubuntu安装nfs服务器及使用教程

一、概述

nfs全称是network files system(网络文件系统),是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。

正是因为nfs文件系统可以使客户端像访问本地文件一样地访问nfs服务器的文件,所以在嵌入式设备开发阶段常常用来挂载到开发板,执行正在开发的程序,这样可以避免频繁地将程序烧录到嵌入式开发板,极大地节省了开发时间。

二、在Ubuntu搭建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/

👉2.3 修改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:客户端已存在的目录

3.2 在nfs客户端卸载服务器共享目录

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

mount

在nfs客户端执行下面命令,可以卸载的·nfs·服务器目录

umount /nfsroot

至此,在客户端挂载、卸载服务器就演示完成。

【NFS】VFS: Unable to mount root fs via NFS. [ 115.256801] devtmpfs: mounted【NFS】

问题:

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。

  1. 修改 NFS 配置文件:
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。

【uboot】飞腾s5000的uboot环境变量

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

【DPDK】编译流程

一、编译环境准备

  • General development tools including a C compiler supporting the C11 standard, including standard atomics, for example: GCC (version 8.0+ recommended) or Clang (version 7+ recommended), and pkg-config or pkgconf to be used when building end-user binaries against DPDK.
    • For RHEL systems these can be installed using dnf groupinstall "Development Tools"
    • For Fedora systems these can be installed using dnf group install development-tools
    • For Ubuntu/Debian systems these can be installed using apt install build-essential
    • For Alpine Linux, apk add alpine-sdk bsd-compat-headers
  • Python 3.6 or later.
  • Meson (version 0.57+) and ninja
    • meson & ninja-build packages in most Linux distributions
    • If the packaged version is below the minimum version, the latest versions can be installed from Python’s “pip” repository: pip3 install meson ninja
  • pyelftools (version 0.22+)
    • For Fedora systems it can be installed using dnf install python-pyelftools
    • For RHEL/CentOS systems it can be installed using pip3 install pyelftools
    • For Ubuntu/Debian it can be installed using apt install python3-pyelftools
    • For Alpine Linux, apk add py3-elftools
  • Library for handling NUMA (Non Uniform Memory Access).
    • numactl-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

【DPDK]交叉编译

一、环境准备

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  # 交叉编译时不编译内核模块(目标机单独编译)
  • 确保配置文件无中文、特殊符号(如「・」「¥」),仅用 ASCII 字符;
  • 验证文件编码:
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

三、DPDK 交叉编译实操

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

【Linux】error: macro “__TIME__” might prevent reproducible builds [-Werror=date-time]

解决方法有如下几种,可根据需求进行选择

第一种解决方法 在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)的编译选项;

【Linux】linux5.10内核do_gettimeofday函数报错问题

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);