Eu tenho algum código que usa sched_setscheduler
fromsched.h
sched_param sched;
sched.sched_priority = 70;
sched_setscheduler(getpid(), SCHED_FIFO, &sched);
No entanto, essa função falhará, a menos que eu execute o aplicativo com o sudo
. Prefiro não executar o aplicativo com root
privilégios.
Existe uma maneira de conceder a um usuário ou processo acesso a essa função sem conceder permissões de root completas?
-- Editar --
derobert deu uma ótima resposta sobre o uso de recursos. Em postinst
, eu simplesmente adiciono:
setcap cap_sys_nice+ep /path/to/myapp
O problema aqui é:
bin$ ./myapp
./myapp error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory
O programa perde a capacidade de carregar dinamicamente bibliotecas de $LD_LIBRARY_PATH
ou (no meu caso) outras bibliotecas apontadas por rpath
. Este parece ser um comportamento pretendido . Existe uma maneira de contornar isso?
Eu tentei setcap cap_setpcap+ep myapp
usar prctl(PR_CAPBSET_DROP, CAP_SETPCAP);
antes de fazer qualquer carregamento dinâmico, mas isso não parece ajudar.
Alterar seu agendador e prioridade deve precisar apenas da
CAP_SYS_NICE
capacidade; veja os privilégios e limites de recursos do sched(7) . Você provavelmente também vai querer ver a página de manual parasched_setscheduler
, que menciona sched(7).Existem algumas maneiras de fornecer essa capacidade ao seu programa; o mais fácil é provavelmente setcap :
Isso funciona de maneira semelhante ao set-user-id, mas é muito mais limitado (já que fornece apenas um recurso). Claro, CAP_SYS_NICE efetivamente dá ao programa permissão para travar o sistema (comendo todo o tempo da CPU com tarefas em tempo real).
Outras maneiras incluem usar um wrapper run-as-root (que elimina todas as outras permissões) ou elevação usando, por exemplo, RealtimeKit/PolicyKit.
(Para mais informações sobre capacidades, sugiro começar com capacidades(7) ).
Eu tenho uma solução, embora seja um pouco estranha e exponha um buraco no sistema operacional.
Durante
postinst
, eu:Então, no código, eu inicio um processo com:
O buraco que acabamos de expor é que qualquer pessoa que use esta versão
chrt
pode fazê-lo sem privilégios de administrador. Como estou executando este é um ambiente de destino muito controlado, estou bem com esse buraco, mas não o recomendaria quem não tem controle sobre seu ambiente de destino.