使用systemtap模拟坏盘

SYSTEMTAP 是内核开发者必备的工具, 一种动态追踪工具。结合内核模块debuginfo,可以实现在内核函数中增加注入代码执行,从而实现模拟各种故障。SYSTEMTAP主要工作原理为:
  1. 通过stap工具将脚本语句翻译成C语句, 编译成内核模块

  2. 模块加载之后, 将所有探测的事件以钩子的方式挂到内核上, 当任何处理器上的某个事件发生时, 相应钩子上句柄就会被执行

  3. 最后,当systemtap会话结束之后,钩子从内核上取下,移除模块

                stap注入错误过程
这个软件依赖内核头文件等等, 需要安装有 debuginfo 的内核和相关头文件,才能在内核的函数的注入信息。
 一般情况下我们会使用自己编译的内核,所以debuginfo通常需要编译内核的时候自己编译进去。当然,如果能apt-get或者在网站上找到就更好了。综合来看,系统必须包括以下包:
1、内核支持并配置了kprobe(编译内核时一般默认内核已配置)
2、编译内核模块所需的内核头文件以及模块配置信息
3、内核调试信息debuginfo
4、c编译环境
5、elfutils和systemtap安装包
 
 
一、环境配置过程(以下过程在debian 9环境配置)
   1)安装内核头文件
apt-get install linux-headers-$(uname -r) 
如果找不到就需要自己编译内核
2)安装debuginfo
方法1:
直接apt-get 安装:
apt-get update
先使用apt-cache search linux-image|grep dbg查看是否有类似linux-image-4.9.65-dbg的包。这里需要注意内核版本要和自己使用的完全一致,可以使用uname -r查看自己的内核版本
我这里的:
root@pubt1-ceph64:/home/chenyunhui# uname -r
4.9.65-netease
找到后直接apt-get install -y linux-image-4.9.65-netease-dbg
 
方法2:
 
如果apt-get不到尽量找一下网上的源或者从发行版的debuginfo站点, 下载对应的 debuginfo 包并安装,找不到就需要自己编译了
编译时需要开启以下几项:
 
CONFIG_DEBUG_INFO(必须) CONFIG_KPROBES(必须) CONFIG_RELAY(必须) CONFIG_DEBUG_FS CONFIG_MODULES CONFIG_MODULE_UNLOAD CONFIG_UTRACE
3)安装systemtap
 下载elfutils:
 
wget https://sourceware.org/elfutils/ftp/0.168/elfutils-0.168.tar.bz2 
  下载systemtap:
wget https://sourceware.org/systemtap/ftp/releases/systemtap-3.1.tar.gz
 配置
./configure --with-elfutils=/home/chenyunhui/elfutils-0.168 --prefix=/opt/systemtap3 (需要sudo权限)
# 编译
make -j6

#安装
make install
4)验证:
 
stap -v -e 'probe vfs.read {printf("read performed"); exit()}'
 
 
5)模拟磁盘慢盘:
模拟慢盘可以在vfs上或者scsi层来注入延时,但是实际测试过程中发现vfs层注入错误效果不佳。所以首选在scsi层注入。
需要找到内核中scsi层需要注入的函数名称,可以通过运行
stap -l 'module("scsi_mod").function("scsi_*")'  查看有哪些scsi命令,同时可以看到函数在哪个位置定义。
根据函数的传入参数,写一个测试脚本,例如:
#/usr/bin/env stap


global channel,id,lun,time
probe begin{
    channel = $1
    id = $2
    lun = $3
    time = $4
    printf("device of interest:[%d:%d:%d],time=%d\n",channel,id,lun,time)
}


probe module("scsi_mod").function("scsi_dispatch_cmd"){
    devchannel = $cmd->device->channel
    devid = $cmd->device->id
    devlun = $cmd->device->lun
    if(devchannel == channel && devid == id && devlun == lun){
      mdelay($4)
    }
}
其中 channel ,id,lun为硬盘设备号,可以用lsscsi查看到需要测试的硬盘设备号
 
执行: stap -p4 -DMAXSKIPPED=9999 -m ik -g scsi.stp 2 10 0 300 生成ik.ko 内核包
执行内核包:staprun ik.ko
看到对应的硬盘出现了配置的300ms时延:
 
 
另外,官方也提供了很多监控脚本,包括可以监控network、memory、kvm服务时间等等。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值