首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

在系统引导期间查找 rootfs(1)简介

在系统引导期间查找 rootfs(1)简介

问题概述根文件系统(在样例错误消息中名为 rootfs)是 Linux 的最基本的组件。根文件系统包含支持完整的 Linux 系统所需的所有内容。它包含所有应用程序、配置、设备、数据等。没有根文件系统,您的 Linux 系统将无法运行。
在重新启动系统后,您可能会遇到 cannot mount rootfs 错误(在 Linux 主机得到 kernel panic 之后)。这种问题经常会在从外部存储中增加一些存储卷之后出现,也可能会在完成文件复制并需要重新启动来完成安装时出现。
如果出现此问题,您的系统将不会重新启动。诊断和修正此问题都需要花时间。本文介绍的 4 个技巧应当可以帮助您解决问题并节省时间。
另一个问题是 Linux 内核需要装入根文件系统,但是它找不到目标设备。换言之,根文件系统没有出现在它应该在的位置。例如,您把 Linux 根文件系统安装在 /dev/sda 磁盘中,但是您的系统在重新启动时无法装入它。出现这个问题有两个可能的原因:
需要更多 Linux 技巧?您还没找到感兴趣的内容?,我们将尽力为您提供!

  • 磁盘 /dev/sda 在系统重新启动时没有显示。
    出现这种情况的可能的原因是您的 Linux 主机没有装入根文件系统的关键驱动器。情况未必如此。Linux 安装程序将把需要的所有驱动器构建到 initrd 映像中,以便 Linux 系统可以在启动时轻松地载入设备驱动器。但是,如果您是手动安装了磁盘,则可能会出现此错误。
  • 显示了磁盘 /dev/sda,但是它不是根文件系统。在重新启动后,您的根文件系统已经改为 /dev/sdb。
    这是最可能出现的情况。
那么,系统重新启动后 /dev/sda 是如何被重命名为 /dev/sdb 的?在 Linux 中,/dev/sd* 表示 SCSI 设备。Linux 将把这些设备的名称从 sda 改为 sdz(以及从 sdaa 改为 sdzz,以此类推)。它将把第一个 SCSI 设备命名为 /dev/sda,把第二个 SCSI 设备命名为 /dev/sdb,以此类推。
如果使用在根文件系统设备适配器驱动器之前装入的驱动器(最初位于 /dev/sda)在适配器中安装设备,则根文件系统将移到命令链的下一个字母(/dev/sdb),并且根文件系统不是遇到的第一个设备。因此,如果它在行首找不到 rootfs,它就无法装入。
这是所发生情况的简单说明,但是为了给这个场景补充更多上下文,让我们概要说明一下 Linux 引导进程(如果您了解 “根本” 原因,请直接跳到 修正问题的四个技巧)。
Linux 引导的工作原理引导加载程序Linux Loader(LILO)是适用于 Linux 的通用引导加载程序,它不依赖于特定的文件系统,并且可以从软盘和硬盘引导操作系统。引导时,您最多可以从十六个不同映像中做出选择,并且可以分别为每个内核设置不同的参数(如根设备)。LILO 可以放在主引导记录(MBR)或分区的引导扇区中;如果执行第二个选项,还必须把另一些内容放到 MBR 中才能装入 LILO。
另一个引导加载程序是 GNU GRUB(GRUB)。GRUB 是多重引导规范(Multiboot Specification)的参考实现,它将允许用户在计算机中立即拥有多个不同的操作系统,以及选择要运行哪个操作系统。GRUB 是动态配置的,在启动时载入其配置并允许在引导时更改,例如选择不同的内核或初始的 RAM 磁盘。GRUB 具有高度可移植性,支持多种可执行格式,并且不依赖于几何参数转换。GRUB 可以从网络下载操作系统映像,因此它可以支持无磁盘系统。GRUB 支持先自动解压缩操作系统映像,然后再引导。而且不同于其他引导加载程序,它可以通过 GRUB 提示符直接与用户进行通信。

以下步骤将概要介绍 Linux 引导进程的工作原理:
  • 计算机在启动时首先执行的是初始测试 POST(开机自检,Power On Self Test),它将测试多个设备,包括处理器、内存、显卡和键盘。此外,还将测试引导介质(硬盘、软盘和 CD-ROM)。在 POST 之后,ROM 中的加载程序将载入引导扇区,该扇区随后将从活动分区中载入操作系统。您可以通过编辑服务器 BIOS 来更改引导介质顺序。
  • 引导扇区总是在同一个位置 — 引导设备的磁道 0、柱面 0、磁头 0。此扇区包含名为 loader 的程序(对于 Linux,它通常是 LILO 或 GRUB);实际上是此程序引导操作系统。加载程序不是安装在 MBR 中,就是安装在活动主分区的第一个扇区中。
  • 如果服务器中安装了多个操作系统,您需要从引导加载程序菜单中选择需要引导的操作系统。如果安装了多个内核,您还可以在此菜单中选择要载入的内核。
  • 然后,引导加载程序将解压缩并载入内核。内核将首先载入内核模块,然后检测硬件(软驱、硬盘、网络适配器等),检验硬件配置,然后扫描和载入设备驱动程序。
  • 在此阶段,内核将装入根文件系统和系统文件。在重新编译期间,可以(或通过其他程序)配置系统文件的位置。如果载入失败,kernel panic 将出现,并且系统将冻结(freeze)。这是先前提到的载入失败类型。
  • 接下来,内核将启动系统初始化进程 init,这将成为第一个进程。随后它将启动系统的其余部分。init 进程是 Linux 的第一个进程,它是所有其他进程的父进程。此进程是在任何 Linux/UNIX® 系统中第一个运行的进程;它的 PID 始终为 1。
  • 然后,init 将检验 /etc/inittab 文件以确定必须启动哪些进程。此文件将提供关于 runlevel 及在各个 runlevel 上应当启动的进程的 init 信息。然后,init 将查找第一个带有 sysinit(系统初始化)操作的行,然后将执行指定的命令文件,如 Red Hat Linux 中的 /etc/rc.d/rc.sysinit。在执行 /etc/rc.d/rc.sysinit 中的脚本之后,init 将开始启动与初始 runlevel 关联的进程。在执行完 runlevel 初始脚本时,Linux 将允许您登录。
讨论的每种解决方案都将处理这张列表中的第 5 步。
返回列表