CentOS 7 安装使用 Sysdig 教程(通用安装 + Docker 方式)

前言

Sysdig 是 Linux 系统的全栈可见性工具,可以捕获、解析和分析系统调用和事件,相当于 strace + tcpdump + htop + iftop + wireshark 的综合体。本文介绍在 CentOS 7 上安装和使用 Sysdig 的两种方式:直接安装和 Docker 方式。

一、什么是 Sysdig

Sysdig 是一个开源的系统监控工具,具有以下特点:

  • 支持捕获系统调用、文件操作、网络活动
  • 提供高级过滤语法(类似 Wireshark)
  • 内置 csysdig 交互式界面
  • 支持容器级别的监控(Docker/Kubernetes)
  • 可通过 Lua 编写自定义插件

二、安装方式一:直接安装(通用方式)

2.1 一键安装(推荐方式)

# 推荐的一键安装方式,自动完成所有配置
curl -s https://download.sysdig.com/stable/install-sysdig | bash

2.2 手动分步安装

如果一键脚本不生效,可以按以下步骤手动配置:

Step 1 - 导入 GPG 密钥并添加仓库

# 导入 Draios GPG 密钥
rpm --import https://download.sysdig.com/DRAIOS-GPG-KEY.public

# 添加 Draios YUM 仓库
curl -s -o /etc/yum.repos.d/draios.repo https://download.sysdig.com/stable/rpm/draios.repo

Step 2 - 安装 EPEL 仓库

# CentOS 7 安装 EPEL 仓库(如果 DKMS 不可用)
yum install -y epel-release

# 验证 DKMS 是否可用
yum list dkms

Step 3 - 安装内核开发包

# 安装与当前内核版本匹配的内核开发包
yum install -y kernel-devel-$(uname -r)

Step 4 - 安装 Sysdig

yum install -y sysdig

2.3 验证安装

# 查看版本
sysdig --version

# 查看帮助
sysdig --help

2.4 内核模块自动加载

首次运行 Sysdig 时会自动编译并加载内核模块:

# 测试运行(会触发内核模块编译)
sysdig proc.name=sshd

# 查看加载的内核模块
lsmod | grep sysdig

# 查看内核模块信息
modinfo sysdig

三、安装方式二:Docker 方式

3.1 前置要求

  • 已安装 Docker
  • 需要 privileged 权限运行容器(因为要访问内核)

3.2 使用官方 Docker 镜像

# 运行交互式 csysdig 界面(csysdig 已包含在 sysdig/sysdig 镜像中)
docker run -it --rm \
    --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 \
    -v /etc:/host/etc:ro \
    sysdig/sysdig \
    csysdig

3.3 使用 sysdig 命令行

# 捕获系统事件到文件
docker run -it --rm \
    --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 \
    -v /etc:/host/etc:ro \
    sysdig/sysdig \
    sysdig -w /tmp/capture.scap

# 读取捕获文件
docker run -it --rm \
    --name sysdig \
    --privileged \
    -v /tmp/capture.scap:/tmp/capture.scap \
    sysdig/sysdig \
    sysdig -r /tmp/capture.scap

# 实时监控容器网络活动
docker run -it --rm \
    --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 \
    -v /etc:/host/etc:ro \
    sysdig/sysdig \
    sysdig -c topcontainers_net

四、常用命令和用法

4.1 实时监控命令

# 列出所有可用 chisel(内置分析脚本)
sysdig -cl

# 查看特定 chisel 的详细信息
sysdig -i topfiles_total

# 实时显示 CPU 使用最高的进程
sysdig -c topprocs_cpu

# 实时显示网络连接
sysdig -c netcuts

# 显示文件 I/O 最高的进程
sysdig -c topfiles_bytes

4.2 过滤语法

Sysdig 使用类似 Wireshark 的过滤语法:

# 监控特定进程
sysdig proc.name=nginx

# 监控特定用户的所有操作
sysdig user.name=root

# 监控文件读写
sysdig fd.type=file and (evt.is_write=true)

# 监控网络连接
sysdig fd.type=ipv4 and evt.rawres>=0

# 监控 HTTP 请求
sysdig -c httplog

# 监控 DNS 查询
sysdig -c dnsqueries

# 组合过滤:监控 root 用户的网络写操作
sysdig user.name=root and fd.type=ipv4 and evt.is_write=true

4.3 保存和回放捕获

# 保存捕获到文件(最大 1GB)
sysdig -w capture.scap

# 保存并限制文件大小
sysdig -W 10 -w capture.scap  # 每个文件 10MB,自动滚动

# 按文件大小或时间滚动
sysdig -G 3600 -W 5 -w capture.scap  # 每小时一个文件,保留 5 个

# 回放捕获
sysdig -r capture.scap

# 回放时应用过滤
sysdig -r capture.scap proc.name=nginx

4.4 容器相关监控

# 显示容器列表
sysdig -c lscontainers

# 显示容器 CPU 使用排名
sysdig -c topcontainers_cpu

# 显示容器 I/O 排名
sysdig -c topcontainers_file

# 监控特定容器
sysdig container.id=xxxxx

# 显示容器网络活动
sysdig -c topcontainers_net

# 监控容器间的通信
sysdig -c fdcount_by container.name evt.rawres>=0

五、高级用法

5.1 自定义 Chisel 脚本

Sysdig 支持用 Lua 编写自定义分析脚本:

# 创建自定义 chisel
cat > /tmp/my_chisel.lua << 'EOF'
-- 监控所有写入敏感目录的操作
sensitivity_dirs = {
    "/etc/",
    "/usr/bin/",
    "/usr/sbin/"
}

function onbuffer_init(buffer)
    -- 初始化
end

function onbuffer_event(buffer)
    -- 获取事件信息
    local evt = buffer:get evt()
    local pid = evt:get(pid)
    local comm = evt:get(comm)
    local fd = evt:get(fd)

    -- 检查是否为写操作
    if evt:get(is_write) then
        local filename = fd:get_name()
        for _, dir in ipairs(sensitivity_dirs) do
            if string.find(filename, dir) then
                print(string.format("[ALERT] %s (PID %d) wrote to sensitive: %s",
                    comm, pid, filename))
            end
        end
    end
end

sensitivity_dirs = nil
collectgarbage()
EOF

# 运行自定义 chisel
sysdig -c /tmp/my_chisel.lua

5.2 输出格式化

# JSON 格式输出(便于后续分析)
sysdig -j -w capture.scap

# 从 JSON 文件提取信息
sysdig -r capture.scap -j | jq '. | select(.proc.name=="nginx")'

# 只输出特定字段
sysdig -p "%evt.time %user.name %proc.name %fd.name" proc.name=nginx

六、故障排查示例

6.1 排查服务器卡顿

# 1. 查看 CPU 使用最高的进程
sysdig -c topprocs_cpu

# 2. 查看 I/O 最高的文件
sysdig -c topfiles_file

# 3. 查看网络流量异常
sysdig -c topconnections

# 4. 查看系统调用耗时
sysdig -c spectrogram

6.2 排查网络问题

# 查看所有网络连接
sysdig -c netstat

# 查看 DNS 查询
sysdig -c dnsqueries

# 查看 HTTP 请求
sysdig -c httplog

# 查看谁在连接某个端口
sysdig fd.port=80 and fd.type=ipv4

6.3 排查容器问题

# 查看所有容器资源使用
sysdig -c topcontainers_cpu
sysdig -c topcontainers_net

# 查看特定容器的所有系统调用
sysdig container.name=myapp

# 查看容器内进程网络活动
sysdig -c topcontainers_net container.name=myapp

七、常见问题

7.1 内核模块加载失败

# 检查内核版本
uname -r

# 确保内核-devel 包版本匹配
yum install -y kernel-devel-$(uname -r)

# 手动编译内核模块
sysdig-probe-loader

7.2 Docker 方式权限问题

# 确保使用 --privileged 或添加 CAP_SYS_ADMIN
docker run --rm --privileged -v /var/run/docker.sock:/host/var/run/docker.sock \
    sysdig/sysdig sysdig -c topprocs_cpu

# 或者挂载必要的设备
docker run --rm \
    --cap-add SYS_ADMIN \
    --security-opt apparmor:unconfined \
    -v /var/run/docker.sock:/host/var/run/docker.sock \
    sysdig/sysdig sysdig -c topprocs_cpu

7.3 性能影响

Sysdig 默认对系统性能影响较小,但大量捕获时建议:

  • 使用过滤器限制捕获范围
  • 设置合理的文件大小滚动
  • 生产环境优先使用 Docker 方式,便于隔离
  • 避免长时间捕获大流量场景

八、总结

Sysdig 是 Linux 系统监控的瑞士军刀,无论是直接安装在主机上,还是通过 Docker 容器运行,都能提供强大的系统可见性。推荐:

  • 直接安装:适合需要深入系统内核的场景,性能最好
  • Docker 方式:适合快速部署、隔离环境、容器化运维场景

掌握 Sysdig 的过滤语法和常用 chisel,可以大大提高故障排查和性能分析的效率。

发表回复

后才能评论