BCC
BCC
目录
用例教程 - 特殊过滤
有些工具具有特殊的过滤功能,主要用例是跟踪容器中运行的进程,但这些机制是通用的,也可以用于其他情况。
按 cgroup 过滤
某些工具可以选择通过引用外部管理的固定 BPF 哈希图来按 cgroup 进行过滤。
命令示例:
# ./opensnoop --cgroupmap /sys/fs/bpf/test01
# ./execsnoop --cgroupmap /sys/fs/bpf/test01
# ./tcpconnect --cgroupmap /sys/fs/bpf/test01
# ./tcpaccept --cgroupmap /sys/fs/bpf/test01
# ./tcptracer --cgroupmap /sys/fs/bpf/test01
上面的命令将仅显示属于 cgroup 之一的进程的结果,这些 cgroup 的 id 由 bpf_get_current_cgroup_id()
返回,位于固定的 BPF 哈希映射中。
BPF 哈希映射可以通过以下方式创建:
要在新的 cgroup 中获取 shell,您可以使用:
# systemd-run --pty --unit test bash
shell 将在 cgroup /sys/fs/cgroup/unified/system.slice/test.service 中运行。
可以使用 name_to_handle_at() 系统调用来发现 cgroup id。在examples/cgroupid中,你会找到一个获取cgroup id的程序示例。
# cd examples/cgroupid
# make
# ./cgroupid hex /sys/fs/cgroup/unified/system.slice/test.service
或者,使用 Docker:
# cd examples/cgroupid
# docker build -t cgroupid .
# docker run --rm --privileged -v /sys/fs/cgroup:/sys/fs/cgroup \
cgroupid cgroupid hex /sys/fs/cgroup/unified/system.slice/test.service
这会将 cgroup id 打印为主机字节序中的十六进制字符串,例如 77 16 00 00 01 00 00 00 。
# FILE=/sys/fs/bpf/test01
# CGROUPID_HEX="77 16 00 00 01 00 00 00"
# bpftool map update pinned $FILE key hex $CGROUPID_HEX value hex 00 00 00 00 00 00 00 00 any
现在,由 systemd-run 启动的 shell 在 BPF 哈希映射中具有其 cgroup id,bcc 工具将显示该 shell 的结果。可以在 BPF 哈希图中添加和删除 Cgroup,而无需重新启动 bcc 工具。
此功能对于在外部项目中集成密件抄送工具非常有用。
按名称空间挂载过滤
BPF 哈希映射可以通过以下方式创建:
# bpftool map create /sys/fs/bpf/mnt_ns_set type hash key 8 value 4 entries 128 \
name mnt_ns_set flags 0
执行 execsnoop
工具仅过滤 /sys/fs/bpf/mnt_ns_set
中的挂载命名空间:
# tools/execsnoop.py --mntnsmap /sys/fs/bpf/mnt_ns_set
在新的挂载命名空间中启动终端:
# unshare -m bash
使用上面终端的挂载命名空间 ID 更新哈希映射:
FILE=/sys/fs/bpf/mnt_ns_set
if [ $(printf '\1' | od -dAn) -eq 1 ]; then
HOST_ENDIAN_CMD=tac
else
HOST_ENDIAN_CMD=cat
fi
NS_ID_HEX="$(printf '%016x' $(stat -Lc '%i' /proc/self/ns/mnt) | sed 's/.\{2\}/&\n/g' | $HOST_ENDIAN_CMD)"
bpftool map update pinned $FILE key hex $NS_ID_HEX value hex 00 00 00 00 any
在此终端中执行命令:
# ping kinvolk.io
您将看到如何在上面启动的 execsnoop
终端上记录呼叫:
# tools/execsnoop.py --mntnsmap /sys/fs/bpf/mnt_ns_set
[sudo] password for mvb:
PCOMM PID PPID RET ARGS
ping 8096 7970 0 /bin/ping kinvolk.io