Według FHS-3.0 , /tmp
to pliki tymczasowe i /run
jest dla danych zmiennej run-time. Dane /run
wejściowe należy usunąć przy następnym uruchomieniu, co nie jest wymagane /tmp
, ale programy nie mogą zakładać, że dane /tmp
wejściowe będą dostępne przy następnym uruchomieniu programu. Wszystko to wydaje mi się bardzo podobne.
Jaka jest różnica między nimi? Według jakich kryteriów program powinien decydować, czy dane tymczasowe mają być wprowadzane do /tmp
czy do /run
?
Według FHS:
Programy mogą mieć podkatalog
/run
; jest to zalecane w przypadku programów, które używają więcej niż jednego pliku wykonawczego.
Wskazuje to, że rozróżnienie między „programami systemowymi” a „zwykłymi programami” nie jest kryterium, podobnie jak czas życia programu (np. Proces długo- i krótkotrwały).
Chociaż w FHS nie podano następującego uzasadnienia, /run
wprowadzono go w celu rozwiązania problemu, który /var
został zamontowany zbyt późno, tak że potrzebne były brudne sztuczki, aby /var/run
udostępnić je odpowiednio wcześnie. Teraz jednak, z /run
wprowadzeniem, a biorąc pod uwagę jego opis w FHS, nie wydaje się być jasny powód, aby mieć zarówno /run
i /tmp
.
źródło
Odpowiedzi:
Nie ma powodu, aby mieć zarówno / run, jak i / tmp
Myślę, że masz rację.
/tmp
jest zasadniczo przestarzałe, teraz mamy/run
. Jeśli twój program jest w stanie to zrobić (co wymaga, aby został zainstalowany jako operacja uprzywilejowana), to w dzisiejszych czasach używałbyś podkatalogu/run
. Jest to ze względów bezpieczeństwa.Np. Demon drukowania CUPS nie działa jako root, ale zazwyczaj jest instalowany z pakietu systemu operacyjnego. Pakiet instaluje się
/usr/lib/tmpfiles.d/cups.conf
isystemd-tmpfiles
tworzy katalog, do którego może uzyskać dostęp. Ponieważ katalog jest pod/run
, nazwa nie może zostać złośliwie zgłoszona przez nieuprzywilejowanego użytkownika, w przeciwieństwie do tego,/tmp
co można zapisać na całym świecie.„Nieuprzywilejowane programy”, których nie można używać
/run
bezpośrednioPrawdziwe rozróżnienie polega na tym, że twój program jest uruchamiany przez dowolnego, nieuprzywilejowanego użytkownika, pod własnym identyfikatorem użytkownika. Ale nadal ogólnie nie chcesz z niego korzystać
/tmp
, ponieważ może być dostępny dla innych nieuprzywilejowanych użytkowników. Wolisz używać$XDG_RUNTIME_DIR
. Zazwyczaj jest to realizowane jako/run/user/$(id -u)
- tak więc zdarza się, że jest to również podkatalog/run
. Lokalizacja nie jest jednak gwarantowana; programy powinny zawsze używać zmiennej środowiskowej./tmp
przydałby się tylko do współpracy ad hoc między różnymi nieuprzywilejowanymi użytkownikami systemu. Takie systemy ad-hoc są podatne na ataki złośliwego użytkownika, który odmawia współpracy i psuje rzeczy wszystkim :). Jednym z przykładów byliby nieuprzywilejowani użytkownicy decydujący się na uruchomienie wersjitalk
demona przy użyciu gniazda unix.Oryginalne informacje z Lennart Poettering
Uwaga: poniższa lista kontrolna Poetteringa twierdziła, że
/tmp
byłaby przydatna w przypadku „małych plików”, podczas gdy/run
powinna być używana tylko w przypadku „prymitywów komunikacyjnych”. Nie sądzę też, aby to rozróżnienie było prawdziwe. Chłopiec-plakat dla/run
jestudev
i jestem pewien, że/run/udev
zawiera wewnętrzne bazy danych. Kiedy już masz/run
katalog, nie sądzę, że ktoś chce postępować zgodnie z domniemanym rozróżnieniem i stworzyć inny katalog, żeby się bałagać/tmp
. Tak więc w praktyce używamy tylko w/run
dzisiejszych czasach....
...
...
...
W pewnym sensie uciekamy od starszegoŹle odczytałem/tmp
gniazda używanego przez system okien X, jak opisano powyżej.tmpfiles.d/x11.conf
. Wygląda na to, że polega na współpracy :). Zakładam, że kod został poddany audytowi, dlatego odmowa usługi jest najgorszym z możliwych.źródło
/tmp
(„jedynymi interfejsami API do jego używania powinny być mkstemp (), mkdtemp () (i przyjaciele), aby być całkowicie bezpiecznym”)./var/run
jest obejmujący cały system (np. W celu komunikacji z lokalną bazą danych),/tmp/
teraz często jest tworzony dla każdego użytkownika . Historycznie również limit / tmp był ustawiony inaczej. Odpowiedź nie uwzględnia tego, że semantyczne rozróżnienie użycia jest również ważne.Katalogi
/tmp
i/usr/tmp
(później/var/tmp
) były wysypiskiem śmieci dla wszystkich i dla wszystkich. Jedynym mechanizmem ochrony plików w tych katalogach jest lepki bit, który ogranicza usuwanie lub zmianę nazwy plików tam na ich właścicieli. Jak zauważył marcelm w komentarzu, w zasadzie nic nie stoi na przeszkodzie, aby ktoś utworzył pliki o nazwach używanych przez usługi (takie jaknginx.pid
lubsshd.pid
). (W praktyce skrypty startowe mogą jednak najpierw usunąć takie fałszywe pliki)./run
została utworzona dla nietrwałych danych wykonawczych usług długowiecznych, takich jak zamki, gniazda, pliki pid i tym podobne. Ponieważ nie jest dostępny do zapisu publicznego, chroni dane wykonawcze usługi przed bałaganem/tmp
i zadaniami, które tam czyszczą. Rzeczywiście: Dwie dystrybucje, które uruchamiam (bez zamierzonej gry słów) mają uprawnienia na 755/run
, a/tmp
i/var/tmp
(i/dev/shm
do tego) mają uprawnienia 1777.źródło
/tmp
- Aby zapewnić bezpieczną przystań dla danych z różnych zadań czyszczenia, które są deptane/tmp
./run
i sprawdzeniu złożonej (...) dobrze struktury katalogów spowodowanegoudev
,udisk
itd. Nie jestem ekspertem w tej konkretnej kwestii, ale myślę, skrypty startowe (które są uruchamiane jako superuser) ustawi wszystko./tmp/nginx.pid
ale już istnieje z powodu jakiegoś źle działającego programu./run/
zapobiega temu, wymagając uprawnień do pisania./tmp
jest miejscem tworzenia tymczasowych plików i katalogów. Nie nadaje się do przechowywania „dobrze znanych nazw” (tj. Nazw, o których inny proces mógłby wiedzieć bez konieczności przekazywania nazwy), ponieważ nikt nie ma prawa własności do przestrzeni nazw; każdy może tam tworzyć pliki. Jako taki zazwyczaj używasz go, gdy masz narzędzie, które potrzebuje pliku (tj. Nie potoku lub takiego) jako danych wejściowych lub wyjściowych, w którym dowolna (losowo generowana) nazwa będzie działać tak długo, jak długo przekażesz nazwę.Historycznie niektóre rzeczy (jak X) naruszały tę zasadę i wprowadzały znane nazwy (jak
.X11-unix
)/tmp
. Jest to oczywiście błędne i pozwala każdemu użytkownikowi na wykonanie usługi DoS po prostu ścigając się, aby najpierw utworzyć plik o żądanej nazwie. Takie rzeczy należą/run
(lub równoważnie,/var/run
jeśli nie subskrybujesz rewizjonizmu Freedesktop.org). Oczywiście jeszcze lepiej byłoby naprawić je tak, aby nie używały dobrze znanych nazw w globalnej przestrzeni nazw, ale zamiast tego podawały nazwę ścieżki.źródło
.socket
plików systemowych ... ale to nie pomaga w przypadku całych katalogów ani nowo zainstalowanych usług/run/
sama została przyjęta przez FHS, nie widzę, jak to ma coś wspólnego z fd.o. Chyba że tak naprawdę narzekaliśmy na nieokreślone wysiłki rozwojowe, które przyczyniły się do obu./run
, może postanowić uniknąć zaśmiecania/tmp
katalogu współdzielonego jeszcze większą liczbą plików.Zgodnie ze standardem hierarchii systemu plików,
/run
dotyczy danych zmiennych wykonawczych, tj. informacji o systemie uruchomionym od momentu ponownego uruchomienia/tmp
to ogólne miejsce na pliki tymczasowe.Tak więc wszystko, co dotyczy statusu demona, zalogowanych użytkowników, zamontowanych urządzeń wymiennych itp.
/run
, Wchodziłoby do plików tymczasowych utworzonych przez program/tmp
.Edycja: jak wskazał @JdeBP w komentarzu poniżej,
źródło
/tmp
„stare” pliki; bez takich mechanizmów przeznaczonych do/run
. Stąd drakoński limit tego, czego programy mogą oczekiwać od czasu życia wszystkiego, co się pojawi/tmp
. Chociaż programy mogą oczekiwać, że pliki będą dłużej żyły w/run
systemie działającym w trybie ciągłym, oczekuje się również, że będą je porządkować.