如何在 perf 上设置功能 (setcap)

如何在 perf 上设置功能 (setcap)

我想使用 perf 实用程序。我按照说明设置了一个特权用户组,这些用户被允许无限制地执行性能监控和可观察性(如下所示:https://www.kernel.org/doc/html/latest/admin-guide/perf-security.html)。我添加了该组并限制了不在该组中的用户的访问权限。在为 perf 工具分配功能时,我开始遇到问题:

setcap cap_sys_admin,cap_sys_ptrace,cap_syslog=ep perf

我收到无效参数错误说

fatal error: Invalid argument
usage: setcap [-q] [-v] [-n <rootid>] (-r|-|<caps>) <filename> [ ... (-r|-|<capsN>) <filenameN> ]

Note <filename> must be a regular (non-symlink) file.

但跑步stats perf给了我这个

  File: ./perf
  Size: 1622        Blocks: 8          IO Block: 4096   regular file
Device: 10307h/66311d   Inode: 35260925    Links: 1
Access: (0750/-rwxr-x---)  Uid: (    0/    root)   Gid: ( 1001/perf_users)
Access: 2021-12-03 13:08:48.923220351 +0100
Modify: 2021-11-05 17:02:56.000000000 +0100
Change: 2021-12-03 12:31:49.451991980 +0100
 Birth: -

这表明该文件是常规文件。可能是什么问题呢?如何设置 Perf 工具的功能?

Linux发行版:Ubuntu 20.04

编辑:最后 20 条输出行strace setcap cap_sys_admin,cap_sys_ptrace,cap_syslog=ep perf

munmap(0x7f825054c000, 90581)           = 0
prctl(PR_CAPBSET_READ, CAP_MAC_OVERRIDE) = 1
prctl(PR_CAPBSET_READ, 0x30 /* CAP_??? */) = -1 EINVAL (Invalid argument)
prctl(PR_CAPBSET_READ, 0x28 /* CAP_??? */) = 1
prctl(PR_CAPBSET_READ, 0x2c /* CAP_??? */) = -1 EINVAL (Invalid argument)
prctl(PR_CAPBSET_READ, 0x2a /* CAP_??? */) = -1 EINVAL (Invalid argument)
prctl(PR_CAPBSET_READ, 0x29 /* CAP_??? */) = -1 EINVAL (Invalid argument)
brk(NULL)                               = 0x55de3e858000
brk(0x55de3e879000)                     = 0x55de3e879000
capget({version=_LINUX_CAPABILITY_VERSION_3, pid=0}, NULL) = 0
capget({version=_LINUX_CAPABILITY_VERSION_3, pid=0}, {effective=0, permitted=0, inheritable=0}) = 0
capget({version=_LINUX_CAPABILITY_VERSION_3, pid=0}, NULL) = 0
capset({version=_LINUX_CAPABILITY_VERSION_3, pid=0}, {effective=1<<CAP_SETFCAP, permitted=0, inheritable=0}) = -1 EPERM (Operation not permitted)
dup(2)                                  = 3
fcntl(3, F_GETFL)                       = 0x2 (flags O_RDWR)
fstat(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0x1), ...}) = 0
write(3, "unable to set CAP_SETFCAP effect"..., 72unable to set CAP_SETFCAP effective capability: Operation not permitted
) = 72
close(3)                                = 0
exit_group(1)                           = ?
+++ exited with 1 +++

答案1

我也遇到过这种情况,并且能够通过libcap从源代码构建和安装最新版本来使其正常工作。这可能不是最好的解决方案,但它对我有用。

libcap-2.53

$ git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/morgan/libcap
$ cd libcap
$ git checkout libcap-2.53
$ make
$ make test
$ make sudotest
$ sudo make install

我在安装前进行了测试以确认一切正常。

安装完成后,我就可以运行中列出的命令性能安全文档如预期。

答案2

这个问题已经有两年了,但我认为无论如何回答可能会有用。

A 也有类似的问题,我注意到那/usr/bin/perf是一个 shell 脚本。

$ file /usr/bin/perf
/usr/bin/perf: Bourne-Again shell script, ASCII text executable

它称为/usr/lib/linux-tools/6.5.0-26-generic/perf(我的内核版本是 6.5.0-26-generic),这是/usr/lib/linux-hwe-6.5-tools-6.5.0-26/perf.当我调用setcap真正的可执行文件时,它终于起作用了。

$ sudo setcap cap_sys_admin,cap_sys_ptrace,cap_syslog=ep /usr/lib/linux-hwe-6.5-tools-6.5.0-26/perf

相关内容