응용 프로그램 수준에서 스와핑을 비활성화 할 수 있습니까?


10

현재 gnupg와 함께 썬더 버드를 사용하여 암호화 된 이메일을 읽습니다. 스와핑 동작을 올바르게 이해하면 해독 된 전자 메일을 포함하는 메모리 페이지가 스왑 아웃되고 나중에 이론적으로 복구 될 수있는 하드 디스크에 흔적이 남을 수 있습니다.

중요한 파일을 사용하는 동안 암호화 된 스왑 파일을 사용하거나 전체적으로 스와핑을 비활성화하는 것이 가능하지만 성능에 영향을 미치고 잊어 버릴 수 있으며 루트 권한이 필요합니다.

특정 파일이나 프로그램을 스왑하지 않도록 표시 할 수 있습니까? 루트 액세스 권한이 없더라도? 기술적으로 순진한 사용자에게 배포 할 수 있고 메모리 내용이 디스크로 스왑되지 않는 응용 프로그램을 작성할 수 있습니까?


2
관련 본질적으로 당신이 스왑하지 않을 것이라고 그래서 cgroup에, 조정 swappiness를 만들 것이고, cgexec그것으로 썬더 버드. 여전히 루트 액세스 권한이 필요하지만 관리자 수준의 해결 방법입니다. 자신의 응용 프로그램을 개발하는 경우 mlock사용 합니다.
Bratchley

1
GPG가 이미 전화했을 수 있으므로 mlock확인해야합니다.
Steve Wills

감사! 나는 아직 cgroup에 대해 몰랐다. 그들은 흥미있는 것처럼 들린다.
user54114

1
@SteveWills 않습니다. 그러나 썬더 버드에 대해서는 확실하지 않으므로 해독 된 결과가 표시됩니다.
user54114

@Bratchley, 당신은 대답에 넣을 수 있습니까? 나는 당신이 cgroups에 대해 swappiness를 설정할 수 있다는 것을 몰랐습니다.
frostschutz

답변:


9

의견에서 cgroup을 만들고 memory.swappiness0으로 설정 하고 (스왑을 최소화하기 위해) 응용 프로그램을 그 내부에서 실행하는 것이 좋습니다. 그렇게했다면 물리적 메모리가 너무 부족하여 해당 cgroup의 프로그램 페이지를 스와핑하는 것이 충분한 물리적 메모리를 사용할 수있는 유일한 방법이 아닌 한 응용 프로그램 이 스왑되지 않을 입니다.

RHEL 6.5에서이를 수행하려면 다음을 수행하십시오.

  • libcgroup패키지가 설치되어 있는지 확인하십시오 . 그러면 cgcreate및과 같은 사용자 공간 도구에 액세스 할 수 있습니다 cgexec.

  • cgconfigcgroup 구성에 대한 변경 사항이 재부팅간에 지속적으로 유지되도록 서비스를 시작하고 활성화하십시오 . RHEL에서이 서비스는 필요한 파일 시스템을 /cgroup트리 아래에 마운트해야합니다 .

  • 로 cgroup 만들기 cgcreate -g memory:thunderbird

  • 이 그룹에서 swappiness를 0으로 설정하십시오. cgset -r memory.swappiness=0 thunderbird

  • 서비스에 cgsnapshot -s > /etc/cgconfig.conf대한 업데이트 된 영구 구성을 저장하는 데 사용 합니다 cgconfig(지금까지의 모든 변경은 런타임 변경이었습니다). 기본 구성 파일을 어딘가에 저장하고 영구 구성하기 전에 한 번만 제공하는 것이 좋습니다.

  • 이제 cgroup cgexec내에서 원하는 응용 프로그램을 시작하는 데 사용할 수 있습니다 thunderbird.

    [root @ xxx601 ~] # cgexec -g 메모리 : Thunderbird LS

    anaconda-ks.cfg a.out foreman.log index.html install.log install.log.syslog node.pp sleep sleep.c SSL 빌드 스택 테스트

    [root @ xxx601 ~] #

나는이없는 thunderbird사실, 그렇지 않으면 나는 것을했을 설치. 왜 위의 형식이 엉망인지 잘 모르겠습니다.

  • 하나의 대안 cgexec은 썬더 버드를 시작 tasks하고 응용 프로그램 의 파일에 PID를 추가하는 것 입니다. 예를 들면 다음과 같습니다.

    [root @ xxx601 ~] # cat / cgroup / memory / thunderbird / tasks

    [root @ xxx601 ~] # pidof httpd

    25926 10227 10226 10225 10163 10162 10161 10160 10159 10157 10156 10155 10152 10109

    [root @ xxx601 ~] # echo 25926> / cgroup / memory / thunderbird / tasks

    [root @ xxx601 ~] # cat / cgroup / memory / thunderbird / tasks

    25926

다시 말하지만 이것은 기술적으로 스와핑을 방지하지는 않지만 응용 프로그램 자체를 수정하는 데 부족하다는 것을 언급합니다. 아마도 가장 좋은 방법 일 것입니다. 방금 스와핑 memory.memsw.limit_in_bytes없도록 강제 제어하는 ​​것이 더 직접적 인 것처럼 보였지만 문제가 완전히 해결된다고 편안하게 말할 수는 없었습니다. 즉, 이것을 돌봐야 할 수도 있습니다.


실제 대답은 mlock이러한 종류의 문제를 해결하기 위해 응용 프로그램에 민감한 정보를 갖는 것 입니다. 그러나 Thunderbird와 같은 응용 프로그램을 기꺼이 내기 위해 기꺼이하지만 그에 대해 언급 할 내부 정보는 충분하지 않습니다.


@Gilles가 언급 한 다른 모든 fs를 처리하기 위해 d 네임 스페이스 chroot에서도 원할 것이라고 생각합니다. 그렇게하면 최종 성능 효과가 암호화 된 스왑보다 낫습니다. unshare--mount
mikeserv

관리자가 너무 많은 작업을 수행 할 수 있다는 것은 의심 할 여지가 없습니다. 궁극적으로 응용 프로그램은 이러한 종류의 작업을 고려해야하므로 관리자 수준의 컨트롤이 매우 정교해질 수 있습니다.
Bratchley

memory.swappiness=0당신이 생각한다고 해도 임의의 프로세스에 무슨 일이 일어나는지 밝혀 내기 위해 코어 덤프를 여전히 검사 할 수 있습니까? 모르겠지만 궁금합니다.
mikeserv

1
예, 그러나 mlock이있는 응용 프로그램을 포함하여 거의 모든 것이 사실이지만 그렇지 않습니다 MADV_DONTDUMP. 그러나 대부분의 경우 민감한 정보 교환에 대해 걱정하는 사람들은 랩톱이 도난 당하고 교체 영역이 빗질되는 것에 대해 걱정합니다. 코어 덤프를 시작하는 시점에서 시스템은 이미 완전히 손상되었습니다.
Bratchley

5

응용 프로그램은 메모리를 잠글 수 있으므로 스왑 할 수 없습니다.

mlock, munlock, mlockall, munlockall - lock and unlock memory

그래도 외부에서 영향을 줄 수있는 방법을 모르겠습니다. 이를 사용하려면 응용 프로그램을 작성해야합니다. 메일의 경우 일반적으로 첨부 파일 등을보기위한 외부 프로그램도 포함되므로 특히 어려울 수 있습니다.

또한 memlock을 사용하더라도 스왑 파티션에서 종료 될 가능성이 있습니다. 스왑 분할을 사용하면 스왑 이외의 기본 설정에 관계없이 모든 메모리를 디스크에 기록합니다.

우선 전체 디스크 암호화를 사용하는 것이 더 쉽습니다.


5

예, 응용 프로그램은 mlock시스템 호출로 일부 메모리가 스왑 아웃되는 것을 방지 할 수 있습니다 . 그러나 이것은 귀하의 경우에는 실제로 유용하지 않습니다.

기밀 데이터는 응용 프로그램 메모리에만있는 것이 아닙니다. 그것은 다양한 장소 (임시 파일의 끝 /tmp, /var/spool등). 썬더 버드 자체가 해독 된 이메일을 표시하고 있으므로 RAM에도 잠금을 설정해야합니다.

당신이 당신의 디스크가 기밀 파일의 흔적을 포함하지 않도록하려는 경우, 당신은 모든뿐만 아니라 특히 임시 파일의 잠재적 인 위치를 (스왑을 암호화 할 필요가 /tmp대부분이 tmpfs를하지 않은 경우, 그리고 /var뿐만 아니라, 물론 홈 디렉토리에).

암호화 된 스왑이 성능에 미치는 영향은 크지 않습니다. 암호화는 디스크 I / O보다 훨씬 빠릅니다.


a chroot와 네임 스페이스 컨테이너 swapoff가 암호화 된 스왑의 더 나은 대안 인 것처럼 보입니다 . 아주 좋은 대답-다른 대답은 다른 파일 시스템 효과를 언급하지 않았습니다. 나 자신도 가지고 swap있지 않습니다-RAM이 4GB 미만인 컴퓨터는 소유하지 않으며 사용하면 아무런 이점이 없습니다. 이것의 사용은 suspend가 관련된 기계들에 대해서만 실용적이며 쉽게 스크립트됩니다.
mikeserv

0

높은 우선 순위를 시작하는 시작 스크립트를 예에 응용 프로그램 프로세스의 우선 순위를 변경하여 시작하는 것이 좋습니다 것입니다 경우 난 그냥 생각하고 nicerenice와 I / O 우선 순위의 변화에 있음을 ionice다음 것은 무엇을보고 발생합니다.

-20애플리케이션 프로세스를 언제 스왑해야하는지 결정하여 OS가 애플리케이션을 최상의 상태로 유지하도록하는 방식으로 애플리케이션을 우선 순위가 가장 높은 수준으로 '좋게'설정할 수 있습니다 .

그러나 더 많은 제어와 세분성을 원한다면 다른 사람들이 제안 cgroups하고 설정 을 시작해야 합니다.memory.swappiness

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.