故障背景:

在2.6.32升级内核之后,出现多台设备启动失败,失败的全部都是ssd作为系统盘的机器,bios引导之后,屏幕就黑了,没有打印。

一开是以为是mbr损坏了,所以将启动盘挂载到其他服务器上,结果发现mbr和升级之前备份的mbr是一样的,而且和升级后能正常启动的mbr也是一样的。

排查到此,没能继续跟踪,找专业的os团队同事蒙恩排查,结论记录如下:

由于使用的是grub作为引导程序,mbr中的扇区位置,找不到stage2文件。

过程:

1.把现场的boot.bak和mbr.bak拿回来搭建了环境,引导内核,引导不起来,由于虚拟机bios有里程碑打印,确定bios已经加载到mbr了。

2.确定mbr坏掉了,主要是mbr中写入的stage2文件开始扇区号错了

3.打点确定升级操作没有操作到mbr以及引导相关的几个关键文件(stage2等)

grub-install失败的原因就是现场用了这种方式写device map文件,构造个如下的device.map文件,然后用命令:"grub-install /dev/sda" (sda是系统盘)

[root@XJ-Center-VS3000-4 /]# cat /boot/grub/device.map

(hd0)   /dev/disk/by-id/ata-INTEL_SSDSC2BB240G4_BTWL4020041Z240NGN

原理记录:

=====

系统启动流程:MBR(/boot/grub/stage1)->/boot/grub/stage2->vmlinux MBR负责加载stage2->stage2负责加载vmlinux.

MBR /boot/grub/stage1,/boot/grub/stage2的关系如下:

stage1二进制么以办法识别文件系统,因此只能通过biso中断,读数据。

stage1二进制程序被写入MBR,stage1有几个变量通过编译器严格控制其在stage1二进制文件中的偏移量。其中一个最重要的变量是stage2在boot分区的开始扇区号,因此MBR为stage1文件+几个被安装程序修改的变量+分区表

stage2中内置了ext系列文件系统的支持,因此可以通过直接读boot分区所在的文件系统来加载vmlinux,grub.conf等。

上面结论的依据:

Stage 1 and Stage 2 have embedded variables whose locations are

well-defined, so that the installation can patch the binary file

directly without recompilation of the stages.

In Stage 1, these are defined:

`0x3E'

The version number (not GRUB's, but the installation mechanism's).

`0x40'

The boot drive. If it is 0xFF, use a drive passed by BIOS.

`0x41'

The flag for if forcing LBA.

`0x42'

The starting address of Stage 2.

`0x44'

The first sector of Stage 2.

`0x48'

The starting segment of Stage 2.

`0x1FE'

The signature (`0xAA55').

打点了升级patch中是否调用过grub一级打开stage文件结果如下,并没有发现有人调用过grub命令(grub-install也是调用了grub来安装grub的)

[root@localhost home]# ./test.stap |grep -E 'stage|grub'

open===/boot/grub/grub.conf

open===/boot/grub/sedgzxf68

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting10.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting11.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting08.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting08.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting01.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting11.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting10.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting04.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting09.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting01.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting03.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting11.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting08.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting07.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting07.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting03.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting06.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting05.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting02.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting07.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting02.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting01.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting09.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting06.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting09.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting05.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting05.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting03.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting10.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting06.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting04.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting04.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting02.png

execve===>/sbin/grubby

open===/etc/grub.conf

open===../boot/grub/grub.conf-

execve===>/sbin/grubby

open===/etc/grub.conf

execve===>/sbin/grubby

open===/etc/grub.conf

open===/etc/sysconfig/grub

execve===>/sbin/grubby

open===/etc/grub.conf

open===../boot/grub/grub.conf-

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting10.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting11.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting08.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting08.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting01.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting11.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting10.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting04.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting09.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting01.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting03.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting11.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting08.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting07.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting07.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting03.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting06.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting05.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting02.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting07.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting02.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting01.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting09.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting06.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting09.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting05.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting05.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage01-connecting03.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting10.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting06.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage02-connecting04.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting04.png

open===/usr/share/icons/hicolor/22x22/apps/nm-stage03-connecting02.png

open===/boot/grub/grub.conf

open===/boot/grub/grub.conf

排查了grub-install脚本,在脚本中发现对device-map文件的解析还是过于简单,我们这种类型的device-map没有适配,在升级之前,我们的mbr中对stage2的扇区也是错的,

但由于这个扇区里面存放的之前老的stage2文件还留存着,反倒没有问题,升级之后,boot分区可能因为备份的原因,里面要覆盖一些新的文件,导致那个sector被分配出去了。

参考资料:

https://www.gnu.org/software/grub/manual/legacy

一次linux启动故障记录的更多相关文章

  1. Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)

    启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬 ...

  2. Linux启动过程详解

    Linux启动过程详解 附上两张图,加深记忆 图1: 图2: 第一张图比较简洁明了,下面对第一张图的步骤进行详解: 加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的 ...

  3. Linux启动过程详述

    http://www.ibm.com/developerworks/cn/linux/kernel/startup/index.html Linux启动第1步:引导内核 Linux启动第2步:内核部分 ...

  4. linux启动流程及自定义gurb

    linux 启动流程 POST BIOS(boot sequence) 所选择的启动设备次序的MBR中是否有引导程序, ----> MBR(bootloader) 提供内核列表 -------& ...

  5. Linux启动与登陆环境

    linux启动流程 参考:http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html 加载内核,首先读入/boot 目录下的内核文件. ...

  6. linux启动流程

    看了深入理解linux内核一书的最后对linux启动流程的介绍,下面就把我能理解的写一下吧: bios(硬件加电自检POST,寻找第一个启动设备) the boot loader(可以从硬盘启动也可以 ...

  7. Linux 启动过程分析

    本文仅简单介绍Linux的启动过程,在此基础上做简要的分析.对于Linux启动过程中内部详细的函数调用不做介绍,只是希望本文能给新手起到一个抛砖引玉的作用,以便深入研究Linux的启动过程.下图基本展 ...

  8. [转载] Linux启动过程详解-《别怕Linux编程》之八

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket.为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. = ...

  9. python实现Linux启动守护进程

    python实现Linux启动守护进程 DaemonClass.py代码: #/usr/bin/env python # -*- coding: utf-8 -*- import sys import ...

随机推荐

  1. servlet简单的小例子

    去我云盘下载: https://pan.baidu.com/s/1E2yoZ2Nmk2FE2XjuPOCvjA 访问方式:http://localhost:8080/testServlet/index ...

  2. [UE4]蓝图的颜色

    一.蓝色:调用的函数或事件 二.绿色:纯函数 三.紫色:函数定义 四.灰色:宏 五.白色:执行线 六.事件的定义 另外还有数据类型的颜色: 执行线是白色,数据线颜色跟数据量类型一致.

  3. Java内存泄漏相关

    之前学习了javaGC的原理机制,有了一定的了解,现在做一个整理总结,便于理解记忆,包括三个问题: 1. java GC是什么时候做的? 2. java GC作用的东西是什么? 3. java GC具 ...

  4. STL常用容器使用方法

    在程序头部使用#include<stack>来引入STL的stack容器,然后使用stack<int> s语句来声明一个管理整型数据的容器s.stack常用成员函数:push( ...

  5. 文本adversarial examples

    对文本对抗性样本的研究极少,近期论文归纳如下: 文本对抗三个难点: text data是离散数据,multimedia data是连续数据,样本空间不一样: 对text data的改动可能导致数据不合 ...

  6. Ramdisk虚拟内存盘,Swap分区

    虚拟内存盘是通过软件将一部分内存(RAM)模拟为硬盘来使用的一种技术.相对于直接的硬盘文件访问来说,这种技术可以极大的提高在其上进行的文件访问的速度.但是RAM的易失性也意味着当关闭电源后这部分数据将 ...

  7. three.js学习:性能监视器stats.js的用法

    用法一: var stats = new Stats(); stats.setMode(0); stats.domElement.style.position = 'absolute'; stats. ...

  8. tornado-模版reverse_url

    from tornado.web import url handler=[ url(r"/hello", grab_handler.HelloHandler, name='hell ...

  9. JSP 静态文件路径配置

    在JSP中,往往需要引入一些静态文件. 例如这样引用. 往往因为目录结构的问题,不知道是用点还是 .../ ./ ../表示相对当前路径的上一级目录:./表示相对当前的路径: 这里有个快捷的办法. l ...

  10. java BASE64流 输出图片。

    亲测3个请求都可用,没有测试性能问题.仅供参考 BASE64Decoder Eclipsse 类可能引用不了解决方案链接:http://blog.csdn.net/JBxiaozi/article/d ...