/ Tmp ve / run arasındaki fark nedir?


42

Göre FHS-3.0 , /tmpgeçici dosyalar için ve /runçalışma zamanı değişken verileri içindir. /runBir sonraki önyüklemede veri girilmemelidir, bunun için gerekli değildir /tmp, ancak yine de programlar /tmp, bir sonraki program başlangıcında mevcut olacağını varsaymamalıdır . Bütün bunlar bana oldukça benziyor.

Peki, ikisi arasındaki fark nedir? Bir program hangi kriterlere göre geçici verilerin /tmpiçine /runmi yoksa içine mi girileceğine karar vermelidir ?

FHS'ye göre:

Programların bir alt dizini olabilir /run; bu, birden fazla çalışma zamanı dosyası kullanan programlar için teşvik edilir.

Bu, "sistem programları" ve "sıradan programlar" arasındaki ayrımın bir kriter olmadığını, programın kullanım ömrünün (uzun süren ve kısa süren işlemler gibi) de olmadığını gösterir.

Aşağıdaki gerekçe FHS'de verilmese de, çok geç monte edilen /runproblemin üstesinden gelmek için yeterince /varhileli hale getirmek için kirli hileler gerekli olacak şekilde tanıtıldı /var/run. Ancak, artık ile /runtanıtıldı ve FHS onun açıklamasını veriliyor, ikisine birden sahip açık bir nedeni olmalı görünmüyor /runve /tmp.


11
/ tmp, geçici veriler için * nix standart konumdur. / run, geçici veriler için Poettering standart konumudur.
Mark

Geri uyumluluk her zaman bir nedendir ...
Bakuriu

Yanıtlar:


16

Hem / run hem de / tmp olması için sebep yok

Bence haklısın. /tmpşimdi sahip olduğumuzda esasen itiraz ediliyor /run. Programınız bunu yapacak bir pozisyondaysa ( ayrıcalıklı bir işlem olarak yüklenmesini gerektirir ), o zaman bugünlerde bir alt dizini kullanırsınız /run. Bu güvenlik nedeniyle.

Örneğin, CUPS yazdırma arka plan programı kök olarak çalışmaz, ancak genellikle bir işletim sistemi paketinden yüklenir. Paket yükler /usr/lib/tmpfiles.d/cups.confve systemd-tmpfileserişebileceği bir dizin oluşturur. Dizin altında olduğu için, dünyaca yazılabilir /runolanın aksine isim, imtiyazsız bir kullanıcı tarafından kötü bir şekilde talep edilemez /tmp.

/runDoğrudan kullanamayan "Ayrıcalıklı programlar"

Asıl ayrım, programınızın keyfi bir imtiyazsız kullanıcı tarafından kendi kullanıcı kimliği altında çalıştırılmasıdır. Ancak hala genel olarak kullanmak istemiyorsunuz /tmpçünkü buna diğer imtiyazsız kullanıcılar erişebilir. Kullanmayı tercih ederdin $XDG_RUNTIME_DIR. Tipik olarak bu - olarak uygulanır, /run/user/$(id -u)bu yüzden de bir alt dizini olur /run. Konum olsa garanti edilmez; programlar her zaman ortam değişkenini kullanmalıdır.

/tmpyalnızca sistemdeki farklı ayrıcalıklı kullanıcılar arasındaki geçici işbirliği için yararlı olacaktır. Bu tür geçici sistemler, herkes için işbirliği yapmayı ve şımartmayı reddeden kötü niyetli bir kullanıcıya karşı savunmasızdır :). Bir örnek talk, bir unix soketi kullanarak daemon'un bir sürümünü çalıştırmaya karar veren imtiyazsız kullanıcılar olacaktır .

Lennart Poettering'den orjinal bilgiler

Poettering'in aşağıdaki kontrol listesinin /tmp"küçük dosyalar" için yararlı olacağını, ancak /runsadece "iletişim ilkeleri" için kullanılması gerektiğini unutmayın. Bu ayrımın da doğru olduğunu sanmıyorum. İçin poster çocuğu /runolduğunu udevve eminim /run/udeviç veritabanlarını içerir. Bir /rundizininiz olduğunda, kimsenin iddia edilen farkı takip etmek ve karışıklık yaratmak için başka bir dizin oluşturmak istediğini sanmıyorum /tmp. Bu yüzden pratikte /runbugünlerde kullanıyoruz.

İletişim amaçlı dünyaca yazılabilir paylaşılan ad alanlarının [like / tmp] kullanımı her zaman sorunlu olmuştur, çünkü iletişimi sağlamak için sabit adlara ihtiyacınız vardır, ancak kararlı adlar DoS saldırıları için kapıları açar. Bu, erken önyükleme sırasında belirli hizmetler için korumalı uygulama başına dizinler oluşturularak düzeltilebilir (X11 için yaptığımız gibi), ancak bu yalnızca sorunu kısmen düzeltir, çünkü bu yalnızca her paket kurulumunu yeniden başlatmanın ardından doğru şekilde çalışır.

...

Diğer bir Fedora özelliği (Fedora 17 için), çeşitli servislerin / tmp ad alanlarını izole ederek, daha fazla güvenli hale getirmek için / tmp'nin / tmp'nin anlamını değiştirmiştir.

...

/ Tmp artık mutlaka paylaşılan bir ad alanı olmadığından, iletişim ilkeleri için bir konum olarak genellikle uygun değildir.

...

[/ run] 'un bir tmpfs olduğu garantilidir ve dolayısıyla botlarda otomatik olarak yıkanır. Bunun ötesinde otomatik temizlik yapılmaz.

...

İşte size (Linux uygulama geliştiricisi) kullanmak için doğru dizini seçmenizi nasıl önereceğimize dair kaba bir rehber:

  1. Soketinizi (veya başka bir iletişimi ilkel olarak) koymak için bir yere ihtiyacınız vardır ve kodunuz ayrıcalıklı çalışır: / run altında bir alt dizin kullanın. (Ya da daha fazla uyumluluk için / var / run altında.)
  2. Soketinizi (veya başka bir iletişimi ilkel olarak) koymak için bir yere ihtiyacınız var ve kodunuz ayrıcalıklı değil: $ XDG_RUNTIME_DIR altına bir alt dizin kullanın.
  3. Daha büyük indirmelerinizi ve indirmelerinizi devam ettirmek ve ayrıcalıklı koşmak için bir yere ihtiyacınız var: $ XDG_DOWNLOAD_DIR kullanın.
  4. Kalıcı ve ayrıcalıklı olmayan önbellek dosyalarını koymak için bir yere ihtiyacınız var: $ XDG_CACHE_HOME kullanın.
  5. Yukarıdakilerin hiçbiri geçerli değildir ve kalıcılık gerektirmeyen küçük bir dosya yerleştirmeniz gerekir: / tmp üzerinde bir geri dönüş ile $ TMPDIR kullanın. Ve mkstemp () ve mkdtemp () yöntemlerini ve kendileri tarafından üretilen hiçbir şeyi kullanmayın.
  6. Aksi halde, / var / tmp işlevinde bir geri dönüş ile $ TMPDIR kullanın. Ayrıca mkstemp () / mkdtemp () işlevini kullanın.

Yukarıdaki kuralların sadece tarafımızdan önerildiğini unutmayın. Bu kurallar, bu konu hakkında bildiğimiz her şeyi hesaba katar ve gördüğümüz kadarıyla mevcut ve gelecekteki dağıtım sorunlarından kaçınır. Lütfen bu kuralları takip etmek için projelerinizi güncellemeyi düşünün ve yeni kod yazarsanız bunları aklınızda bulundurun.

Vurgulamak istediğimiz bir şey, / tmp ve / var / tmp öğesinin gerçekte olmadığı kadar sık ​​olması, gerçekte sizin usecase'iniz için doğru seçim değildir. Bu dizinlerin geçerli kullanımları vardır, ancak genellikle başka bir dizin aslında daha iyi bir yer olabilir. Bu nedenle, dikkatli olun, diğer seçenekleri göz önünde bulundurun, ancak / tmp veya / var / tmp için giderseniz, en azından mkstemp () / mkdtemp () kullandığınızdan emin olun.

/tmpYukarıda açıklandığı gibi, X pencere sistemi tarafından kullanılan eski soketten kurtulduk . Yanlış okudum tmpfiles.d/x11.conf. İşbirliğine dayanıyor gibi görünüyor :). Kodun denetlendiğini kabul ediyorum, öyle ki, hizmet reddi, olabilecek en kötü şey.


8
Bu cevap her türlü yanlış.
R.,

@R .., bunu genişletmek ister misiniz?
Wildcard,

Evet, zaten bir cevapta yaptım. (Bir yorum olarak başladı, ancak bunun daha fazla bir cevap olduğunu anladım.)
R. ..

Şu anki cevabımdaki, üzerinde çalıştığınızı düşündüğüm asıl zayıflığın teknik olarak , XDG_RUNTIME_DIR’ın teknik olarak herhangi bir * nix’e taşınabilir olması ("benzer özelliklere sahip bir yedek dizine geri dönme") olması gerektiğidir. Bunun pratikte ne anlama geldiği çok belirsiz. Taşınabilir yardımcı programlar için, iyi tanımlanmış standardın kullanılması /tmp("onu kullanmak için yalnızca API'lerin mkstemp (), mkdtemp () (ve arkadaşların) tamamen güvenli olması gerekir" olması) kullanılması daha iyidir.
kaynakjedi

Cevabı cevaplamak da yaygın bir durumdur: /var/runsistem /tmp/çapındadır (örneğin, yerel veri tabanına iletişim kurmak için), artık kullanıcı başına yaratılmıştır . Tarihsel olarak, / tmp kotası da farklı olarak belirlenmiştir. Ve cevap, anlamsal bir kullanım ayrımının da önemli olduğunu özlüyor .
Giacomo Catenazzi

23

Dizinler /tmpve /usr/tmp(daha sonra /var/tmp) her şey ve herkes için çöplük olarak kullanılırdı. Bu klasörlerdeki dosyalar için tek koruma mekanizması, sahiplerinin dosyalarının silinmesini veya yeniden adlandırılmasını kısıtlayan yapışkan bit'tir. Marcel'in bir yorumda işaret ettiği gibi, ilke olarak, birisinin hizmetler tarafından kullanılan isimlerle ( nginx.pidveya gibi sshd.pid) dosya oluşturmasını engelleyen hiçbir şey yoktur . (Uygulamada, başlangıç ​​komut dosyaları ilk önce bu tür sahte dosyaları kaldırabilir.)

/runkilitler, soketler, pid dosyaları ve benzeri gibi uzun ömürlü hizmetlerin sürekli olmayan çalışma zamanı verileri için kurulmuştur. Halk için yazılabilir olmadığından hizmet çalışma zamanı verilerini karışıklıktan /tmpve orada temizleyen işlerden korur . Gerçekten: Çalıştığım iki dağıtım (hedeflenen amaç yok) 755'in üzerinde izinlere /runsahipken /tmp, /var/tmp(ve /dev/shmbu konuda) 1777'nin izinleri var.


3
sadece servis çalışma zamanı verilerini karmaşadan ayırmak için var/tmp - Ayrıca, söz konusu veriler için ezilen çeşitli temizlik işlerinden güvenli bir liman sağlamak /tmp.
Satō Katsura

İzinlerle ilgili bilgi için teşekkürler. Bununla birlikte, FHS'ye göre "Programlar, / run alt dizinine sahip olabilir; bu, birden fazla çalışma zamanı dosyası kullanan programlar için teşvik edilir." - bu hem “uzun ömürlü hizmetler” kriterini hem de programların sınırlı izinler nedeniyle alt dizinlerini oluşturmadaki yetersizliği ile çelişmektedir.
Dirk Herrmann,

@DirkHerrmann Hayır, hayır. Bir göz atın /runve bunun neden olduğu karmaşık (iyi ...) dizin yapısını inceleyin udev, udiskvb. Bu belirli konuda uzman değilim, ancak önyükleme komut dosyalarının (süper kullanıcı olarak çalıştırılır) her şeyi ayarladığını tahmin ediyorum.
countermode

2
"/ run teknik olarak gerekli değil, sadece servis çalışma zamanı verilerini / tmp içindeki karışıklıktan ayırmak için var." - İyi bir şey, bu yüzden ayrıcalıklı olmayan işlemler, sistem hizmetlerinin kullanmak istedikleri isimleri çömelemez. Nginx kullanmak isterse çok kötüdür, /tmp/nginx.pidancak bazı yanlış programlardan dolayı zaten var. /run/bunu yazmak için ayrıcalıklar gerektirerek bunu önler.
mart

18

/tmpgeçici dosya ve dizinlerin oluşturulma yeridir. “İyi bilinen isimleri” saklamak için kullanılamaz (yani başka bir işlemin ismini bir şekilde aktarmanıza gerek kalmadan fark edebileceği isimler), çünkü kimsenin isim alanı üzerinde mülkiyeti yoktur; Herkes orada dosya oluşturabilir. Bu nedenle, genellikle giriş veya çıkış olarak bir dosyaya (yani bir boru veya benzeri olmayan) ihtiyaç duyan bir yardımcı programa sahip olduğunuzda, herhangi bir (rastgele oluşturulmuş) adın, adı girdiğiniz sürece çalışacağı durumlarda kullanırsınız.

Tarihsel olarak, bazı şeyler (X gibi) bu prensibi ihlal etti ve iyi bilinen isimleri (gibi .X11-unix) içine koydu /tmp. Bu elbette bir sorun teşkil etmekte ve herhangi bir kullanıcının yalnızca istenen adda bir dosya oluşturmak için yarışarak yapması gereken hizmeti yapmasına izin vermektedir. Bu gibi şeyler aittir /run(veya /var/runFreedesktop.org revizyonizmine abone değilseniz eşit olarak ). Elbette daha iyisi, onları küresel bir ad alanında iyi bilinen isimler kullanmamaları, bunun yerine bir yol adının etrafından geçirmelerini düzeltmek olacaktır.


"Geçici dosyalar" konusunda daha fazla tanım için teşekkürler. Sanırım "bir yoldan geçmek" bir eşgüdüm noktasının nasıl kurulacağını açıklıyor. Yani genellikle bir ortam değişkeni kullanırsınız. Çalışmasına izin verecek kadar az priz ve boru var (genel kullanımda). (Kısmen aynı dbus soketi üzerinden bir çok şey geçeceğinden). Programlar varsayılan olarak bir kodlanmış yola gitmiyorsa , ortamı ayarlamak can sıkıcı olacak gibi görünüyor . Systemd .socketdosyalarına yeni bir anahtar ekleyebilirsiniz ... ama bu, tüm dizinler için ve yeni kurulan hizmetler için yardımcı olmaz
kaynakjedi

2
/run/FHS tarafından kabul edildi, fd.o ile nasıl bir ilgisi olduğunu göremiyorum. Gerçekten şikayet etmek istediğimiz şey olmadıkça, her ikisine de katkıda bulunan belirtilmemiş geliştirme çabaları değildir.
sourcejedi

Buradaki ilk cevabın burada yazılı soru için en iyi cevap olduğunu düşünüyorum. Düşünerek daha da geliştirilebileceğini düşünüyorum: _Web, örneğin altındaki özel bir dizine yazma erişimine sahip olduğunda /run, paylaşılan /tmpdizinin daha fazla dosyayla karıştırılmasının önüne geçmeyi seçebilir .
kaynakjedi

"Fd.o" nedir?
TRiG

7

Dosya Sistemi Hiyerarşisi Standardına göre,

  • /run çalışma zamanı değişken verileri içindir, yani yeniden başlatılmasından bu yana çalışan sistem hakkında bilgi
  • /tmp geçici dosyalar için genel bir yerdir.

Böylece, /runprogramın oluşturduğu geçici dosyalar girerken , daemon durumu, giriş yapan kullanıcılar, takılabilir çıkarılabilir aygıtlar vb /tmp.

Düzenleme: aşağıdaki yorumda @JdeBP tarafından belirtildiği gibi,

FHS, düzenli /tmpolarak "eski" dosyaları temizleyen geleneksel cron işleri kurulumu gibi şeylere izin verir ; amaçlanan böyle bir mekanizma olmadan /run. Bu nedenle draconian, uygulanan programların ömrü boyunca hangi programların bekleyebileceği konusundaki sınırını belirler /tmp. Programlar, /runsürekli çalışan bir sistemde dosyaların daha uzun süre yaşamasını beklerken, aynı zamanda orada daha sonra kendilerini toparlamaları beklenir.


4
Bu veya başka bir cevapta belirtilmeyen, ancak FHS'de belirtilen ve cevabınızı geliştirmek isteyebileceğiniz bir şey: FHS, düzenli /tmpolarak "eski" dosyaları temizleyen geleneksel cron işleri kurulumu gibi şeylere izin verir ; amaçlanan böyle bir mekanizma olmadan /run. Bu nedenle draconian, uygulanan programların ömrü boyunca hangi programların bekleyebileceği konusundaki sınırını belirler /tmp. Programlar, /runsürekli çalışan bir sistemde dosyaların daha uzun süre yaşamasını beklerken, aynı zamanda orada daha sonra kendilerini toparlamaları beklenir.
JdeBP

1
Süreç öldükten hemen sonra kaybolan (ya da bazı gezici çöp arka planlarının silinmesine izin verilen) işlem başına bir dizinin olması güzel olurdu.
Omnifarious

1
@Omnifarious artık RuntimeDirectory = :-) kullanarak bir systemd servisi için bu davranışı elde edebilirsiniz .
sourcejedi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.