案例
一个文件正在被进程写入数据,想查找具体是哪个程序进行写入,使用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 | # stap -e 'probe begin{printf("Hello, World"); exit();}' |
实践
1 | [root@aliy-nt1 ~]#vim inodewatch.stp |
其他
文件锁住,禁止写入
1 | #解锁 |