前面介绍了Linux挂死定位问题的特殊方法,算是剑走偏锋,现在介绍下Linux定位问题的常规方法。开发、测试或者运维,都可以看下,其实就是将OS串口重定向。
对于redhat7.0系列及更新的OS版本,都是适用的(UEFI模式下)。主要是修改/boot/efi/EFI/radhat/grub.cfg文件,对于CentOS系统,将redhat替换为centos即可,其他的系统,大致差不多在同样的位置。
找到该文件后,将“rhgb quiet”替换为“console=tty0 console=ttyS0,115200n8”。
在BIOS代码中,Intel的RC code串口信息的波特率为115200,所以服务器的波特率一般也都是115200,波特率不对,会产生乱码。对于安装OS过程中的问题,可以进入grub,然后输入“console=tty0 console=ttyS0,115200n8”命令,再开始安装系统,这样一来,在安装系统的过程中就会打印详细的OS日志,方便快速定位或者解决问题。
下面以一个实际的例子作为讲解
......
systemd-udevd[346]:worker [352]/devices/pci0000:00/0000:00:01.0/0000:01:00.0 timeout
systemd-udevd[346]:seq 2207 'devices/pci0000:00/0000:00:01.0/0000:01:00.0' killed
dracut-initqueue[384]:Waring:Could not boot
......
系统不能启动了,我们查看日志,一路往上追溯,发现PID为346的这个进程由于超时被kill掉了;通过分析pci信息,我们可以看出该pci设备的domain域是0000,bus number是00,device是01,function是0。
收集到足够多的信息之后,我们将OS重启,在对应目录下查找故障pci设备:
(1)输入 cd /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0
(2)然后输入ls,查看该目录下有哪些设备;
(3)输入cat uevent,就可以查看该故障设备了。
当然,对于这个例子,我们也可以使用另外一种方法:
直接输入lspci,找到00:01.0,发现这是一个PCI bridge;然后找该bridge下面连接的设备01:00.0,同样可以定位到故障设备。
对于这些不了解或者不熟悉的同学,推荐看下《PCI Spec》。