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 도구의 기능을 설정하는 방법은 무엇입니까?

리눅스 배포판: 우분투 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

이 질문은 2년이 지났지만 어쨌든 대답하는 것이 도움이 될 것이라고 생각했습니다.

A에게도 비슷한 문제가 있었는데, 그게 /usr/bin/perf쉘 스크립트라는 걸 알아차렸어요.

$ 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

관련 정보