저는 Raspberry Pi 2에서 Arch Linux를 실행하고 있습니다.
wiringPi
나는 특히 Gordon의 라이브러리를 사용하는 사용자 공간 프로그램을 가지고 있습니다 .piHiPri()
기능현재 프로세스에 대해 가장 높은 우선순위를 설정해 보십시오(사용sched_setscheduler
및 SCHED_RR
패턴). 이 기능을 사용하려면 슈퍼유저 권한이 필요합니다.
Arch Linux 설치 시 루트 사용자가 기본 사용자이므로 이라는 이름의 사용자를 builder
생성 sudoers
하여 visudo
.
내 문제는 사용자로 프로그램을 실행하면 root
함수 sched_setscheduler
가 "작업이 허용되지 않음"(에서 가져옴 errno
)을 반환한다는 것입니다.
실행 중에 실행하면 builder
"권한 거부" 메시지가 나타납니다.
sudo myProgram
하지만 while being 으로 실행해 보면 모든 것이 잘 되고, 명령어로 builder
우선순위가 바뀐 것을 알 수 있다 .top
root
사용자의 UID가 0이 아닐 수도 있다고 생각하여 확인했지만 id -u root
0이 반환되었습니다.
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_us
0으로 설정됩니다. 실시간 스케줄러(RR 또는 FIFO)를 설정하려면 CPU 시간을 할당해야 합니다. 프로세스에 해당 정보가 없으면( cpu.rt_runtime_us
0인 경우) "권한 거부" 메시지가 표시됩니다.
이 문제와 관련된 cgroup 및 docker에 대한 자세한 내용은 RedHat Bugzilla 버그 보고서를 참조하세요.https://bugzilla.redhat.com/show_bug.cgi?id=1467919
답변2
차이점을 설명할 수 있는 한 가지는 최대 실시간 우선순위 제한( ulimit -r
)이 서로 다르다는 것입니다. 루트는 이 한도를 초과할 수 없지만 늘릴 수는 있습니다. 필요한 경우 프로그램을 실행하기 전에 제한을 확인 ulimit -r
(또는 C에서) 하고 늘리십시오.getrlimit(RLIMIT_RTPRIO, …)
그래도 도움이 되지 않으면 시스템 구성보다는 프로그램에 문제가 있을 수 있습니다. 게시하다문제를 재현할 수 있는 작지만 독립적인 소스 코드, 존재하다스택 오버플로(프로그래밍은 여담이다.유닉스와 리눅스).