@cdmonkey
2026-04-27T05:58:02.000000Z
字数 6238
阅读 388
命令总结

Sysdig 一个工具就能完成几乎所有系统分析工具的功能,并且提供了统一的使用语法。
Sysdig 既能获得实时系统数据,也能把信息保存至指定文件中以供后面分析。
Sysdig 通过于内核 driver 模块注册系统调用的 hook,这样当有系统调用发生、完成时,它将把系统调用信息拷贝至特定的 buffer,然后相关用户模块对数据信息进行处置(解压、解析、过滤等),并最终通过 Sysdig 命令行同用户进行交互。

首先要把虚机《安全引导》功能关闭!
另外,Sysdig 对内核版本有一定版本要求,若是内核太旧就没办法使用了。
# Update kernel# Must install kernel-headersyum install kernel kernel-headers kernel-tools
至少需要安装两个软件包:sysdig、scap-driver-loader(位于 tar.gz 包内)
第一次使用前要载入相关内核模块:
scap-driver-loader# Check:[root@yunweizhicheng ~]# lsmod|grep scapscap 983040 0
否则会有下面的报错:
[root@yunweizhicheng ~]# sysdig -w fdbytes_by.scap -C 30Unable to load the drivererror opening device /dev/scap0. Make sure you have root credentials and that the scap module is loaded: No such file or directory
若是使用容器的方式安装,需要把主机的很多系统目录 mount 至容器中:
docker run -i -t --name sysdig --privileged \-v /var/run/docker.sock:/host/var/run/docker.sock \-v /dev:/host/dev \-v /proc:/host/proc:ro \-v /boot:/host/boot:ro \-v /lib/modules:/host/lib/modules:ro \-v /usr:/host/usr:ro \sysdig/sysdig
yum install kernel-devel-$(uname -r)yum localinstall sysdig-0.40.0-x86_64.rpm
首先是确保安装了 epel 源:
yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-9.noarch.rpm# 把 repo 配置中的地址替换为阿里云镜像站地址sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
需要 kernel-devel、kernel-devel-matched 这俩包,我是从这里下载。
# uname -r: 5.14.0-427.13.1.el9_4.x86_64yum localinstall kernel-devel-5.14.0-427.13.1.el9_4.x86_64.rpmyum localinstall kernel-devel-matched-5.14.0-427.13.1.el9_4.x86_64.rpm
安装 dkms
yum install dkms
最后安装 Sysdig
yum localinstall sysdig-0.38.1-x86_64.rpm
剩下的就是载入内核模块。但是很遗憾,模块无法载入,怎么着都不行。
depmod.....* scap module installed in dkms* scap module found: /var/lib/dkms/scap/7.2.0+driver/5.14.0-427.13.1.el9_4.x86_64/x86_64/module/scap.ko.xz* Trying to insmod* Unable to insmod scap module* Trying to load a system scap module, if presentConsider compiling your own scap driver and loading it or getting in touch with the Sysdig community
Github 上有类似的安装问题,参考这个:https://github.com/draios/sysdig/issues/2035,提供的解决办法是使用 --modern-bpf 参数运行指令。
--modern-bpf Enable live capture using the modern BPF probe instead of the kernel module.
大概意思就是使用 BPF 探针而不是内核模块启用实时捕获。用了一下,似乎是没问题。
只能这样吧,目前没有找出其他解决办法。
sysdig [option]... [filter]
| Opt | LongOpt | Explain |
|---|---|---|
-A |
--print-ascii |
只输出数据中文本部分 ,就是人可直接阅读之内容。 |
-b |
--print-base64 |
|
-w |
--write |
将事件捕获(trace)内容写入指定文件。 |
-r |
--read |
从哪里读入事件信息,通常是个 trace 文件。 |
-z |
--compress |
启用 trace 文件压缩。 |
直接输入 sysdig 就能开始捕获系统信息,这个命令需要系统管理员权限,执行后将看出终端有持续不断的输出流(尽量别这么干,否则有时 Ctrl+C 都不能将其中断,而且根本无法看清更无法分析输出之信息)。总之就是,即便系统看似很清闲,底层也是时刻不停的进行着太多的系统调用。
基本上就是这个样子:
1606115 11:43:46.227503319 3 sshd (32228.32228) > clock_gettime1606116 11:43:46.227503783 3 sshd (32228.32228) < clock_gettime1606117 11:43:46.227504565 3 sshd (32228.32228) > select1606118 11:43:46.227505979 3 sshd (32228.32228) < select res=21606119 11:43:46.227506563 3 sshd (32228.32228) > rt_sigprocmask1606120 11:43:46.227506965 3 sshd (32228.32228) < rt_sigprocmask1606121 11:43:46.227507457 3 sshd (32228.32228) > rt_sigprocmask1606122 11:43:46.227507763 3 sshd (32228.32228) < rt_sigprocmask1606123 11:43:46.227508278 3 sshd (32228.32228) > clock_gettime1606124 11:43:46.227508606 3 sshd (32228.32228) < clock_gettime1606125 11:43:46.227509206 3 sshd (32228.32228) > read fd=12(<f>/dev/ptmx) size=163841606126 11:43:46.227510319 3 sshd (32228.32228) < read res=343 data=1077533 11:43:43.743077230 2 ...
每行是为一条记录,包含多个列,预设样式为:
%evt.num %evt.outputtime %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.info
列信息:
| Field | Explain |
|---|---|
| evt.num | 递增事件号。 |
| evt.outputtime | 事件发生时间。 |
| evt.cpu | 事件被捕获时所处 CPU,就是系统调用是于哪个 CPU 上执行的。值 0 是为第一个 CPU |
| proc.name | 事件之进程名,就是哪个进程之事件。 |
| thread.tid | 线程 id,若为单线程程序,就是进程 id(PID) |
| evt.dir | 事件方向(direction),> 是为进入事件,< 是为退出事件。 |
| evt.type | 事件名(类型),像是 open、stat 等,一般是系统调用。 |
| evt.args | 事件参数。若是系统调用,这些对应着系统调用之参数。 |
列出指令支持的所有事件(主要是系统调用):
sysdig -L
保存为文件使用 -w。
因为 Sysdig 输出内容很多,不管是监控还是查问题,需要关注的事件只是其中很小一部分。这个时候就要使用过滤功能,定位目标事件。Sysdig 过滤功能很强大,不仅过滤类型很多,而且还能够自由地进行逻辑组合。
列出所有过滤器:
sysdig -l
指定过滤器:
sysdig evt.type=readsysdig evt.type=read and proc.name=sshd
过滤器除了直接使用等号进行选择外,还有其他操作符,包括 =、!=、>=、>、<、<=、contains、in 及 exists 等。
sysdig fd.name contains /etcsysdig "evt.type in ( 'select', 'poll' )"sysdig proc.name exists
多个过滤条件还能够通过 and、or 及 not 进行逻辑操作:
sysdig "not (fd.name contains /proc or fd.name contains /dev)"
尽管可用过滤器减少输出,然而直接于终端查看事件流还是没有办法进行深入分析。同 tcpdump 工具类似,Sysdig 同样允许把捕获事件保存至本地文件,将文件内容做进一步分析。保存至文件可使用 -w,从文件中读出需要使用 -r。
使用 -c 指定 Chisels,它是一系列预定义功能集合。
sysdig's chisels(类目)是内置脚本,供使用者用于追踪系统调用、查看系统性能瓶颈,它是用强大而且高效的 Lua 脚本语言编写。
sysdig -cl # --list-chisels,列出所有 Chisels
[root@hidocker02 ~]# sysdig -i fdbytes_by.luaCategory: I/O-------------fdbytes_by.lua I/O bytes, aggregated by an arbitrary filter fieldGroups FD activity based on the given filter field, and returns the key that generated the most input+output bytes. For example, this script can be used to list the processes or TCP ports that generated most traffic.Args:[string] key - The filter field used for grouping
依据给定筛选字段对 FD 活动进行分组,并返回生成最多 IO 字节的键。举例说,这个脚本可用于列出生成最多流量的进程及 TCP 端口。
首先,捕获 30M 的包用于分析:
sysdig -w fdbytes_by.scap -C 30
然后:
[root@hidocker02 ~]# sysdig -r fdbytes_by.scap0 -c fdbytes_by fd.typeBytes fd.type--------------------------------------------------------------------------------484.63KB file18.60KB ipv4475B netlink20B unix8B timerfd
然后:
[root@hidocker02 ~]# sysdig -r fdbytes_by.scap0 -c fdbytes_by fd.directory "fd.type=file"Bytes fd.directory--------------------------------------------------------------------------------182.81KB /lib64159.31KB /etc61.08KB /usr/share/locale52.55KB /proc11.27KB /dev11.07KB /dev/pts6.35KB /proc/net183B /proc/720
然后:
[root@hidocker02 ~]# sysdig -r fdbytes_by.scap0 -c fdbytes_by fd.name "fd.directory=/lib64"Bytes fd.name--------------------------------------------------------------------------------20.31KB /lib64/libselinux.so.120.31KB /lib64/libdl.so.220.31KB /lib64/libattr.so.120.31KB /lib64/libpthread.so.020.31KB /lib64/libpcre.so.120.31KB /lib64/libacl.so.120.31KB /lib64/libc.so.620.31KB /lib64/libcap.so.220.31KB /lib64/libnss_files.so.2
最后:
# 看看有哪些程序访问这个目录:sysdig -r fdbytes_by.scap0 -c fdbytes_by proc.name "fd.directory=/lib64"# 具体查看某个文件:sysdig -r fdbytes_by.scap0 -c fdbytes_by proc.name "fd.directory=/lib64 and fd.filename=libnss_files.so.2"
显示 CPU 使用率 Top10。
sysdig -c topprocs_cpu
sysdig -c topprocs_file
监控用户的操作命令:
sysdig -c spy_users
查看占用网络带宽最多的进程:
sysdig -c topprocs_net
查看读写量最大的文件:
sysdig -c topfiles_bytes
Github
Wiki
https://github.com/draios/sysdig/wiki
https://github.com/draios/sysdig/wiki/Sysdig-Examples
参考内容: