Linux 技巧: 在系统引导期间查找 rootfs(4)

3.将恢复系统根目录切换为 sysroot,以便您可以访问问题服务器系统的根文件系统。

[root@linuxhost ~]#chroot sysroot

4.提取 initrd 映像。

a.对于 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 映像中。

b.对于 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 映像中找到所有文件。

5.现在,您将在 temp 目录下找到适用于 Red Hat Enterprise Linux 和 SUSE Linux Enterprise Server 第 10 版的 init 文件,或者适用于 SUSE Linux Enterprise Server 第 9 版之前的版本的 linuxrc 文件。此文件是包含将设备驱动程序载入到系统内存中的所有命令的简单 Linux shell 脚本。您可以通过文本编辑器或者其他编辑器来编辑它。

6.编辑 init 或 linuxrc 文件,以使根文件系统磁盘适配器出现在同一个类别中的所有其他存储适配器的前面。在大多数情况下,根文件系统磁盘将是带有 sd 前缀的 SCSI 设备;您需要把诸如 FC 或 SAS HBA 驱动程序之类的所有其他存储适配器放到根文件系统磁盘所依赖的驱动程序之后。

a.例如,如果根文件系统的物理磁盘与 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 之后。

b.如果使用的是 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

7.检验您的版本是否正确,这样才不会遗漏任何所需的驱动程序(例如,SAS 需要同时装入 mptbase.ko、mptscsi.ko、mptspi.ko、mptsas.ko 和 mptscsih.ko,这样您不能先装入 qla2xxx.ko,再装入 mptscsih.ko)。此外,您可能还需要检查错误的输入。

8.此时,您需要将 initrd 文件系统重新压缩到一个映像中,并替换 /boot 目录下的原有映像。

a.对于 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

b.对于 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

9.祝贺您!您已经修正了问题。现在重新启动并检查结果。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/28617.html