需求描述

在 Linux 中使用 eBPF 监控文件删除操作,并记录详细的进程信息和删除文件路径,可以利用 bpftrace 来实现。bpftrace 是一个高层次的 eBPF 工具,允许你编写脚本来监控系统事件。下面是一个示例脚本,用于监控文件删除操作:


安装 bpftrace

如果还没有安装 bpftrace,可以使用以下命令进行安装:


对于基于 Debian 的系统 (如 Ubuntu):

sudo apt-get update
sudo apt-get install bpftrace

对于基于 Red Hat 的系统 (如 CentOS):

sudo yum install bpftrace

编写 bpftrace 脚本

下面是一个 bpftrace 脚本,它将监控文件删除操作,并记录相关的进程信息和删除的文件路径:bpftrace

#!/usr/bin/env bpftrace

// 跟踪 unlink 系统调用
tracepoint:syscalls:sys_enter_unlink,
tracepoint:syscalls:sys_enter_unlinkat
{
    // 记录调用 unlink/unlinkat 时的文件路径
    @unlink_pid[tid] = args->pathname;
}

// 跟踪 unlink 系统调用完成
tracepoint:syscalls:sys_exit_unlink,
tracepoint:syscalls:sys_exit_unlinkat
/ @unlink_pid[tid] /
{
    // 记录进程详细信息和文件路径
    printf("Process %d (%s) deleted file: %s\n", pid, comm, str(@unlink_pid[tid]));

    // 删除临时记录
    delete(@unlink_pid[tid]);
}

运行 bpftrace 脚本

将上述脚本保存为 monitor_file_delete.bt,然后在终端中运行:

进程后台运行操作日志输出到当前路径 ./file_delete_log.txt

sudo nohup bpftrace monitor_file_delete.bt | tee ./file_delete_log.txt  &

脚本解释

tracepoint:syscalls:sys_enter_unlink, tracepoint:syscalls:sys_enter_unlinkat:这些 tracepoint 跟踪 unlink 和 unlinkat 系统调用的入口。

@unlink_pid[tid] = args->pathname:在进入 unlink 和 unlinkat 调用时,记录下要删除的文件路径。

tracepoint:syscalls:sys_exit_unlink, tracepoint:syscalls:sys_exit_unlinkat:这些 tracepoint 跟踪 unlink 和 unlinkat 系统调用的退出。

printf("Process %d (%s) deleted file: %s\n", pid, comm, str(@unlink_pid[tid])):在退出 unlink 和 unlinkat 调用时,输出进程 ID,进程名和删除的文件路径。

delete(@unlink_pid[tid]):删除临时记录。

这个脚本在每次 unlink 或 unlinkat 系统调用发生时都会捕获相关信息并打印出来,从而实现对文件删除操作的监控。

运行结果

Linux 中使用 eBPF 监控文件删除操作_系统调用