0%

CentOS7 安装 systemtap

案例

一个文件正在被进程写入数据,想查找具体是哪个程序进行写入,使用lsof 文件 命令无法找出。可以使用systemtap工具进行查找,linux下每个文件都会在某个块设备上存放,当然也都有相应的inode, 那么透过vfs.write我们就可以知道谁在不停的写入特定的设备上的inode。

环境

  • Linux发行版本:CentOS Linux release 7.4.1708 (Core)

  • 内核版本:3.10.0-693.5.2.el7.x86_64

  • uname -a: Linux aliy-nt1 3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 20 20:32:50 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

安装SystemTap

1
# yum install systemtap systemtap-runtime

在运行SystemTap之前,还需要装必要的内核信息包。可以运行如下stap-prep来安装这些包,如下:

1
# stap-prep

运行stap-prep的时候,它探测出还要安装kernel-devel-3.10.0-693.5.2.el7.x86_64包和kernel-debuginfo-3.10.0-693.5.2.el7.x86_64包 (实际上还有kernel-debuginfo-common包)。如果安装失败可以自行下载指定内核版本进行安装。
下载地址如下:

1
http://debuginfo.centos.org/7/x86_64/

测试

为了测试stap是否能正常运行,用如下简单命令打印:

1
2
# stap -e 'probe begin{printf("Hello, World"); exit();}'
Hello, World

实践

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
[root@aliy-nt1 ~]#vim inodewatch.stp

#! /usr/bin/env stap

probe vfs.write, vfs.read
{
# dev and ino are defined by vfs.write and vfs.read
if (dev == MKDEV($1,$2) # major/minor device
&& ino == $3)
printf ("%s(%d) %s 0x%x/%u\n",
execname(), pid(), probefunc(), dev, ino)
}


[root@aliy-nt1 ~]# ls -al /dev/vda1
brw-rw---- 1 root disk 253, 1 10月 17 2018 /dev/vda1

[root@aliy-nt1 ~]# stat -c '%i' /var/spool/cron/root
530697

[root@aliy-nt1 ~]# stap inodewatch.stp 253 1 530697
crontab(5846) vfs_read 0xfd00001/530697
crontab(5846) vfs_read 0xfd00001/530697
crontab(5884) vfs_read 0xfd00001/530697
crontab(5884) vfs_read 0xfd00001/530697

其他

文件锁住,禁止写入

1
2
3
4
5
#解锁
chattr -i *

#加锁
chattr +i *