/ tmp와 / run의 차이점은 무엇입니까?


42

에 따르면 FHS-3.0 , /tmp임시 파일과 /run런타임 변수 데이터입니다. /run다음 부팅시 데이터 입력을 삭제해야 /tmp하지만이 프로그램은 필요하지 않지만 여전히 프로그램은 /tmp다음 프로그램 시작시 데이터를 사용할 수 있다고 가정해서는 안됩니다 . 이 모든 것이 나와 비슷합니다.

그렇다면이 둘의 차이점은 무엇입니까? 어떤 기준으로하는 프로그램에 임시 데이터를 넣어 여부를 결정해야 /tmp또는로 /run?

FHS에 따르면

프로그램의 하위 디렉토리는 /run; 이것은 하나 이상의 런타임 파일을 사용하는 프로그램에 권장됩니다.

이는 "시스템 프로그램"과 "일반 프로그램"의 구분이 기준이 아니며 프로그램 수명 (예 : 장기 실행 프로세스와 단기 실행 프로세스)도 아닙니다.

FHS에는 다음과 같은 이론적 근거가 제시되지 않았지만, 너무 늦게 장착 된 /run문제를 극복하기 위해 도입되어 /var더러운 트릭이 /var/run초기에 충분히 사용 가능하게되었습니다. 그러나 지금에 /run도입하고, FHS에 해당 설명을 주어지고, 모두가 할 수있는 명확한 이유가없는 것 /run등을 /tmp.


11
/ tmp는 임시 데이터의 * nix 표준 위치입니다. / run은 임시 데이터의 Poettering 표준 위치입니다.
Mark

이전 버전과의 호환성은 항상 이유입니다 ...
Bakuriu

답변:


16

/ run과 / tmp를 모두 가질 이유가 없습니다.

내 생각 엔 당신이 맞다. /tmp우리는 이제 기본적으로 더 이상 사용되지 않습니다 /run. 프로그램이 그렇게 할 수있는 위치에 있다면 ( 권한있는 작업 으로 설치 해야 함 ) 요즘에는 하위 디렉토리를 사용 /run합니다. 이것은 보안상의 이유입니다.

예를 들어 CUPS 인쇄 데몬은 루트로 실행되지 않지만 일반적으로 OS 패키지에서 설치됩니다. 이 패키지는 설치 /usr/lib/tmpfiles.d/cups.conf하고, systemd-tmpfiles이 액세스 할 수있는 디렉토리를 생성합니다. 디렉토리가 아래 /run에 있으므로 권한이없는 사용자 /tmp가 이름을 세계적으로 쓸 수있는 것과 달리 악의적으로 주장 할 수 없습니다 .

/run직접 사용할 수없는 "권한없는 프로그램"

실제 구별은 프로그램이 임의의 권한이없는 사용자가 자신의 사용자 ID로 실행중인 경우입니다. 그러나 /tmp권한이없는 다른 사용자가 액세스 할 수 있기 때문에 일반적으로 여전히 사용하고 싶지 않습니다 . 을 사용하는 것이 좋습니다 $XDG_RUNTIME_DIR. 일반적으로 이것은 다음과 같이 구현 /run/user/$(id -u)되므로 하위 디렉토리이기도 /run합니다. 그러나 위치는 보장되지 않습니다. 프로그램은 항상 환경 변수를 사용해야합니다.

/tmp시스템의 권한이없는 다른 사용자들 사이의 임시 협력에만 유용합니다. 이러한 임시 시스템은 악의적 인 사용자가 모든 사람을 위해 협력하고 망치는 것을 거부하기에 취약합니다. 한 가지 예는 권한이없는 사용자 talk가 유닉스 소켓을 사용하여 데몬 버전을 실행하기로 결정하는 것 입니다.

Lennart Poettering의 원본 정보

아래 Poettering의 체크리스트 /tmp는 "작은 파일"에 유용하지만 /run"통신 프리미티브"에만 사용해야한다고 주장했다 . 이 차이도 사실이라고 생각하지 않습니다. 에 대한 포스터 소년 /run이다 udev, 나는 확신 /run/udev내부 데이터베이스가 포함되어 있습니다. 일단 당신이 /run디렉토리 를 가지고 있다면 , 나는 누군가가 주장 된 구별을 따르고 다른 디렉토리를 만들고 싶어서 생각하지 않는다고 생각 합니다 /tmp. 실제로 우리는 /run요즘에 사용 합니다.

통신을 위해 세계적으로 쓸 수있는 공유 네임 스페이스 (예 : / tmp)를 사용하는 것은 항상 문제가되었습니다. 통신을 설정하려면 안정적인 이름이 필요하지만 안정적인 이름은 DoS 공격의 문을 엽니 다. 초기 부팅 중에 특정 서비스에 대해 보호 된 앱별 디렉토리를 설정하면 부분적으로 문제를 해결할 수 있지만 (X11에서와 같이) 모든 패키지 설치 후 재부팅 한 경우에만 올바르게 작동하므로 문제를 부분적으로 만 수정합니다.

...

Fedora 17의 또 다른 Fedora 기능은 다양한 서비스의 / tmp 네임 스페이스를 격리함으로써 더 많은 시스템 서비스의 보안을 강화하기 위해 / tmp의 의미를 변경했습니다.

...

/ tmp는 더 이상 공유 네임 스페이스 일 필요가 없으므로 일반적으로 통신 기본 요소의 위치로 적합하지 않습니다.

...

[/ run]은 tmpfs임을 보증하므로 부팅시 자동으로 플러시됩니다. 그 이상으로 자동 정리가 수행되지 않습니다.

...

다음은 Linux 응용 프로그램 개발자가 올바른 디렉토리를 선택하도록 제안하는 대략적인 지침입니다.

  1. 소켓 (또는 다른 통신 기본 요소)을 넣을 장소가 필요하고 코드가 특권을 실행합니다. / run 아래의 하위 디렉토리를 사용하십시오. (또는 추가 호환성을 위해 / var / run 아래에 있습니다.)
  2. 소켓 (또는 다른 통신 프리미티브)을 넣을 장소가 필요하고 코드가 권한없이 실행됩니다. $ XDG_RUNTIME_DIR 아래의 하위 디렉토리를 사용하십시오.
  3. 더 큰 다운로드 및 다운로드를 진행하고 권한이없는 상태로 실행하려면 장소가 필요합니다. $ XDG_DOWNLOAD_DIR을 사용하십시오.
  4. 지속적이고 권한이없는 캐시 파일을 넣을 장소가 필요합니다 : $ XDG_CACHE_HOME을 사용하십시오.
  5. 위의 어느 것도 적용되지 않으며 지속성이 필요없는 작은 파일을 배치해야합니다. / tmp에 폴백으로 $ TMPDIR을 사용하십시오. 그리고 mkstemp ()와 mkdtemp ()를 사용하십시오.
  6. 그렇지 않으면 / var / tmp의 폴 백과 함께 $ TMPDIR을 사용하십시오. mkstemp () / mkdtemp ()도 사용하십시오.

위의 규칙은 당사에서만 제안합니다. 이 규칙은 우리가이 주제에 대해 알고있는 모든 것을 고려하고, 현재와 미래의 배포에서 볼 수있는 한 문제를 피합니다. 이 규칙을 따르도록 프로젝트를 업데이트하고 새 코드를 작성할 때 명심하십시오.

우리가 강조하고 싶은 한 가지는 / tmp 및 / var / tmp가 실제로 사용 사례에 적합하지 않은 것보다 더 자주 있다는 것입니다. 이러한 디렉토리의 올바른 사용법이 있지만 실제로는 다른 디렉토리가 더 나은 곳일 수 있습니다. 따라서 다른 옵션을 고려하십시오. 그러나 / tmp 또는 / var / tmp를 사용하는 경우 최소한 mkstemp () / mkdtemp ()를 사용해야합니다.

우리 /tmp는 위에서 설명한 것처럼 X 윈도우 시스템에서 사용되는 레거시 소켓을 사용하지 않습니다. 나는 잘못 읽었다 tmpfiles.d/x11.conf. 그것이 협력에 의존하는 것처럼 보입니다 :). 서비스 거부가 발생할 수있는 최악의 코드와 같이 코드가 감사되었다고 가정합니다.


8
이 대답은 모든 종류의 잘못입니다.
R ..

@R .., 그것을 확장 할까?
와일드 카드

예, 나는 이미 대답했습니다. (의견으로 시작했지만 더 많은 답이 있다는 것을 깨달았습니다.)
R ..

현재 답변의 주요 약점은 기술적 으로 XDG_RUNTIME_DIR의 올바른 처리가 모든 * nix ( "유사한 기능을 가진 대체 디렉토리로 폴백")로 이식 할 수 있어야한다는 것입니다. 이것이 실제로 의미하는 것은 매우 모호합니다. 휴대용 유틸리티 프로그램의 경우 잘 정의 된 표준을 사용하는 것이 좋습니다 /tmp( "이 API를 사용하는 유일한 API는 mkstemp (), mkdtemp () (및 친구) 여야 완전히 안전해야 함").
sourcejedi

대답은 또한 일반적인 경우입니다 : /var/run시스템 전체 (예 : 로컬 데이터베이스와 통신하기 위해)는 /tmp/이제 사용자마다 생성 됩니다 . 역사적으로, / tmp의 할당량도 다르게 설정되었습니다. 그리고 그 의미 론적 사용의 구별도 중요하다는 답은 그리워합니다 .
Giacomo Catenazzi

23

디렉토리 /tmp/usr/tmp(나중에 /var/tmp)는 모든 사람과 모든 사람을위한 투기장이었습니다. 이 디렉토리의 파일에 대한 유일한 보호 메커니즘은 파일의 삭제 또는 이름 변경을 소유자에게 제한하는 고정 비트입니다. marcelm이 의견에서 지적했듯이 원칙적으로 누군가가 서비스에서 사용하는 이름으로 파일을 만들지 못하게하는 것은 없습니다 (예 : nginx.pid또는 sshd.pid). (실제로 시작 스크립트는 그러한 가짜 파일을 먼저 제거 할 수 있습니다.)

/run로크, 소켓, pid 파일 등과 같은 수명이 긴 서비스의 비 영구 런타임 데이터를 위해 설립되었습니다. 일반 사용자가 쓸 수 없으므로 서비스 런타임 데이터 /tmp를 정리 및 정리 작업 에서 쉴드합니다 . 실제로 : 내가 실행하는 두 개의 배포판 (pun 의도하지 않은)은 755에 대한 권한을 가지고 /run있고 /tmpand /var/tmp(그리고 /dev/shm그 문제에 대해서는) 1777을 가지고 있습니다.


3
서비스 런타임 데이터를 엉망으로 분리하는 것만으로도 가능합니다./tmp 또한 전체 데이터를 처리하는 다양한 정리 작업에서 데이터를 안전하게 보호 할 수 있습니다 /tmp.
사토 카츠라

권한에 대한 정보를 주셔서 감사합니다. 그러나 FHS에 따르면 "프로그램에는 / run의 하위 디렉토리가있을 수 있습니다. 이는 둘 이상의 런타임 파일을 사용하는 프로그램에 권장됩니다." -이것은 "긴 수명의 서비스"기준과 제한된 권한으로 인해 프로그램이 하위 디렉토리를 만들 수 없다는 점과 모순되는 것 같습니다.
Dirk Herrmann

@DirkHerrmann 아닙니다. 에서보세요 /run에 의해 발생하는 복잡한 (음 ...) 디렉토리 구조 체크 아웃 udev, udisk등 나는 것은이 특정 문제에 대한 전문가가 아니지만, 내가 설정 한 모든 업 (수퍼 유저로 실행되는) 부트 스크립트를 같아요.
카운터 모드

2
"/ run은 기술적으로 필요하지 않습니다. 서비스 런타임 데이터를 / tmp의 엉망으로부터 분리하기 만하면됩니다." -권한이없는 프로세스는 시스템 서비스가 사용하고자하는 이름을 쪼 그릴 수 없습니다. nginx가 사용하기를 원 /tmp/nginx.pid하지만 일부 잘못된 동작으로 인해 이미 존재합니다. /run/쓰기 권한을 요구하여이를 방지합니다.
marcelm

18

/tmp임시 파일 및 디렉토리 작성 위치입니다. 네임 스페이스에 대한 소유권을 가진 사람이 없기 때문에 "잘 알려진 이름"(즉, 다른 프로세스가 이름을 전달하지 않아도 알 수있는 이름)을 저장하는 데 사용할 수 없습니다. 누구나 파일을 만들 수 있습니다. 따라서 일반적으로 입력 또는 출력과 같은 파일 (예 : 파이프 등은 아님)이 필요한 유틸리티가있는 경우 이름을 전달하는 한 (임의로 생성 된) 이름이 작동합니다.

역사적으로 (X와 같은) 일부는이 원칙을 위반하고에 잘 알려진 이름 (예 :)을 넣었 .X11-unix습니다 /tmp. 이것은 물론 버그이며 모든 사용자가 원하는 이름으로 파일을 만들기 위해 경주함으로써 단순히 필요한 서비스를 DoS 할 수 있습니다. 그러한 것들은 /run(또는 /var/runFreedesktop.org 개정주의에 가입하지 않은 경우) 에 속합니다 . 물론 글로벌 네임 스페이스에서 잘 알려진 이름을 사용하지 않고 경로 이름을 전달하도록 수정하는 것이 더 좋습니다.


"임시 파일"에 대한 추가 정의에 감사드립니다. 비록 "경로명을 지나치다"라고 생각하지는 않지만 조정 점을 설정하는 방법을 설명합니다. 즉, 일반적으로 환경 변수를 사용합니다. 소켓과 파이프가 충분하지 않은 것처럼 보입니다 (일반적으로 사용). (부분적으로 동일한 dbus 소켓을 통해 많은 것들이 실행되기 때문에). 프로그램 기본적으로 하드 코딩 된 경로 로 설정 되지 않은 경우 환경을 설정하는 것이 성가신 것 같습니다 . 시스템 .socket파일에 새로운 키를 추가 할 수는 있지만 전체 디렉토리 나 새로 설치된 서비스에는 도움이되지 않습니다
sourcejedi

2
/run/그 자체가 FHS에 의해 채택되었으므로 fd.o와 어떤 관련이 있는지 알 수 없습니다. 우리가 진정으로 불평하는 것이 아닌 한, 둘 다에 기여한 불특정 개발 노력이 아닙니다.
sourcejedi

나는 여기에 초기 답변이 쓰여진 질문에 대한 최선의 답변이라고 생각합니다. _ 소프트웨어가 예를 들어 아래의 전용 디렉토리에 대한 쓰기 액세스 권한을 가진 경우 /run, /tmp더 많은 파일로 공유 디렉토리를 어지럽히 지 않도록 선택할 수 있습니다.
sourcejedi

"fd.o"는 무엇입니까?
TRiG

7

파일 시스템 계층 표준에 따르면

  • /run 런타임 변수 데이터, 즉 재부팅 후 실행중인 시스템에 대한 정보
  • /tmp 임시 파일의 일반적인 위치입니다.

따라서 /run프로그램에 의해 생성 된 임시 파일은로 들어가는 동안 데몬 상태, 로그인 한 사용자, 마운트 된 이동식 장치 등과 관련된 모든 것이 들어갑니다 /tmp.

편집 : 아래 주석에서 @JdeBP가 지적한 것처럼,

FHS는 /tmp"오래된"파일 을 정기적으로 제거하는 cron 작업의 기존 설정과 같은 것을 허용 합니다. 의도 된 메커니즘이 없습니다 /run. 그러므로 어떤 프로그램을 사용하더라도 어떤 프로그램의 수명을 기대할 수 있는지에 대한 극한의 제한이 있습니다 /tmp. 프로그램은 파일 /run이 지속적으로 가동되는 시스템 에서 더 오래 살기를 기대할 수 있지만 더 많은 파일 을 정리해야합니다.


4
이 답변이나 다른 답변에서 지적되지 않았지만 FHS에 언급되어 있으며 다음과 같이 답변을 개선하고 싶을 수도 /tmp있습니다. 의도 된 메커니즘이 없습니다 /run. 그러므로 어떤 프로그램을 사용하더라도 어떤 프로그램의 수명을 기대할 수 있는지에 대한 극한의 제한이 있습니다 /tmp. 프로그램은 파일 /run이 지속적으로 가동되는 시스템 에서 더 오래 살기를 기대할 수 있지만 더 많은 파일 을 정리해야합니다.
JdeBP

1
프로세스가 종료 되 자마자 사라지거나 (로빙 가비지 데몬에 의해 삭제되도록 허용 된) 프로세스 별 디렉토리를 갖는 것이 좋을 것입니다.
Omnifarious

1
@Omnifarious 이제 RuntimeDirectory = :-) 를 사용하여 시스템 서비스에 대한 동작을 얻을 수 있습니다 .
sourcejedi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.