Ubuntu
如何在 perf 上設置功能(setcap)
我想使用 perf 實用程序。我按照說明設置了一組特權使用者,這些使用者可以不受限制地執行性能監控和可觀察性(如此處的說明:https ://www.kernel.org/doc/html/latest/admin-guide/perf-安全.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 +++
我也遇到過這種情況,並且能夠通過
libcap
從原始碼建構和安裝最新版本來使其工作。這可能不是最好的解決方案,但它對我有用。$ 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
在安裝之前,我進行了測試以確認一切正常。
安裝後,我可以按預期執行perf-security文件中列出的命令。