如何修复启动进入 initramfs 提示和“mount: can't read '/etc/fstab': No such file or directory”和“No init found”?

Pro*_*kup 29 boot ubuntu initramfs init system-installation

使用专用于单个分区的GPT分区磁盘安装新系统,ext4格式,extlinux(版本 4.05)作为引导加载程序,Ubuntu Core 版本 13.10 amd64 作为 rootfs,以及 Ubuntu linux-image-3.11.0-18-generic 作为内核,和 extlinux-update 生成引导加载程序配置。

重新启动后的结果(仍在基于 KVM 的虚拟机中)是一个 (initramfs) 提示和以下消息:

mount: can't read '/etc/fstab': No such file or directory
mount: mounting /dev on /root/dev failed: No such file or directory
mount: mounting /sys on /root/sys failed: No such file or directory
mount: mounting /proc on /root/proc failed: No such file or directory
The filesystem doesn't have requested /sbin/init.
No init found. Try passing init= bootarg.
Run Code Online (Sandbox Code Playgroud)

BusyBox 是 v1.20.2。

回归:

  • 已检查文件系统 fsck.ext4

检查根存在

(initramfs) ls -l /dev/[hs]da*
ls: /dev/[hs]da*: No such file or directory
Run Code Online (Sandbox Code Playgroud)

根引导参数

(initramfs) cat /proc/cmdline
initrd=/boot/initrd.img-3.11.0-18-generic ro quiet BOOT_IMAGE=/boot/vmlinuz-3.11.0-18-generic
Run Code Online (Sandbox Code Playgroud)

检查加载的模块

(initramfs) cat /proc/modules
e1000 145368 0 - Live 0xffffffffa0000000
Run Code Online (Sandbox Code Playgroud)

/boot 文件夹内容

$ sudo ls -l boot
-rw------- 1 root root 3296162 Feb 18 22:37 System.map-3.11.0-18-generic
-rw-r--r-- 1 root root 1007681 Feb 18 22:37 abi-3.11.0-18-generic
-rw-r--r-- 1 root root  163258 Feb 18 22:37 config-3.11.0-18-generic
drwxr-xr-x 2 root root    4096 Mar 17 20:13 extlinux
-rw-r--r-- 1 root root 4995000 Mar 16 23:35 initrd.img-3.11.0-18-generic
-rw------- 1 root root 5634192 Feb 18 22:37 vmlinuz-3.11.0-18-generic
Run Code Online (Sandbox Code Playgroud)

如何让这个系统启动到预期的默认 bash 提示符?

小智 13

通过设置root=/dev/sdaX选项修改内核引导参数。sdaX将是您的/root分区。下次启动时,您会看到initramfs在尝试访问/etc/fstab和挂载文件系统之前尝试挂载分区。

有关更多详细信息,请参阅问题“ initramfs 是否使用 /etc/fstab? ”。


mik*_*erv 11

您需要了解的initramfs是它是一个文件系统。从内核 2.6 开始,它基本上是您机器上唯一的内核强加文件系统(不包括 VFS,可以说它也是一个文件系统)。你initramfs image是一个磁盘映像。

在您的initramfs image遗嘱中,您的发行版决定了在找到根磁盘之前足够重要的任何文件。通常这是 Busybox 以及您需要查找和挂载根设备的任何内核模块。这对你不起作用。

不过,考虑到所有因素,这里并没有真正的奥秘。如果您可以找到绕过终端提示的方法,您可以导航initramfs.但首先您必须揭开它的神秘面纱。

首先也是最重要的 - 这只是/.Linux 根在做 Linux 根类型的事情。事实上,如果它与您的内核位于一个单独的文件中,它实际上已经是您的第二个根设备。每个 Linux 内核都包含一个基本上空的/它自己的,它在拉入你的initramfs.

更重要的initramfs真正的根源。这是 Linux 内核通过执行init并随后放弃对您之后可能遇到的任何问题的所有责任来初始化用户空间的地方。您init似乎是 Busybox,和许多一样,这意味着控制其操作应该像编辑其随附的 shell 脚本一样简单。

那么为什么关于找不到的错误init?几乎肯定是指一个名为的程序init,您的实际init已通过shell脚本指示其执行自身。

最让我吃惊的是内核伪文件系统dev sys proc——不要挂载。这要么非常令人不安,要么是一个很好的线索。你提到了 KVM,这让我质疑内核功能,但在我们走上那条黑暗和车辙的道路之前,我们可以先尝试其他东西吗?

cd /root || mkdir /root
Run Code Online (Sandbox Code Playgroud)

令我震惊的是,错误消息反复出现:

无此文件或目录

失败了,你需要重建你的initramfs形象。启动到实时光盘以执行此操作并运行您的发行版提供的任何工具来实现该目的。哦,请确保此活动磁盘以EFI模式加载。

所以这是唯一真正不同寻常的事情 initramfs - switchroot.

Linux 内核提供了一个非常特殊的系统调用,用于早期用户空间并处理从initramfs根磁盘设备的移动。它的工作原理是首先将您的根磁盘安装到一个安装点initramfs,然后将根文件系统旋转到其中。我假设您的initramfs's目标安装点是root基于它不断抱怨它的方式。为什么不确保它在那里?

为了进一步调查,你需要有点坚韧不拔。调整您的引导加载程序以通过...

init=/bin/sh
Run Code Online (Sandbox Code Playgroud)

...作为内核参数。