本问题出现时,系统一般会提示trying to resume from SWAP(或/dev/sda2)之类很有迷惑性的提示,让你误以为fstab有问题不停进Rescue系统去调试,也尝试过mkinitrd重新制作引导镜象,但均无果;

分析引导信息,最后竟然没有发现磁盘检查信息——即扫描出sda sda1 sda2诸如此类的提示,定位问题是由于当前系统中的引导镜象内含驱动不支持当然磁盘驱动器,这种情况特殊容易发生在各种机架式所谓服务器机器上,而且很多时间,调整一个合适的AHCI,SATA模式诸如之类的参数,可能就能正常解决,但实在没有办法的情况下,只能使用如下最终方法,即添加驱动到引导镜象内核;

要添加驱动,首先要知道缺什么驱动,一般而言,使用Rescure光盘(或U盘),由于其特殊性质,引导镜象带的驱动比较多,所以均能正常引导,如果连Rescure光盘也无法引导的情况,或引导后也识别不了硬件,那只能更换其它发行版或其它版本的Linux Rescure光盘了;

正常引导后,lsmod查看硬盘相关的驱动,例如:

1
2
libata               156677  1 ahci
scsi_mod 141589 7 scsi_dh,sg,libata,mptspi,mptscsih,scsi_transport_spi,sd_mod

而查看另一台正常启动的机器,libata是被ata_piix调用的,则表明本引导镜象内核中少了ahci驱动;

拿到本机的引导镜象内核到另一台机器上,执行如下操作:

1
2
mkdir newinit;cd newinit
gunzip -c ../initrd-2.6.18-128.el5.img | cpio -idmv

ls查看当前目录可以看到类似:
bin dev etc init lib proc sbin sys sysroot
的目录结构,表示这是一个微缩系统,驱动在lib目录下,我们这里只关注init这个系统引导时的微缩系统的初始化脚本,可看到其内容格式为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
[root@localhost newinit]# cat init
#!/bin/nash

mount -t proc /proc /proc
setquiet
echo Mounting proc filesystem
echo Mounting sysfs filesystem
mount -t sysfs /sys /sys
echo Creating /dev
mount -o mode=0755 -t tmpfs /dev /dev
mkdir /dev/pts
mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
mkdir /dev/shm
mkdir /dev/mapper
echo Creating initial device nodes
mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mknod /dev/systty c 4 0
mknod /dev/tty c 5 0
mknod /dev/console c 5 1
mknod /dev/ptmx c 5 2
mknod /dev/rtc c 10 135
mknod /dev/tty0 c 4 0
mknod /dev/tty1 c 4 1
mknod /dev/tty2 c 4 2
mknod /dev/tty3 c 4 3
mknod /dev/tty4 c 4 4
mknod /dev/tty5 c 4 5
mknod /dev/tty6 c 4 6
mknod /dev/tty7 c 4 7
mknod /dev/tty8 c 4 8
mknod /dev/tty9 c 4 9
mknod /dev/tty10 c 4 10
mknod /dev/tty11 c 4 11
mknod /dev/tty12 c 4 12
mknod /dev/ttyS0 c 4 64
mknod /dev/ttyS1 c 4 65
mknod /dev/ttyS2 c 4 66
mknod /dev/ttyS3 c 4 67
echo Setting up hotplug.
hotplug
echo Creating block device nodes.
mkblkdevs
echo "Loading ehci-hcd.ko module"
insmod /lib/ehci-hcd.ko
echo "Loading ohci-hcd.ko module"
insmod /lib/ohci-hcd.ko
echo "Loading uhci-hcd.ko module"
insmod /lib/uhci-hcd.ko
mount -t usbfs /proc/bus/usb /proc/bus/usb
echo "Loading jbd.ko module"
insmod /lib/jbd.ko
echo "Loading ext3.ko module"
insmod /lib/ext3.ko
echo "Loading scsi_mod.ko module"
insmod /lib/scsi_mod.ko
echo "Loading sd_mod.ko module"
insmod /lib/sd_mod.ko
echo "Loading libata.ko module"
insmod /lib/libata.ko
echo "Loading ahci module #######################################"
insmod /lib/ahci.ko
echo "Loading ata_piix.ko module"
insmod /lib/ata_piix.ko
echo "Loading dm-mem-cache.ko module"
insmod /lib/dm-mem-cache.ko
echo "Loading dm-mod.ko module"
insmod /lib/dm-mod.ko
echo "Loading dm-log.ko module"

重点是要添加引导异常机缺的ahci.ko,即添加上文下划线部分,这类驱动一般是通用驱动,Linux都自带,但为减少引导镜象大小,没有全放进去,使用

1
2
[root@localhost newinit]# modprobe --list|grep ahci
/lib/modules/2.6.18-128.el5/kernel/drivers/ata/ahci.ko

可以很容易找到它,拷贝到上述lib目录中,更改上述init脚本即基本完成,下面要重新制作引导镜象:

1
2
3
find . | cpio --quiet -c -o >../newinitrd
cd ..
gzip -9 < newinitrd > initrd-2.6.18-128.el5.img

OK,替换掉异常机的/boot目录下的该文件吧,重新启动则正常:)