系统引导期间查找 rootfs技巧

问题在现


    根文件系统(在样例错误消息中名为 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.komptscsi.komptspi.komptsas.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值