Linux通过nfs挂载根文件系统失败:VFS: Unable to mount root fs via NFS, trying floppy.

本文深入探讨NFS挂载失败的原因,特别是根文件系统中缺少console和null节点的问题。通过实际案例,揭示了错误排查过程及解决方案,强调了细节的重要性。

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

简介:

          本文主要介绍一种nfs挂载失败的情况,即在根文件系统中dev文件下没有设置console和null节点。如果你的文件系统中没有这种情况,这篇文章可能对你帮助不大。不过我也会将我在查找这个问题时碰到的一些其他情况进行说明。

 

 Linux内核:linux-3.4.2

 所用开发板:JZ2440 V3(S3C2440A)

BusyBox  : v1.20.0

 

声明:

          本文是看完韦东山老师的视频后所写的课程总结,同时文中也会加入一些我自己对这方面知识的理解。希望可以帮到你们。

制作好根文件系统:

          首先提醒大家的还是制作好根文件系统,我是直接使用韦东山老师提供的内核映像文件和根文件系统,而该内核映像uImage为Linux-3.4.2的内核,而根文件系统是使用busybox自己搭建的。这里我要先说明我的情况,我使用韦东山老师提供的内核和yaffs的根文件系统下载到我的开发板上可以启动内核并可以成功的启动根文件系统。但是当我使用nfs网络文件系统时却出现了错误。错误代码为:

VFS: Unable to mount root fs via NFS, trying floppy.
VFS: Cannot open root device "nfs" or unknown-block(2,0): error -6
Please append a correct "root=" boot option; here are the available partitions:
1f00             256 mtdblock0  (driver?)
1f01             128 mtdblock1  (driver?)
1f02            2048 mtdblock2  (driver?)
1f03          259712 mtdblock3  (driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
Backtrace: 
[<c000c434>] (dump_backtrace+0x0/0x10c) from [<c02f2c70>] (dump_stack+0x18/0x1c)
 r7:00008000 r6:c3a21000 r5:fffffffa r4:c381df18
[<c02f2c58>] (dump_stack+0x0/0x1c) from [<c02f2cf0>] (panic+0x7c/0x1d0)
[<c02f2c74>] (panic+0x0/0x1d0) from [<c03c6d98>] (mount_block_root+0x180/0x23c)
 r3:00000000 r2:c3844628 r1:c381df18 r0:c0366fd4
[<c03c6c18>] (mount_block_root+0x0/0x23c) from [<c03c6edc>] (mount_root+0x88/0x108)
[<c03c6e54>] (mount_root+0x0/0x108) from [<c03c7058>] (prepare_namespace+0xfc/0x194)
 r7:c040fa40 r6:c040faa0 r5:c03df138 r4:c03df144
[<c03c6f5c>] (prepare_namespace+0x0/0x194) from [<c03c63f4>] (kernel_init+0x170/0x1c4)
 r6:00000008 r5:c03de90c r4:c03e3558
[<c03c6284>] (kernel_init+0x0/0x1c4) from [<c001a034>] (do_exit+0x0/0x76c)

          看到上面的错误信息后,我就去网上搜这类型的错误,结果发现各种原因引起的错误都有,我试了各种方法还是没有找到错误的原因,因此我的系统还是没有启动。这时我想老师提供的内核和根文件系统应该不会有错啊,所以我就认真的过了一遍自己的操作步骤,结果还真发现了问题。当我使用老师提供的根文件系统解压的时候出现了下面的错误信息:

          上面提示的信息显示:文件系统中dev目录下的console节点和null节点不能创建,所以我去dev目录下检查了一下,发现居然没有这两个节点,因此我自己手动加入这两个节点:

          当我加上这两个节点后就可以成功的挂载nfs网络文件系统了。所以这里提醒各位要注意你操作中的每个步骤,一个很小的错误将在后面影响到整个系统。

          同时建议大家先在试试是否可以手动挂载,如果可以手动挂载,那么对于排查自动挂载将容易很多。

挂载nfs根文件系统时应该注意的部分:

         这里我列举一些在挂载nfs中可能出现的错误,希望可以对大家有所帮助。

1. 首先还是要确认内核的信息与busybox的版本信息,同时确定内核与根文件系统使用的是统一gcc编译。或者更详细一些,编译内核所使用的gcc要与编译busybox的gcc相同。同时根文件系统中lib库中包含的就是交叉编译的中的lib文件。我想可能有些人会使用其他人的内核去加载自己编写的根文件系统,这时可能就会有这样的问题。

2. 确定u-boot,Linux服务器和window三者可以ping通,我想这个是一定要检查的部分,如果网络不可以用,那么nfs网络文件系统自然就不可以用了。

3. 确认在Linux服务器端已经启动了nfs服务,因为nfs为c/s模式(客户/服务器)的。所以如果服务器没有设置好,你将不可以从服务器端获得根文件系统。你可以在Linux服务器中使用nfsstat命令来查看nfs的状态。

4. 确认在服务器端的etc/exports中添加了根文件启动的路径。并设置相应的权限,并重启nfs服务:

5. 确保根文件的完整,如果你要确保有韦东山老师最小根文件系统中所有的各个文件以及节点设置。而构建最小根文件系统的步骤可以参考:Linux根文件之系统制作流程

6. 正确的设置bootargs:bootargs参数是十分灵活的,同时也可以对各种形式的根文件系统进行加载设置,所以设置好bootargs参数是成功挂载nfs的关键。而很多同学出现错误就是出在没有设置好bootargs参数,或者设置bootargs参数是因为粗心出错。这里我例举了其中设置nfsroot的模式:

nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>

而我以自己的bootargs参数为例:

set bootargs console=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.1.112:/work/nfs_root/fs_mini_mdev_new_digitpic ip=192.168.1.110:192.168.1.112:192.168.1.1:255.255.255.0::eth0:off 

其中对于串口的设置时要添加波特率:115200 。不然输出的内容容易乱码。

 

最后还是建议大家要细心一些,其实好多时候我们的错误不是因为不会而是因为粗心。

 

参考文献:

NFS挂载那些事

U-boot的环境变量: bootcmd 和bootargs

Linux根文件之系统制作流程

 

<think>首先,用户的问题是关于解决 Linux 启动错误:“Kernel Panic: VFS Unable to mount root fs on unknown-block”。这看起来是一个系统级错误,用户可能遇到了无法挂载根文件系统的问题。 从系统级指令来看: - 所有行内数学表达式必须使用 $...$ 格式,但在这个上下文中,可能没有数学表达式,所以我可以忽略。 - 独立公式必须使用 $$...$$ 格式,但同样,这里可能不需要。 - LaTeX 语法正确:确保在需要时正确使用。 - 使用中文回答:整个回答要用中文。 - 生成相关问题:在回答末尾,生成相关问题。 - 在引用段落末尾添加引用标识:例如 [^1]。 用户提供了引用: - [^1]: 描述了错误消息:Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2)。尝试了squashfs文件系统。 - [^2]: 针对RK3568设备的错误,提到了禁用initramfs或修改bootargs参数。 - [^3]: 建议制作Linux U盘启动盘来修复。 用户的问题是基于这些引用,所以我需要参考这些内容来构建回答。用户说:“上述引用仅供参考,并不是用户真正的需求”,但它们是上下文的一部分。我应该基于这些信息提供解决方案。 关键点: - 错误是VFS无法挂载根文件系统。 - 可能的原因包括:错误的root设备指定、文件系统损坏、内核配置问题(如initramfs)、bootloader参数错误。 - 解决方案包括:检查bootloader设置(如GRUB)、修改root参数、检查文件系统、使用恢复模式或U盘启动盘。 回答结构: 1. **理解问题**:解释错误含义。 2. **常见原因**:列出可能导致此错误的原因。 3. **解决方法**:提供逐步的解决方案。 4. **预防措施**:如何避免类似问题。 5. **相关问题**:生成相关问题。 确保回答真实可靠:基于Linux系统管理知识。我不是专家,但可以基于常识和引用提供建议。 最终输出格式: - 用中文。 - 清晰结构。 - 在引用内容末尾添加引用标识。 - 生成相关问题。 大纲回答: 1. **引言**:简述问题。 2. **错误分析**:解释错误。 3. **可能原因**: - root设备指定错误。 - 文件系统损坏。 - 内核或initramfs问题。 - bootloader配置错误。 4. **解决方案**: - 方法1:检查并修改bootloader参数(如GRUB)。 - 方法2:使用Live CD/U盘修复文件系统。 - 方法3:调整内核配置(如禁用initramfs)。 - 方法4:重新安装或修复系统。 5. **详细步骤**:提供命令和步骤。 6. **预防**:建议定期备份和更新。 7. **相关问题**:生成2-3个相关问题。 生成相关问题: - 例如: 1. 如何修改Linux的GRUB启动参数? 2. 使用Live CD修复Linux文件系统的方法是什么? 3. 什么是initramfs,它在Linux启动中的作用是什么?</think>### 解决 Kernel Panic: VFS Unable to mount root fs on unknown-block 错误 当 Linux 系统启动时出现 "Kernel Panic: VFS Unable to mount root fs on unknown-block" 错误,这表示内核无法挂载根文件系统rootfs),导致系统无法启动。此错误通常与根设备(root device)配置、文件系统损坏或内核参数问题有关。下面我将逐步解释问题原因和解决方法,帮助您恢复系统。解决方案基于常见 Linux 系统管理实践和引用资料中的案例[^1][^2][^3]。 --- ### 错误分析 - **错误含义**:内核在启动过程中无法识别或挂载根文件系统,通常由于: - 根设备(如 `/dev/sda1`)在 `bootloader` 参数中指定错误。 - 文件系统损坏或内核不支持(如尝试挂载 `squashfs` 但内核未编译相关驱动)。 - `initramfs`(初始 RAM 文件系统)配置问题,导致内核找不到根设备。 - 硬件变更(如磁盘分区表更改)后未更新启动参数。 - **典型场景**:错误消息如 `unknown-block(31,2)` 或 `unknown-block(179,6)` 中的数字表示设备标识符(主设备号:次设备号),指向错误的存储设备[^1][^2]。 --- ### 常见原因及解决方法 以下是针对此错误的逐步解决方案。操作前,请确保您有系统备份或可访问的恢复工具(如 Live USB)。 #### 步骤 1: 检查并修改 Bootloader 参数(最常用方法) Bootloader(如 GRUB)负责传递内核启动参数。如果 `root=` 参数指定错误,会导致此错误。引用案例中通过修改 `root=PARTUUID=...` 解决了问题[^2]。 1. **进入 GRUB 编辑模式**: - 重启系统,在启动时按 `Shift`(UEFI 系统)或 `Esc`(传统 BIOS)进入 GRUB 菜单。 - 选择当前内核条目,按 `e` 键编辑启动参数。 2. **修正 `root=` 参数**: - 在 `linux` 行找到 `root=` 参数(例如 `root=PARTUUID=614e0000-0000`)。 - 确保 `PARTUUID` 或设备路径(如 `/dev/sda2`)正确: - 获取正确 PARTUUID:使用 Live USB 启动后,运行: ```bash sudo blkid ``` 输出示例: ``` /dev/sda2: PARTUUID="614e0000-0000-4b53-8000-1d28000054a9" ``` - 将错误值替换为正确的 `PARTUUID` 或设备路径(如 `root=/dev/sda2`)。 - 引用案例中,将 `root=PARTUUID=614e0000-0000` 改为 `root=PARTUUID=614e0000-0000-4b53-8000-1d28000054a9` 解决了问题[^2]。 3. **临时测试**: - 修改后按 `Ctrl+X` 启动系统。如果成功,说明参数错误是主因。 - **永久修复**:进入系统后,更新 GRUB 配置: ```bash sudo update-grub # 适用于 Debian/Ubuntu sudo grub2-mkconfig -o /boot/grub2/grub.cfg # 适用于 CentOS/RHEL ``` #### 步骤 2: 检查 initramfs 配置 如果内核启用了 `initramfs` 但配置错误,会导致无法加载根设备驱动。引用案例建议禁用或重建 `initramfs`[^2]。 1. **禁用 initramfs(仅当必要)**: - 编辑内核配置文件(需从源代码编译): - 设置 `CONFIG_INITRAMFS_SOURCE` 为空或取消启用。 - 但通常不推荐,除非您确定问题源于此。 2. **重建 initramfs**: - 使用 Live USB 启动系统。 - 挂载原系统根分区(假设为 `/dev/sda2`): ```bash sudo mount /dev/sda2 /mnt ``` - 重建 initramfs: ```bash sudo chroot /mnt update-initramfs -u # Debian/Ubuntu dracut -f # CentOS/RHEL ``` - 重启测试。 #### 步骤 3: 修复文件系统 文件系统损坏可能导致挂载失败。使用 Live USB 检查并修复。 1. **制作 Live USB**: - 如果所有系统无法启动,需在其他电脑制作 Ubuntu 或 GParted Live USB(参考引用[^3])。 - 下载 ISO:从 [Ubuntu 官网](https://ubuntu.com/download/desktop) 获取。 - 制作工具:使用 `balenaEtcher` 或 `Rufus`。 2. **启动并修复**: - 从 Live USB 启动,选择 "Try Ubuntu"。 - 打开终端,检查文件系统: ```bash sudo fsck /dev/sda2 # 替换为您的根分区 ``` - 按提示修复错误(如 `y` 确认修复)。 - 如果使用特殊文件系统(如 `squashfs`),确保内核支持(引用中尝试后失败)[^1]。 #### 步骤 4: 验证内核支持 如果内核未编译文件系统驱动,会导致挂载失败。 - 检查内核模块: ```bash ls /lib/modules/$(uname -r)/kernel/fs # 查看支持的文件系统 ``` - 重新编译内核或安装通用内核(如 `linux-generic`)。 #### 步骤 5: 其他方法 - **恢复备份**:如果有系统备份(如 Timeshift),从 Live USB 恢复。 - **重新安装内核**: ```bash sudo apt install --reinstall linux-image-$(uname -r) # Debian/Ubuntu ``` - **检查硬件**:磁盘故障也可能导致此错误,使用 `smartctl` 检查磁盘健康。 --- ### 预防措施 - **定期备份**:使用 `rsync` 或 `Timeshift` 备份系统和配置文件。 - **谨慎更新**:修改分区或内核后,运行 `sudo update-grub`。 - **测试参数**:在 GRUB 中临时修改参数,确认无误再永久应用。 如果上述方法无效,可能需要重新安装系统或联系硬件厂商(尤其针对特定设备如 RK3568)[^2]。 --- ### 相关问题 1. 如何制作 Linux Live USB 启动盘来修复系统启动问题? 2. 在 GRUB 启动参数中,`root=` 和 `rootdelay=` 的作用和区别是什么? 3. initramfsLinux 启动过程中扮演什么角色?如何自定义其内容? [^1]: Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2)。[ 3.405676] No filesystem could mount root, tried: squashfs [ 3.411546] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2) [^2]: RK3568 Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,6)。1、内核启用了initramfs,CONFIG_INITRAMFS_SOURCE=“…/rootfs_min”,修改内核配置不启用initramfs 2、修改bootargs参数,将root=PARTUUID=614e0000-0000改为root=PARTUUID=614e0000-0000-4b53-8000-1d28000054a9 chosen: chosen { bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 root=PARTUUID=614e0000-0000-4b53-8000-1d28000054a9 rw rootwait"; }; [^3]: ubuntu开机无法进入系统:kernel panic not syncing vfs unable to mount root fs on unknown-block 0。若所有系统都不能顺利进入登录界面,则只能进行制作linux U盘启动盘了,制作方法参考:https://blog.csdn.net/weixin_41652574/article/details/135130214?spm=1001.2014.3001.5502。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值