sudo 사용자는 sched_setscheduler SCHED_RR을 사용할 수 있지만 루트는 사용할 수 없는 이유는 무엇입니까?

sudo 사용자는 sched_setscheduler SCHED_RR을 사용할 수 있지만 루트는 사용할 수 없는 이유는 무엇입니까?

저는 Raspberry Pi 2에서 Arch Linux를 실행하고 있습니다.

wiringPi나는 특히 Gordon의 라이브러리를 사용하는 사용자 공간 프로그램을 가지고 있습니다 .piHiPri()기능현재 프로세스에 대해 가장 높은 우선순위를 설정해 보십시오(사용sched_setschedulerSCHED_RR패턴). 이 기능을 사용하려면 슈퍼유저 권한이 필요합니다.

Arch Linux 설치 시 루트 사용자가 기본 사용자이므로 이라는 이름의 사용자를 builder생성 sudoers하여 visudo.

내 문제는 사용자로 프로그램을 실행하면 root함수 sched_setscheduler가 "작업이 허용되지 않음"(에서 가져옴 errno)을 반환한다는 것입니다.

실행 중에 실행하면 builder"권한 거부" 메시지가 나타납니다.

sudo myProgram하지만 while being 으로 실행해 보면 모든 것이 잘 되고, 명령어로 builder우선순위가 바뀐 것을 알 수 있다 .top

root사용자의 UID가 0이 아닐 수도 있다고 생각하여 확인했지만 id -u root0이 반환되었습니다.

ls -l myProgramm-rwxr-xr-x 1 root root나는 또한 SUID 설정을 시도했지만 성공하지 못했습니다 chmod +s myProgramm.

내 프로그램을 루트로 실행 가능하게 만드는 방법에 대한 아이디어가 있습니까?

편집하다:

Gilles가 제안한 대로 실행했는데 ulimit -r모든 경우에 0( builder및 )이 반환되었습니다 root.

한 줄을 변경했습니다 /etc/security/limits.conf.* - rtprio 0

도착하다:* - rtprio 99

ulimit -r이는 예상 출력에 영향을 미치며 이제 99를 반환합니다.

그런 다음 프로그램을 다시 실행해 보았지만 root여전히 같은 Operation not permitted오류가 발생했습니다.지금더 이상 작동하지 않습니다 sudo( Operation not permitted위와 동일)... 이상합니다!

조사하는 동안 이전 설정을 복원했습니다 /etc/security/limits.conf.

답변1

저도 이 문제 때문에 고민이에요. 제 경우에는 docker 데몬이 기본 cgroup을 재구성한 것으로 나타났습니다. 결과적으로 루트 사용자의 cgroup 슬라이스는 cpu.rt_runtime_us0으로 설정됩니다. 실시간 스케줄러(RR 또는 FIFO)를 설정하려면 CPU 시간을 할당해야 합니다. 프로세스에 해당 정보가 없으면( cpu.rt_runtime_us0인 경우) "권한 거부" 메시지가 표시됩니다.

이 문제와 관련된 cgroup 및 docker에 대한 자세한 내용은 RedHat Bugzilla 버그 보고서를 참조하세요.https://bugzilla.redhat.com/show_bug.cgi?id=1467919

답변2

차이점을 설명할 수 있는 한 가지는 최대 실시간 우선순위 제한( ulimit -r)이 서로 다르다는 것입니다. 루트는 이 한도를 초과할 수 없지만 늘릴 수는 있습니다. 필요한 경우 프로그램을 실행하기 전에 제한을 확인 ulimit -r(또는 C에서) 하고 늘리십시오.getrlimit(RLIMIT_RTPRIO, …)

그래도 도움이 되지 않으면 시스템 구성보다는 프로그램에 문제가 있을 수 있습니다. 게시하다문제를 재현할 수 있는 작지만 독립적인 소스 코드, 존재하다스택 오버플로(프로그래밍은 여담이다.유닉스와 리눅스).

관련 정보