作为一名Linux管理员,您可能会在增加外部存储卷之后或者甚至在安装新 Linux 操作系统之后,尝试重新启动服务器时遇到诸如 cannot mount rootfs 和 kernel panic 之类的 rootfs 错误。本文将概要介绍 x86 平台上的 Linux 引导进程,显示出现此问题的原因,并提供避免或修正此问题的四个技巧。
出现这种情况的可能的原因是您的 Linux 主机没有装入根文件系统的关键驱动器。情况未必如此。Linux 安装程序将把需要的所有驱动器构建到 initrd 映像中,以便 Linux 系统可以在启动时轻松地载入设备驱动器。但是,如果您是手动安装了磁盘,则可能会出现此错误。
2.显示了磁盘 /dev/sda,但是它不是根文件系统。在重新启动后,您的根文件系统已经改为 /dev/sdb。 这是最可能出现的情况。 那么,系统重新启动后 /dev/sda 是如何被重命名为 /dev/sdb 的?在 Linux 中,/dev/sd* 表示 SCSI 设备。Linux 将把这些设备的名称从 sda 改为 sdz(以及从 sdaa 改为 sdzz,以此类推)。它将把第一个 SCSI 设备命名为 /dev/sda,把第二个 SCSI 设备命名为 /dev/sdb,以此类推。
2.引导扇区总是在同一个位置 — 引导设备的磁道 0、柱面 0、磁头 0。此扇区包含名为 loader 的程序(对于 Linux,它通常是 LILO 或 GRUB);实际上是此程序引导操作系统。加载程序不是安装在 MBR 中,就是安装在活动主分区的第一个扇区中。 3.如果服务器中安装了多个操作系统,您需要从引导加载程序菜单中选择需要引导的操作系统。如果安装了多个内核,您还可以在此菜单中选择要载入的内核。 4.然后,引导加载程序将解压缩并载入内核。内核将首先载入内核模块,然后检测硬件(软驱、硬盘、网络适配器等),检验硬件配置,然后扫描和载入设备驱动程序。 5.在此阶段,内核将装入根文件系统和系统文件。在重新编译期间,可以(或通过其他程序)配置系统文件的位置。如果载入失败,kernel panic 将出现,并且系统将冻结(freeze)。这是先前提到的载入失败类型。 6.接下来,内核将启动系统初始化进程 init,这将成为第一个进程。随后它将启动系统的其余部分。init 进程是 Linux 的第一个进程,它是所有其他进程的父进程。此进程是在任何 Linux/UNIX® 系统中第一个运行的进程;它的 PID 始终为 1。 7.然后,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 步。 |