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

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

~에 따르면FHS-3.0, /tmp임시 파일용, /run런타임 변수 데이터용. /run의 데이터는 다음에 시작될 때 삭제되어야 하며 에서는 필요하지 않습니다 /tmp. 그러나 프로그램은 다음에 프로그램이 시작될 때 의 데이터를 /tmp사용할 수 있다고 여전히 가정할 수 없습니다. 이 모든 것이 나와 매우 유사한 것 같습니다.

그렇다면 둘 사이의 차이점은 무엇입니까? 프로그램은 어떤 기준에 따라 임시 데이터를 넣을지 /tmp빼낼 지를 결정해야 합니까 /run?

FHS 데이터에 따르면:

프로그램에는 하위 디렉토리가 있을 수 있습니다 /run. 이는 여러 런타임 파일을 사용하는 프로그램에 권장됩니다.

이는 "시스템 프로그램"과 "일반 프로그램"의 구별이 표준이 아니며 프로그램의 수명 주기(예: 장기 실행 프로세스 대 단기 실행 프로세스)도 아니라는 것을 의미합니다.

FHS에서는 다음과 같은 근거를 제시하지 않지만, 너무 늦게 설치하여 더티 트릭을 조기에 제공해야 하는 문제 /run를 극복하기 위해 도입되었습니다 . 그러나 이제 및 가 도입되고 FHS에 설명되어 있으므로 및 을 둘 다 가질 명확한 이유가 없는 것 같습니다 ./var/var/run/run/run/tmp

답변1

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

/run잠금, 소켓, PID 파일 등과 같은 수명이 긴 비지속적 런타임 데이터를 제공하도록 구축되었습니다. 대중이 쓸 수 없기 때문에 서비스 런타임 데이터를 복잡 /tmp하고 정리하려는 노력으로부터 보호합니다. 사실: 제가 실행하고 있는 두 배포판(말장난 의도는 아님)은 755 권한을 갖고 있고 /run( /tmp그 문제 /var/tmp에 대해서는 /dev/shm) 1777 권한을 갖고 있습니다.

답변2

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

역사적으로 X와 같은 일부 항목은 이 원칙을 위반하고 DoS와 같이 잘 알려진 이름을 .X11-unix지정했습니다 /tmp. 이를 수행하려면 서비스가 필요합니다. 이러한 콘텐츠는 /run(또는 /var/run귀하가 Freedesktop.org 수정주의에 가입하지 않은 경우와 동일)입니다. 물론 더 좋은 방법은 이를 수정하고 전역 네임스페이스에서 잘 알려진 이름을 사용하지 않고 대신 경로 이름을 전달하는 것입니다.

답변3

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

그 쪽이 맞는 거 같아요. 귀하의 프로그램이 이를 수행할 수 있는 경우(이를 위해서는 /tmp기본적으로 더 이상 사용되지 않습니다 .)/run설치됨권한 있는 작업으로) 이제 /run보안상의 이유로 .

예를 들어, CUPS 인쇄 데몬은 루트로 실행되지 않지만 일반적으로 운영 체제 패키지에서 설치됩니다. 패키지는 액세스 가능한 디렉터리를 설치 /usr/lib/tmpfiles.d/cups.conf하고 생성합니다. systemd-tmpfiles디렉토리는 아래에 있으므로 /run, 누구나 쓰기 가능한 디렉토리와 달리 권한이 없는 사용자가 악의적으로 이름을 탈취할 수 없습니다 /tmp.

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

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

/tmp시스템에서 권한이 없는 여러 사용자 간의 임시 공동 작업에만 유용합니다. 이러한 임시 시스템은 협조를 거부하고 모든 사람의 일을 망치는 악의적인 사용자에게 취약합니다 :). 예를 들어 권한이 없는 사용자가 talkUnix 소켓을 사용하여 데몬 버전을 실행하기로 결정한 경우가 있습니다.

원본 데이터 레나르트 페틀링(Lennart Petling)에서

아래 Poettering 목록에서는 이것이 /tmp"작은 파일"에 유용하지만 /run"통신 기본 요소"에만 유용하다고 주장합니다. 저도 이런 구분은 옳지 않다고 생각합니다. 포스터 소년은 /run내부 데이터베이스를 포함하고 있다고 udev확신합니다 . 디렉토리 /run/udev가 있으면 /run누구도 주장된 구별을 따르고 디렉토리를 만들고 싶어하지 않을 것입니다.다른디렉토리, 혼란 /tmp. 그래서 실제로는 /runnow直播账号를 사용합니다.

누구나 쓸 수 있는 공유 네임스페이스[예: /tmp]를 사용한 통신은 통신을 설정하려면 안정적인 이름이 필요하지만 안정적인 이름은 DoS 공격에 대한 문을 열어주기 때문에 항상 문제가 되어 왔습니다. 이는 초기 부팅 중에 특정 서비스에 대해 보호된 응용 프로그램별 디렉터리를 설정하여 부분적으로 수정할 수 있습니다(X11의 경우처럼). 그러나 이는 패키지별만 설치 후 재부팅할 때만 작동하므로 문제를 부분적으로만 해결합니다.

...

또 다른 Fedora 기능(Fedora 17용)은 다양한 서비스에 대한 /tmp 네임스페이스를 격리하여 더 안전하게 만들기 위해 많은 시스템 서비스의 /tmp 의미를 변경합니다.

...

/tmp는 더 이상 공유 네임스페이스가 아니기 때문에 일반적으로 통신 기본 요소에 적합한 위치가 아닙니다.

...

[/run]은 tmpfs로 보장되므로 시작 시 자동으로 새로 고쳐집니다. 그 이상에는 자동 정리가 발생하지 않습니다.

...

다음은 귀하(Linux 애플리케이션 개발자)가 올바른 디렉토리를 선택하도록 권장하는 방법에 대한 대략적인 가이드입니다.

  1. 소켓(또는 기타 통신 기본 요소)을 배치하고 코드를 권한으로 실행할 수 있는 장소가 필요합니다. /run 아래의 하위 디렉터리를 사용하세요. (또는 추가 호환성을 위해 /var/run 아래에 있습니다.)
  2. 소켓(또는 기타 통신 기본 요소)을 배치하고 코드가 권한 없는 방식으로 실행될 장소가 필요합니다. $XDG_RUNTIME_DIR 아래의 하위 디렉터리를 사용하세요.
  3. 더 큰 다운로드와 진행 중인 다운로드를 저장하고 권한 없는 방식으로 실행할 수 있는 장소가 필요합니다. $XDG_DOWNLOAD_DIR을 사용하세요.
  4. 지속적이고 비특권 방식으로 실행되어야 하는 캐시 파일을 저장할 장소가 필요합니다. $XDG_CACHE_HOME을 사용하세요.
  5. 위의 어느 것도 적용되지 않습니다. 지속성이 필요하지 않은 작은 파일을 넣어야 합니다. $TMPDIR을 사용하고 /tmp에 폴백을 사용하십시오. 그리고 홈브류를 사용하지 않고 mkstemp() 및 mkdtemp()를 사용하십시오.
  6. 그렇지 않으면 /var/tmp에서 $TMPDIR 및 fallback을 사용하십시오. mkstemp()/mkdtemp()를 사용할 수도 있습니다.

위의 규칙은 권장 사항일 뿐입니다. 이러한 규칙은 해당 주제에 대해 우리가 알고 있는 모든 것을 고려하고 현재 및 향후 릴리스에서 볼 수 있는 문제를 방지합니다. 이러한 규칙을 따르도록 프로젝트를 업데이트하고 새 코드를 작성할 때 이를 염두에 두시기 바랍니다.

우리가 강조하고 싶은 한 가지는 /tmp 및 /var/tmp가 실제로 일반적으로 사용 사례에 적합한 선택이 아니라는 것입니다. 이러한 디렉토리는 유효한 용도로 사용되지만 실제로는 다른 디렉토리가 더 나은 위치일 수도 있습니다. 따라서 주의하고 다른 옵션을 고려하십시오. 하지만 /tmp 또는 /var/tmp를 선택하는 경우 최소한 mkstemp()/mkdtemp()를 사용해야 합니다.

/tmp위에서 언급했듯이 우리는 X 윈도우 시스템에서 사용하는 레거시 소켓에서 다소 벗어나고 있습니다. 제가 잘못 봤습니다 tmpfiles.d/x11.conf. 의존적 협력처럼 보입니다 :). 코드가 검토되었으므로 서비스 거부가 발생할 수 있는 최악의 상황이라고 가정합니다.

답변4

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

  • /run런타임 변수 데이터(예: 재부팅 이후 실행 중인 시스템에 대한 정보)
  • /tmp임시 파일의 공통 위치입니다.

따라서 데몬 상태, 로그인한 사용자, 마운트된 이동식 장치 등에 관한 모든 내용이 들어가고 /run프로그램에서 생성된 임시 파일은 /tmp.

편집: @JdeBP가 아래 의견에서 지적했듯이,

FHS는 "오래된" 파일을 주기적으로 제거하는 정기적인 크론 작업 설정을 허용합니다. 따라서 /tmp이러한 메커니즘은 사용하도록 설계되지 않았습니다 /run. 따라서 프로그램에는 저장하는 모든 항목의 수명에 대해 엄격한 제한이 있습니다 /tmp. 프로그램은 지속적으로 실행되는 시스템에서 파일이 더 오래 유지될 것으로 예상할 수 있지만 /run, 시스템에서 더 많이 정리되어야 합니다.

관련 정보