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


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

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

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

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

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