Nessun motivo per avere sia / run che / tmp
Penso tu abbia ragione. /tmp
è sostanzialmente deprecato ora che abbiamo /run
. Se il tuo programma è in grado di farlo (il che richiede che sia stato installato come operazione privilegiata), allora oggi useresti una sottodirectory di /run
. Questo per motivi di sicurezza.
Ad esempio, il demone di stampa CUPS non funziona come root, ma è generalmente installato da un pacchetto del sistema operativo. Il pacchetto si installa /usr/lib/tmpfiles.d/cups.conf
e systemd-tmpfiles
crea una directory a cui può accedere. Poiché la directory è sotto /run
, il nome non può essere stato rivendicato maliziosamente da un utente non privilegiato, a differenza del /tmp
quale è scrivibile in tutto il mondo.
"Programmi senza privilegi" che non possono essere utilizzati /run
direttamente
La vera distinzione è se il tuo programma è gestito da un utente arbitrario senza privilegi, con il proprio ID utente. Ma in genere non si desidera utilizzare /tmp
, poiché è possibile accedervi da altri utenti non privilegiati. Preferiresti usare $XDG_RUNTIME_DIR
. In genere questo è implementato come /run/user/$(id -u)
- quindi sembra essere anche una sottodirectory di /run
. La posizione non è garantita però; i programmi dovrebbero sempre usare la variabile d'ambiente.
/tmp
sarebbe utile solo per la cooperazione ad hoc tra diversi utenti non privilegiati sul sistema. Tali sistemi ad hoc sono vulnerabili a un utente malintenzionato che rifiuta di cooperare e viziare le cose per tutti :). Un esempio potrebbe essere rappresentato dagli utenti non privilegiati che decidono di eseguire una versione del talk
demone, utilizzando un socket unix.
Si noti che la seguente lista di controllo di Poettering sosteneva che /tmp
sarebbe utile per "piccoli file", mentre /run
dovrebbe essere usata solo per "primitive di comunicazione". Non penso che questa distinzione sia vera. Il poster-boy /run
è udev
, e sono quasi sicuro che /run/udev
includa database interni. Una volta che hai una /run
directory, non penso che nessuno voglia seguire la distinzione dichiarata e creare un'altra directory, per ingombrare /tmp
. Quindi in pratica usiamo solo al /run
giorno d'oggi.
L'uso di spazi dei nomi condivisi scrivibili in tutto il mondo [like / tmp] per scopi di comunicazione è sempre stato problematico, poiché per stabilire la comunicazione sono necessari nomi stabili, ma i nomi stabili aprono le porte agli attacchi DoS. Questo può essere corretto parzialmente, stabilendo directory per-app protette per determinati servizi durante l'avvio anticipato (come facciamo per X11), ma questo risolve solo parzialmente il problema, poiché funziona correttamente solo se ogni installazione di pacchetto è seguita da un riavvio.
...
Un'altra funzione di Fedora (per Fedora 17) ha cambiato la semantica di / tmp per molti servizi di sistema per renderli più sicuri, isolando gli spazi dei nomi / tmp dei vari servizi
...
Poiché / tmp non è più necessariamente uno spazio dei nomi condiviso, generalmente non è adatto come posizione per le primitive di comunicazione.
...
[/ run] è garantito per essere un tmpfs ed è quindi automaticamente scaricato agli stivali. Non viene eseguita alcuna pulizia automatica oltre a ciò.
...
Ecco una breve guida su come ti consigliamo (uno sviluppatore di applicazioni Linux) di scegliere la directory giusta da usare:
- Hai bisogno di un posto dove mettere il tuo socket (o altra primitiva di comunicazione) e il tuo codice viene privilegiato: usa una sottodirectory sotto / run. (O sotto / var / run per una maggiore compatibilità.)
- Hai bisogno di un posto dove mettere il tuo socket (o altra primitiva di comunicazione) e il tuo codice viene eseguito senza privilegi: usa una sottodirectory sotto $ XDG_RUNTIME_DIR.
- Hai bisogno di un posto per mettere in atto i tuoi download e download più grandi ed eseguire senza privilegi: usa $ XDG_DOWNLOAD_DIR.
- Hai bisogno di un posto dove mettere i file della cache che dovrebbero essere persistenti e funzionare senza privilegi: usa $ XDG_CACHE_HOME.
- Nulla di quanto sopra si applica e devi inserire un piccolo file che non ha bisogno di persistenza: usa $ TMPDIR con un fallback su / tmp. E usa mkstemp (), e mkdtemp () e niente di fatto in casa.
- Altrimenti usa $ TMPDIR con un fallback su / var / tmp. Usa anche mkstemp () / mkdtemp ().
Nota che queste regole sopra sono solo suggerite da noi. Queste regole tengono conto di tutto ciò che sappiamo su questo argomento ed evitano problemi con le distribuzioni attuali e future, per quanto possiamo vederle. Ti consigliamo di aggiornare i tuoi progetti per seguire queste regole e tienili a mente se scrivi un nuovo codice.
Una cosa che vorremmo sottolineare è che / tmp e / var / tmp il più delle volte non sono in realtà la scelta giusta per il tuo caso d'uso. Esistono usi validi di queste directory, ma molto spesso un'altra directory potrebbe effettivamente essere il posto migliore. Quindi, fai attenzione, considera le altre opzioni, ma se usi / tmp o / var / tmp, almeno assicurati di usare mkstemp () / mkdtemp ().
In un certo senso ci scappiamo con il /tmp
socket legacy utilizzato dal sistema X Window, come descritto sopra. Ho letto male tmpfiles.d/x11.conf
. Sembra più che si basi sulla cooperazione :). Presumo che il codice sia stato verificato, in modo tale che la negazione del servizio sia la cosa peggiore che possa accadere.