根文件系统(在样例错误消息中名为 rootfs)是 Linux 的最基本的组件。根文件系统包含支持完整的 Linux 系统所需的所有内容。它包含所有应用程序、配置、设备、数据等。没有根文件系统,您的 Linux 系统将无法运行。
在重新启动系统后,您可能会遇到 cannot mount rootfs 错误(在 Linux 主机得到 kernel panic 之后)。这种问题经常会在从外部存储中增加一些存储卷之后出现,也可能会在完成文件复制并需要重新启动来完成安装时出现。
如果出现此问题,您的系统将不会重新启动。诊断和修正此问题都需要花时间。
下面介绍一些技巧,这里,我只说一个。
编辑 initrd 映像以更改存储适配器顺序
initrd 映像实际上是一个 RAM 磁盘,其中包含带有基本配置文件、二进制文件、库和驱动程序的小型文件系统。在这个小型文件系统中,有一个将在引导期间装入到内存中的根文件系统,还有一个用于装入系统设备驱动程序的初始化脚本;它将在加载完所有设备驱动程序后重新加载实际的根文件系统磁盘。当系统尝试将 initrd 根文件系统切换到拥有此配置中的设备名称的实际根文件系统磁盘时,经常会出现 cannot mount rootfs 错误。您需要更改 initrd 映像的驱动程序载入脚本中的设备驱动程序载入顺序,让您的根文件系统磁盘在系统尝试重新加载实际的根文件系统之前显示正确的设备名称。为此:
使用 Linux 恢复 CD 将系统引导到恢复模式下,因为您无法访问根文件系统。
将根文件系统加载到诸如 sysroot 之类的临时目录中(某些 Linux 恢复 CD 将自动为您执行此操作)。例如,在将系统引导到恢复模式下并且根文件系统使用的是第 3 分区时,根文件系统磁盘将被识别为 /dev/sdc。
[root@linuxhost ~]#mount /dev/sdc3 sysroot
将恢复系统根目录切换为 sysroot,以便您可以访问问题服务器系统的根文件系统。
[root@linuxhost ~]#chroot sysroot
提取 initrd 映像。
对于 Red Hat Enterprise Linux 第 3 版之前的版本和 SUSE Linux Enterprise Server 第 9 版之前的版本:
[root@linuxhost ~]#cp /boot/initrd-x.x.x-x.ELsmp.img ./initrd.gz
[root@linuxhost ~]#mkdir temp
[root@linuxhost ~]#gunzip ./initrd.gz
[root@linuxhost ~]#mount -o loop -t ext2 initrd temp
这段代码将把 initrd 映像提取到 initrd 文件中;然后将使用 ext2 文件系统类型加载这个文件,以加载 temp。在此之后,您将看到所有文件被封装到 initrd 映像中。
对于 Red Hat Enterprise Linux 第 4 版和更高版本或者 SUSE Linux Enterprise Server 第 10 版和更高版本:
[root@linuxhost ~]#cp /boot/initrd-*.img ./initrd.gz
[root@linuxhost ~]#mkdir temp
[root@linuxhost ~]#cd temp
[root@linuxhost ~]#gzip -dc ../initrd.gz | cpio -id
在这些最新的 Linux 发行版中,initrd 映像也是用 cpio 压缩的。这些命令将提取 temp 目录下包含目录结构的整个文件系统。您现在应当可以在 temp 目录的 initrd 映像中找到所有文件。
现在,您将在 temp 目录下找到适用于 Red Hat Enterprise Linux 和 SUSE Linux Enterprise Server 第 10 版的 init 文件,或者适用于 SUSE Linux Enterprise Server 第 9 版之前的版本的 linuxrc 文件。此文件是包含将设备驱动程序载入到系统内存中的所有命令的简单 Linux shell 脚本。您可以通过文本编辑器或者其他编辑器来编辑它。
编辑 init 或 linuxrc 文件,以使根文件系统磁盘适配器出现在同一个类别中的所有其他存储适配器的前面。在大多数情况下,根文件系统磁盘将是带有 sd 前缀的 SCSI 设备;您需要把诸如 FC 或 SAS HBA 驱动程序之类的所有其他存储适配器放到根文件系统磁盘所依赖的驱动程序之后。
例如,如果根文件系统的物理磁盘与 SAS 适配器连接在一起,则 init 文件可以有如下所示的字段:
.......
echo "Loading mptbase.ko module"
insmod /lib/mptbase.ko
echo "Loading mptscsi.ko module"
insmod /lib/mptscsi.ko
echo "Loading mptspi.ko module"
insmod /lib/mptspi.ko
echo "Loading mptsas.ko module"
insmod /lib/mptsas.ko
echo "Loading mptscsih.ko module"
insmod /lib/mptscsih.ko
echo "Loading qla2xxx.ko module"
insmod /lib/qla2xxx.ko
.......
在本例中,将所有其他 SCSI 适配器驱动程序(如 Qlogic HBA 驱动程序 qla2xxx.ko)放在 SAS 适配器驱动程序 mptsas.ko 之后。
如果使用的是 SUSE Linux Enterprise Server 第 10 版,它将类似以下代码:
modprobe scsi_mod $params
modprobe sd_mod $params
params=
for p in $(cat /proc/cmdline) ; do
case $p in
aacraid.*)
params="$params ${p#aacraid.}"
;;
esac
done
echo "Loading aacraid"
modprobe aacraid $params
modprobe scsi_transport_fc $params
modprobe firmware_class $params
params=
for p in $(cat /proc/cmdline) ; do
case $p in
qla2xxx.*)
params="$params ${p#qla2xxx.}"
;;
esac
done
echo "Loading qla2xxx"
modprobe qla2xxx $params
检验您的版本是否正确,这样才不会遗漏任何所需的驱动程序(例如,SAS 需要同时装入 mptbase.ko、mptscsi.ko、mptspi.ko、mptsas.ko 和 mptscsih.ko,这样您不能先装入 qla2xxx.ko,再装入 mptscsih.ko)。此外,您可能还需要检查错误的输入。
此时,您需要将 initrd 文件系统重新压缩到一个映像中,并替换 /boot 目录下的原有映像。
对于 Red Hat Enterprise Linux 第 3 版之前的版本和 SUSE Linux Enterprise Server 第 9 版之前的版本:
[root@linuxhost ~]#umount temp
[root@linuxhost ~]#gzip initrd
[root@linuxhost ~]#cp initrd.gz /boot/initrd-2.x.x-x.img
对于 Red Hat Enterprise Linux 第 4 版和更高版本或者 SUSE Linux Enterprise Server 第 10 版和更高版本:
[root@linuxhost ~]#find ./ | cpio -H newc -o > ../initrd
[root@linuxhost ~]#gzip initrd
[root@linuxhost ~]#cp initrd.gz /boot/initrd-2.6.x-x.img
祝贺您!您已经修正了问题。现在重新启动并检查结果。
我这里只说了一个技巧,还有三个技巧,大家可以查看亚嵌官网,文章摘出自于:http://www.akaedu.org/page/newsdetail-2075-1.html