바이너리가 항상 cgroup에서 실행되도록 설정

바이너리가 항상 cgroup에서 실행되도록 설정

특정 경로에 있는 바이너리가 항상 특정 cgroup의 일부로 실행되도록 하고 싶습니다. 지금까지 내가 찾은 모든 것은 특별한 명령을 통해 바이너리를 실행하는 것과 관련이 있습니다.(예: AND systemd-run또는 AND cgexec). 바이너리를 호출하는 가능한 모든 방법을 찾는 것은 정확히 내가 원하는 것이 아닙니다.(터미널을 통해, DE 실행 패널을 통해, 자동 시작을 통해...)이를 수정하는 것은 어려운 작업입니다.

어떻게든 AppArmor나 SELinux를 cgroup과 결합해야 한다고 생각하는데, 이를 수행하는 방법에 대한 설명을 찾을 수 없습니다.


배경: 업무용 노트북에서 가끔 스왑 폭풍이 발생합니다. 나는 위험을 감수하고 시스템을 조정하려고 했습니다. 다음과 같은"스왑 방어"블로그 게시물 저는 몇 가지 실험을 수행한 결과 적어도 zswap 및 제 작업 흐름에서는 HDD에서도 vm.swappiness = 100low보다 더 나은 것으로 나타났습니다. vm.swappiness = 10한동안 사용한 후 이상한 점을 발견했습니다. 아침에 한 번만 사용하고 나머지 시간에는 백그라운드에서 유휴 상태로 앉아 있던 Skype 프로세스가 0으로 두 번의 스왑 스톰을 성공적으로 통과했습니다.(영!)SWAP의 킬로바이트. 세 번째 교환 폭풍에서만 Skype가 약간의 이익을 얻었습니다.(PSS 등 다른 프로세스와 비교)6개의 프로세스를 각각 SWAP에 넣습니다. 이것은 놀라운 행동이고 제가 좋아하지 않는 행동입니다. 저는 Skype가 97%의 시간을 "온라인" 상태에서만 사용하기 때문에 재활용의 첫 번째 희생자 중 하나가 되기를 바랍니다.

동시에 i3 및 Plasma와 같은 다른 중요한 프로세스에 의한 재활용 가능성을 줄이고 싶다는 생각도 했습니다.

cgroups는 이 기사에서 언급한 것과 memory같은 다양한 후크를 제공합니다 . memory.low그래서 시스템의 다양한 프로세스를 조정하는 데 사용하고 싶습니다. 하지만 바이너리가 터미널에서 실행되는지, run 을 통해 실행 rofi되는지, 아니면 다른 방식으로 실행 되는지에 관계없이 작동하는지 확인하고 싶습니다 .

해커로서 나는 원본 실행 파일을 실행하여 관심 있는 바이너리를 래퍼 스크립트로 바꿀 수 있습니다 systemd-run. 하지만 다음 업데이트에서는 덮어쓰게 될 것입니다. 이것은 분명히 해킹입니다.

답변1

AppArmor와 SELinux는 모두 LSM 모듈입니다. 그들은 cgroup에 대해 모릅니다. 이 목적으로는 사용할 수 없습니다.

IMHO, 래퍼 방법을 사용하는 것이 가장 좋습니다.

래퍼를 ~/bin디렉터리에 넣고 해당 디렉터리를 PATH환경 변수에 먼저 넣을 수 있습니다. 그런 다음 래퍼에서 바이너리의 전체 파일 경로를 사용해야 무한 루프를 피할 수 있습니다. 이렇게 하면 상대 바이너리 이름을 사용하고 이를 따르는 모든 도구가 PATH래퍼를 실행합니다. 그러나 .desktop이는 래퍼를 사용하기 위해 파일을 조정해야 할 수도 있음을 의미하기도 합니다 . 래퍼는 종종 실행 파일의 전체 파일 경로를 사용하기 때문입니다.

래퍼를 정말로 피하고 싶다면 실행 중인 프로세스를 모니터링하고 기준과 일치하는 프로세스를 대상 cgroup으로 이동하는 스크립트를 작성해야 합니다. 나는 이 접근 방식이 래퍼 접근 방식보다 더 해킹적이라고 생각합니다.

관련 정보