sysdig 使用汇总
说明
在文章 Linux 系统动态追踪技术介绍 和 如何审计 Linux 系统的操作行为 介绍了 sysdig 这款系统跟踪工具相关的原理和案例, 但其众多的选项使用起来不容易记住, 本文则汇总了安装部署以及一些常用的命令方便随时参考使用.
可使用命令
sysdig -l
列出不同 rule 规则下各字段说明, 更多见: rule-fields-library
依赖说明
sysdig
属于底层的诊断工具, 需要捕捉内核态的系统调用行为, 捕捉的时候以内核模块的形式与内核交互. 所以在安装的时候会依赖两个组件:
kernel-devel
dkms
kernel-devel
需要和当前主机的内核版本匹配, 比如:
kernel-3.10.0-957.27.2.el7.x86_64
kernel-tools-3.10.0-957.27.2.el7.x86_64
kernel-headers-3.10.0-957.27.2.el7.x86_64
kernel-devel-3.10.0-957.27.2.el7.x86_64
dkms 则主要提供了内核模块动态加载的功能, 目前各 Linux 发行版都支持.
安装说明
以 Centos 为例说明, 安装 sysdig 之前, 安装相应的依赖, rpm 安装时间较长, 可能几十秒左右:
yum -y install epel-release
yum -y install dkms kernel-devel-$(uname -r)
rpm -ivh sysidg-0.30.2-x86_64.rpm
说明: 如果没有匹配的 kernel-devel 版本, 可以从官方源下载: buildlogs-seed.centos.org , 可以通过以下命令确定版本路径:
# cat /etc/redhat-release && uname -v
CentOS Linux release 7.6.1810 (Core)
#1 SMP Mon Jul 29 17:46:05 UTC 2019
上述信息的 1810(2018 年 10 月)
及时间 2019-07-29
即可找到对应的内核版本
http://buildlogs-seed.centos.org/c7.1810.u.x86_64/kernel/20190729174341/
安装完成后, 简单校验即可:
# sysdig --version
sysdig version 0.30.2
使用注意事项
老内核问题
老版本的内核可能未开启内核模块的支持, 所以不能安装 dkms.
性能问题
sysdig
直接消费内核的系统调用, 比 strace 的方式高效很多. 但是实际使用的时候尽量控制在进程或端口级别, 不要全局抓取, 保证对系统影响最小.
容器诊断
docker
和 k8s
容器的诊断, 需要在宿主主机中运行 sysdig. 在诊断进程, 端口, 描述符的时候需要增加相应的 container 和 k8s.pod 参数.
日志输出
等同 tcpdump 的方式, 最好都通过 -w
选项将数据保存起来, 方便事后分析. 每次执行 sysdig 的时候, 会产生一些 kernel 相关的初始化事件, 可以在 /var/log/messages
中搜索 kernel 相关的消息, sysdig 的不同版本对应不同的内核模块:
sysdig_probe - 较早版本
scap - 较新版本
# modinfo sysdig_probe
filename: /lib/modules/3.10.0-957.27.2.el7.x86_64/extra/sysdig-probe.ko.xz
author: sysdig inc
license: GPL
retpoline: Y
rhelversion: 7.6
srcversion: 86AB498A3C62A1174E0590E
depends:
vermagic: 3.10.0-957.27.2.el7.x86_64 SMP mod_unload modversions
parm: max_consumers:Maximum number of consumers that can simultaneously open the devices (uint)
parm: verbose:Enable verbose logging (bool)
# modinfo scap
filename: /lib/modules/3.10.0-1160.81.1.el7.x86_64/extra/scap.ko.xz
schema_version: 2.1.0
api_version: 2.0.0
build_commit:
version: 3.0.1+driver
author: the Falco authors
license: GPL
retpoline: Y
rhelversion: 7.9
srcversion: 8D14033AD175AA1EAFB3D09
depends:
vermagic: 3.10.0-1160.81.1.el7.x86_64 SMP mod_unload modversions
signer: DKMS module signing key
sig_key: 99:CB:76:3D:DD:23:62:32:75:2B:5A:B6:EC:F8:02:15:16:DA:64:EE
sig_hashalgo: sha512
parm: g_buffer_bytes_dim:This is the dimension of a single per-CPU buffer in bytes. Please note: this buffer will be mapped twice in the process virtual memory, so pay attention to its size.
parm: max_consumers:Maximum number of consumers that can simultaneously open the devices (uint)
parm: verbose:Enable verbose logging (bool)
备忘汇总
sysdig vs strace
操作 | sysdig | strace | 说明 |
---|---|---|---|
跟踪命令执行 | sysdig proc.name=who | strace who | who 为执行的命令 |
跟踪进程运行 | sysdig proc.pid=xxx | strace -p xxx | xxx 为进程 pid |
跟踪时间信息 | sysdig proc.name=who sysdig -tD proc.name=who |
strace -t who strace -r who |
sysdig 默认打印时间-tD 等同 strace -r 可以获取系统调用的相对时间. |
跟踪系统调用 | sysdig evt.type=open and proc.name=who sysdig “evt.type in (open,read) and proc.name=who” |
strace -e open who strace -e trace=open,read |
- |
保存跟踪信息 | sysdig -w output.scap proc.name=who | strace -o output.log who | 二者有对应的选项可以保存结果, 另外 sysdig -r output.scap 可以读取文件, 类似 tcpdump 的用法 |
汇总系统调用 | 1. sysdig -w output.scap 2. sysdig -r output.scap -c topscalls -c topscalls_time 或 csysdig -r outpu.scap -v syscals |
strace -c who | sysdig -c 提供了很多选项 |
sysdig vs lsof
操作 | sysdig | lsof | 说明 |
---|---|---|---|
查看文件句柄信息 | sysdig -c lsof | lsof | - |
查看指定文件的句柄信息 | sysdig -c lsof “fd.name=/var/log/syslog” | lsof /var/log/syslog | - |
查看指定目录下的句柄信息 | sysdig -c lsof “fd.directory=/var/log” | lsof +d /var/log | - |
查看进程名打开了的文件 | sysdig -c lsof “proc.name=sshd” | lsof -c sshd | - |
列出指定用户打开了哪些文件 | sysdig -c lsof “user.name=xxx” | lsof -u xxx | xxx 为用户名 |
列出非指定用户打开的文件 | sysdig -c lsof “user.name!=xxx” | lsof -u ^xxx | xxx 为用户名 |
列出指定进程打开的文件 | sysdig -c lsof “proc.pid=xxxx” | lsof -p xxxx | xxxx 为 pid |
列出指定用户或进程名打开的文件 | sysdig -c lsof “‘user.name=xxx or proc.name=sshd’” | lsof -u xxx -c sshd | sysdig 中有两层引号 |
列出所有网络连接 | sysdig -c lsof “fd.type=ipv4” | lsof -i | - |
列出指定进程的网络连接 | sysdig -c lsof “‘fd.type=ipv4 and proc.pid=xxxx’” | lsof -i -a -p xxxx | - |
列出有与 22 端口交互的信息 | sysdig -c lsof “‘fd.port=22 and fd.is_server=true’” | lsof -i :22 | - |
列出哪个进程监听了 22 端口 | - | lsof -i :22 -s TCP:LISTEN | - |
列出 tcp 或 udp 的连接 | sysdig -c lsof “fd.l4proto=tcp” sysdig -c lsof “fd.l4proto=udp” |
lsof -i tcp lsof -i udp |
- |
sysdig vs tcpdump
操作 | sysdig | tcpdump | 说明 |
---|---|---|---|
抓取 eth0 网络流量包 | sysdig fd.ip=192.168.1.2 | tcpdump -i eth0 | sysdig 目前不支持按网卡名过滤, 可以通过 fd.ip 设置 |
抓取 100 个包 | sysdig -n 100 fd.type=ipv4 | tcpdump -c 100 | - |
以 ASCII 显示报文 | sysdig -A fd.type=ipv4 | tcpdump -A | - |
以 HEX 显示报文 | sysdig -X fd.type=ipv4 | tcpdump -XX | - |
保存到数据文件 | sysdig -w output.scap fd.type=ipv4 | tcpdump -w output.pcap | - |
读取数据文件 | sysdig -r output.scap | tcpdump -r output.pcap | - |
仅抓取大于/小于 1024 字节的包 | sysdig “fd.type=ipv4 and evt.buflen > 1024” sysdig “fd.type=ipv4 and evt.buflen < 1024” |
tcpdump greater 1024 tcpdump less 1024 |
evt.buflen 对应 tcpdump 中的 greater/less, 另外这里的过滤语法不需要两层的引号 |
仅抓取 tcp/udp 的包 | sysdig fd.l4proto=tcp sysdig fd.l4proto=udp |
tcpdump tcp tcpdump udp |
不能仅使用 fd.type=ipv4, 这样分不出 tcp 还是 udp |
抓取指定端口的包 | sysdig fd.port=22 | tcpdump port 22 | |
抓取指定端口方向的包 | sysdig fd.rip=192.168.1.2 and fd.port=6666 | tcpdump dst 192.168.1.2 and port 6666 | rip(remote ip) 即可满足过滤的需求, 不用额外指定 fd.type=ipv4 |
参考
sysdig-troubleshooting-cheatsheet
sysdig-user-guide
sysdig-case