BCC工具命令报错解决步骤

使用BCC工具报错

[root@server02 ~]# /usr/share/bcc/tools/execsnoop
modprobe: FATAL: Module kheaders not found in directory /lib/modules/5.10.0-60.18.0.50.r1083_58.hce2.x86_64
Unable to find kernel headers. Try rebuilding kernel with CONFIG_IKHEADERS=m (module) or installing the kernel development package for your running kernel version.
chdir(/lib/modules/5.10.0-60.18.0.50.r1083_58.hce2.x86_64/build): No such file or directory
Traceback (most recent call last):
  File "/usr/share/bcc/tools/execsnoop", line 227, in <module>
    b = BPF(text=bpf_text)
  File "/usr/lib/python3.9/site-packages/bpfcc/__init__.py", line 479, in __init__
    raise Exception("Failed to compile BPF module %s" % (src_file or "<text>"))
Exception: Failed to compile BPF module <text>

经过确认,此类报错一般就是需要更新内核模块

内核升级

[root@server02 ~]# yum -y install kernel-headers
Last metadata expiration check: 0:51:49 ago on Mon 15 Jul 2024 03:42:51 PM CST.
Package kernel-headers-5.10.0-182.0.0.95.r1941_123.hce2.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
[root@server02 ~]# yum -y install kernel-devel-$(uname -r)
Last metadata expiration check: 0:52:06 ago on Mon 15 Jul 2024 03:42:51 PM CST.
Dependencies resolved.
===============================================================================================================================================================================================================================================================================================================================
 Package                                                                     Architecture                                                          Version                                                                                        Repository                                                              Size
===============================================================================================================================================================================================================================================================================================================================
Downgrading:
 kernel-devel                                                                x86_64                                                                5.10.0-60.18.0.50.r1083_58.hce2                                                                updates                                                                 17 M

Transaction Summary
===============================================================================================================================================================================================================================================================================================================================
Downgrade  1 Package

Total download size: 17 M
Downloading Packages:
kernel-devel-5.10.0-60.18.0.50.r1083_58.hce2.x86_64.rpm  

验证

执行opensnoop命令,已经可以顺利使用

[root@server02 ~]# /usr/share/bcc/tools/opensnoop
PID    COMM               FD ERR PATH
775    hostwatch           5   0 /proc/775/stat
775    hostwatch           5   0 /proc/804/stat
775    hostwatch           5   0 /usr/local/hostguard/run/heartbeat.tick
775    hostwatch           5   0 /proc/1659/stat
775    hostwatch           5   0 /sys/devices/system/cpu/online
775    hostwatch           5   0 /usr/local/hostguard/run/restart.conf
775    hostwatch           5   0 /proc/meminfo
670    irqbalance          7   0 /proc/irq/affinity_hint_notify
670    irqbalance          7   0 /proc/irq/affinity_hint_notify
775    hostwatch           5   0 /proc/775/stat
775    hostwatch           5   0 /proc/804/stat
775    hostwatch           5   0 /usr/local/hostguard/run/heartbeat.tick
775    hostwatch           5   0 /proc/1659/stat
775    hostwatch           5   0 /sys/devices/system/cpu/online
775    hostwatch           5   0 /usr/local/hostguard/run/restart.conf
775    hostwatch           5   0 /proc/meminfo

配置环境变量

为保证可以更方便使用bcc命令,将对应路径加入/etc/profile文件内。

echo "export PATH='/usr/local/bcc/tools:$PATH'" >> /etc/profile

<think>嗯,用户遇到了blktrace工具报错"16/Device or resource busy"的问题,需要查找原因和解决方法。这个错误在Linux块设备跟踪中比较常见,需要从多个角度分析。 用户可能是系统管理员或开发人员,正在调试存储性能问题。ta直接给出了具体错误代码,说明已经有一定技术背景,但可能对底层资源冲突机制不太熟悉。情绪上应该比较着急,因为工具无法使用阻碍了工作进度。 首先想到错误16对应Linux系统调用的EBUSY错误码,这意味着设备被其他进程独占占用。常见场景包括: - 设备已被挂载为文件系统($mount$命令可查) - LVM逻辑卷处于活动状态($lvs$命令) - 设备被加密模块占用($cryptsetup status$) - 设备被dd或fio等工具锁定 需要指导用户先确认设备状态: 1. 用$lsblk$查看设备挂载点 2. 检查LVM卷组是否激活 3. 查看$dmsetup$信息 4. 用$lsof$或$fuser$查找占用进程 如果是挂载点导致的问题,临时解决方法有: - 卸载文件系统(生产环境需谨慎) - 使用回环设备创建镜像文件 - 改用blktrace的$--no-defer$选项强制追踪 对于LVM占用的情况,可能需要临时停用卷组。还要注意内核版本差异——较新的内核可能通过$CONFIG_BLK_DEV_IO_TRACE$控制追踪权限。 用户可能还需要替代工具建议,比如用BPF的biosnoop或sysdig,这些工具不需要独占访问设备。最后要提醒数据操作风险,避免造成系统崩溃。 需要把这些解决方案按优先级排序,从最安全的检测步骤开始,逐步到需要更高权限的操作。特别强调生产环境中卸载磁盘的危险性,避免用户误操作。</think>blktrace 工具报错 "error 16: Device or resource busy" 的根本原因是目标块设备**已被其他进程或内核组件独占占用**,导致 blktrace 无法获取对该设备的排他性访问权限。以下是详细分析和解决方法: --- ### **原因分析** 错误码 `16` 对应 Linux 系统错误 `EBUSY`,常见于以下场景: 1. **设备已挂载文件系统** 若设备(如 `/dev/sdb1`)已挂载到目录(如 `/mnt/data`),文件系统会锁定设备,阻止 blktrace 访问。 2. **LVM 逻辑卷处于活动状态** 设备被 LVM 卷组占用(如 `/dev/mapper/vg0-lv0`),或被 `dm` 设备映射层控制。 3. **设备被加密模块占用** 使用 `dm-crypt` 加密的设备(如 `/dev/mapper/cryptroot`)会独占底层物理设备。 4. **其他工具占用设备** 如 `dd`、`fio`、`fsck` 等正在读写设备,或内核线程(如 swapd)持续访问。 --- ### **解决方法** #### 1. **检查设备占用状态** ```bash # 查看设备挂载点 mount | grep /dev/sdX lsblk /dev/sdX # 检查 LVM 状态 lvs # 列出逻辑卷 dmsetup info /dev/mapper/<name> # 查看 dm 设备详情 # 查找占用进程 lsof /dev/sdX # 列出使用该设备的进程 fuser -v /dev/sdX # 显示进程 PID ``` #### 2. **释放设备占用** - **卸载文件系统**(**生产环境谨慎操作!**): ```bash umount /dev/sdXY # 卸载分区 ``` - **停用 LVM 卷**: ```bash lvchange -an /dev/vg_name/lv_name # 停用逻辑卷 ``` - **关闭加密设备**: ```bash cryptsetup close /dev/mapper/crypt_device ``` - **终止占用进程**: ```bash kill -9 $(fuser /dev/sdX 2>/dev/null | awk '{print $1}') ``` #### 3. **使用替代追踪方法** - **追踪未挂载的物理设备**: 对**未分区**的物理磁盘(如 `/dev/sdb` 而非 `/dev/sdb1`)进行追踪: ```bash blktrace -d /dev/sdb ``` - **通过回环设备追踪镜像文件**: 创建磁盘镜像文件并挂载为回环设备: ```bash dd if=/dev/zero of=test.img bs=1G count=10 losetup -fP test.img # 关联到回环设备(如 /dev/loop0) blktrace -d /dev/loop0 # 追踪回环设备 ``` - **使用 `--no-defer` 选项**(内核 4.17+): 强制追踪,但可能丢失部分事件: ```bash blktrace --no-defer -d /dev/sdX ``` #### 4. **内核配置检查** 若使用旧内核(<4.17),确认启用 `CONFIG_BLK_DEV_IO_TRACE`: ```bash grep CONFIG_BLK_DEV_IO_TRACE /boot/config-$(uname -r) ``` 若未启用,需重新编译内核或升级系统。 --- ### **替代工具推荐** 若无法释放设备,可尝试以下无侵入式工具: 1. **BPF 工具**: ```bash sudo biosnoop # 使用 eBPF 跟踪块 I/O(需安装 bcc-tools) ``` 2. **SystemTap**: ```bash sudo stap -e 'probe ioblock.request { printf("dev=%d, sector=%d\n", dev, sector) }' ``` 3. **sysdig**: ```bash sudo sysdig -c topfiles_bytes # 监控文件读写 ``` --- ### **关键注意事项** - **数据安全**:卸载设备或停用 LVM 可能导致服务中断,务必在测试环境操作。 - **权限要求**:所有命令需 `root` 权限执行。 - **内核版本**:`--no-defer` 选项仅支持内核 4.17+[^1]。 > **示例流程**: > 若设备 `/dev/sdb1` 挂载至 `/data`: > ```bash > umount /data # 卸载 > blktrace -d /dev/sdb1 # 执行追踪 > mount /dev/sdb1 /data # 完成后重新挂载 > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值