以NFS方式挂载rootfs的步骤

本文介绍如何通过NFS协议挂载rootfs启动嵌入式系统。包括搭建NFS服务器、配置U-Boot及内核支持等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

一、NFS简介

网络文件系统(NFS,network file system),是一种网络通讯协议,由服务器和客户端构成。利用NFS协议可以做出很多直接性应用,但这里使用NFS主要是做rootfs挂载。

关于NFS的更多内容,见博客Linux中NFS服务器的配置

我们在虚拟机ubuntu中搭建NFS服务器,在开发板中运行kernel作NFS客户端(kernel要配置成支持NFS客户端),然后将文件夹形式的rootfs复制到NFS服务器的NFS共享目录(指定的共享目录由bootargs这个环境变量中的nfsroot指定),在客户端中挂载rootfs,进而启动系统。

二、以NFS方式挂载rootfs的步骤

步骤1:在虚拟机上搭建nfs服务器、tftp服务器。

搭建方法见环境搭建文档。这里假定tftp服务器的工作目录是/tftp。

步骤2:设置uboot的相关环境变量。

【1】在uboot控制台中修改bootargs这个环境变量并保存,如下所示:

set bootargs 'root=/dev/nfs nfsroot=192.168.1.141:/home/xjh/iot/embedded_basic/rootfs/rootfs_xjh ip=192.168.1.88:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200' 
save

【2】在uboot控制台中修改bootcmd这个环境变量并保存,如下所示:

set bootcmd 'tftp 30008000 zImage;bootm 30008000'
save

步骤3:配置内核以支持NFS启动方式。

此时启动开发板,会提示如下错误并导致重新启动,因为没有配置内核以支持NFS启动方式。

[    2.955474] VFS: Cannot open root device "nfs" or unknown-block(0,255)
[    2.960598] Please append a correct "root=" boot option; here are the available partitions:
[    2.968943] b300         3817472 mmcblk0 driver: mmcblk
[    2.974101]   b301          264759 mmcblk0p1
[    2.978347]   b302          264759 mmcblk0p2
[    2.982610]   b303          104412 mmcblk0p3
[    2.986838]   b304         3158463 mmcblk0p4
[    2.991086] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,255)

 【1】在内核配置阶段,即“make menuconfig”时配置支持nfs启动方式。

#配置网络部分(使能CONFIG_IP_PNP,使得出现“Root file system on 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 (EXPERIMENTAL) 
		[*] NFS client support for NFSv4.1 (DEVELOPER ONLY) 
		[*] Root file system on NFS  

【2】重新编译,将生成的arch/arm/boot/zImage拷贝到/tftp目录,重启开发板。

如果提示下面问题:

[    4.548616] Root-NFS: Server returned error -13 while mounting 
/home/xjh/iot/embedded_basic/rootfs/rootfs_xjh
[    4.557099] VFS: Unable to mount root fs via NFS, trying floppy.
[    4.563317] VFS: Cannot open root device "nfs" or unknown-block(2,0)

则在虚拟机的配置文件/etc/exports中追加如下内容:

#NFS服务器里你想分享的目录的路径  可接入NFS服务器的主机名字或者IP(参数1,,2,3…)
/home/xjh/iot/embedded_basic/rootfs/rootfs_xjh *(rw,sync,no_root_squash,no_subtree_check)

然后重启NFS服务: 

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

步骤4:重启开发板,则会到tftp服务器中下载内核,然后再到nfs服务器中下载rootfs。

如果rootfs是可用的,那么就会启动成功;如果rootfs是不可用的,那么会提示下面的错误。

由上可知,NFS方式启动,相当于开发板上的内核远程挂载主机上的rootfs。另外NFS方式启动不用制作rootfs镜像,但NFS不适合真正的产品,一般作为产品开发阶段调试使用。

### NFS 挂载 chmod 524 错误分析 `chmod: changing permissions of 'file': Invalid argument (errno 524)` 是一种常见的错误,尤其是在使用 NFS 进行文件系统挂载时。该问题的主要原因是 NFS 协议版本、挂载选项配置不当或底层文件系统不支持某些权限操作。 以下是一些具体的解决方案及其技术细节: --- ### 解决方案详解 #### 方法一:调整挂载选项 在挂载 NFS 文件系统时,可以通过 `-o nolock` 参数禁用文件锁定机制,这有助于避免因缺少 `rpc.statd` 服务而导致的挂载失败或其他权限问题。此外,明确指定 NFS 版本(如 `vers=3` 或 `vers=4`)也很重要,因为不同的服务器可能只支持特定版本。 以下是推荐的挂载命令示例: ```bash mount -t nfs -o proto=tcp,nolock,vers=3 192.168.1.128:/home/comp/nfs_rootfs /mnt/nfs_comp ``` - `proto=tcp`: 强制使用 TCP 协议以提高稳定性。 - `nolock`: 禁用文件锁功能,适用于不需要复杂文件锁定的应用场景。 - `vers=3`: 明确指定使用 NFS v3 版本[^1]。 如果服务器仅支持 NFSv4,则需要将 `vers=3` 替换为 `vers=4` 并确保客户端和服务端均正确配置了 NFSv4 支持。 --- #### 方法二:统一 Domain 配置 NFS 中的用户映射由 `idmapd` 服务负责处理。如果客户端和服务端之间的域名称 (`Domain`) 不一致,可能会导致权限映射出现问题,进而引发 `chmod` 失败的情况。 解决方法如下: 1. 编辑 `/etc/idmapd.conf` 文件,取消 `Domain` 行前的注释,并将其设置为相同的值(通常是根域名)。例如: ```conf [General] Domain = example.com ``` 2. 保存文件后重启 `idmapd` 服务: ```bash sudo service rpcidmapd restart ``` 3. 尝试重新挂载 NFS 共享目录[^2]。 --- #### 方法三:检查并修复 NFS 客户端配置 有时,NFS 客户端本身的安装或配置存在问题也会导致类似错误。例如,在 Ubuntu 上可能出现以下错误: ``` dpkg: error processing package nfs-common (--configure): ... Errors were encountered while processing: nfs-common nfs-kernel-server ``` 这种情况通常是因为包依赖关系损坏所致。可以按照以下步骤修复: 1. 更新 APT 包索引: ```bash sudo apt update ``` 2. 手动重新配置受影响的包: ```bash sudo dpkg --configure -a ``` 3. 如果仍有问题,强制重新安装相关包: ```bash sudo apt install --reinstall nfs-common nfs-kernel-server ``` 完成这些操作后再次尝试挂载 NFS 共享[^3]。 --- #### 方法四:验证文件系统兼容性 部分虚拟机环境(如 VMware Tools 提供的 HGFS 或 VirtualBox 的 Shared Folders)可能不完全支持 POSIX 权限模型。在这种情况下,即使正确设置了挂载选项,仍可能发生 `chmod` 错误。 建议切换到基于标准协议(如 NFS 或 CIFS)的外部存储解决方案,以确保更好的兼容性和可靠性。 --- ### 示例代码展示 为了更好地理解 NFS 用户映射的工作原理,以下是一个简单的 Python 脚本,用于模拟用户 ID 到用户名的转换过程: ```python import pwd def get_username(uid): try: return pwd.getpwuid(int(uid)).pw_name except KeyError: return f'nfsnobody ({uid})' if __name__ == "__main__": uid = input("Enter UID: ") print(f"Username: {get_username(uid)}") ``` 此脚本可以根据输入的用户 ID 查找对应的用户名。如果没有找到匹配项,则返回默认的 `nfsnobody` 标识符。 --- ### 结论 通过合理配置挂载选项、同步客户端与服务端的 `Domain` 设置以及修复潜在的软件包问题,大多数与 NFS 挂载相关的 `chmod 524` 错误会得到有效解决。如果问题依然存在,则需进一步检查底层文件系统的特性和支持范围。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天糊土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值