Menurut FHS-3.0 , /tmp
untuk file sementara dan /run
untuk data variabel run-time. Data masuk /run
harus dihapus pada boot berikutnya, yang tidak diperlukan /tmp
, tetapi program tetap tidak boleh berasumsi bahwa data masuk /tmp
akan tersedia pada awal program berikutnya. Semua ini tampaknya sangat mirip dengan saya.
Jadi, apa perbedaan keduanya? Kriteria mana yang harus diputuskan oleh suatu program untuk memasukkan data sementara ke dalam /tmp
atau ke dalam /run
?
Menurut FHS:
Program mungkin memiliki subdirektori dari
/run
; ini dianjurkan untuk program yang menggunakan lebih dari satu file run-time.
Ini menunjukkan bahwa perbedaan antara "program sistem" dan "program biasa" bukan kriteria, juga tidak seumur hidup program (seperti, proses jangka panjang vs proses jangka pendek).
Meskipun alasan berikut tidak diberikan dalam FHS, /run
diperkenalkan untuk mengatasi masalah yang /var
dipasang terlambat sehingga trik kotor diperlukan untuk menyediakan /var/run
cukup awal. Namun, sekarang dengan /run
diperkenalkan, dan diberikan uraiannya di FHS, tampaknya tidak ada alasan yang jelas untuk memiliki keduanya /run
dan /tmp
.
sumber
Jawaban:
Tidak ada alasan untuk memiliki keduanya / run dan / tmp
Saya pikir kamu benar.
/tmp
pada dasarnya sudah usang sekarang/run
. Jika program Anda berada dalam posisi untuk melakukannya (yang mengharuskannya diinstal sebagai operasi istimewa), maka saat ini Anda akan menggunakan subdirektori dari/run
. Ini untuk alasan keamanan.Misalnya daemon pencetakan CUPS tidak berjalan sebagai root, tetapi umumnya diinstal dari paket OS. Paket menginstal
/usr/lib/tmpfiles.d/cups.conf
, dansystemd-tmpfiles
membuat direktori yang dapat diakses. Karena direktori berada di bawah/run
, nama tersebut tidak dapat diklaim secara jahat oleh pengguna yang tidak berhak, tidak seperti/tmp
yang dapat ditulis oleh dunia."Program tidak terjangkau" yang tidak dapat digunakan
/run
secara langsungPerbedaan sebenarnya adalah jika program Anda dijalankan oleh pengguna yang tidak memiliki hak sewenang-wenang, di bawah ID pengguna mereka sendiri. Tetapi Anda umumnya masih tidak ingin menggunakan
/tmp
, karena itu dapat diakses oleh pengguna yang tidak terjangkau lainnya. Anda lebih suka menggunakan$XDG_RUNTIME_DIR
. Biasanya ini diimplementasikan sebagai/run/user/$(id -u)
- sehingga kebetulan juga merupakan subdirektori/run
. Lokasi tidak dijamin; program harus selalu menggunakan variabel lingkungan./tmp
hanya akan berguna untuk kerjasama ad-hoc antara berbagai pengguna yang tidak terjangkau pada sistem. Sistem ad-hoc seperti itu rentan terhadap pengguna jahat yang menolak untuk bekerja sama dan merusak hal-hal untuk semua orang :). Salah satu contohnya adalah pengguna yang tidak berhak memutuskan untuk menjalankan versitalk
daemon, menggunakan soket unix.Informasi asli dari Lennart Poettering
Catatan, daftar periksa Poettering di bawah ini menyatakan bahwa
/tmp
akan berguna untuk "file kecil", sedangkan/run
seharusnya hanya digunakan untuk "komunikasi primitif". Saya pikir perbedaan ini juga tidak benar. Untuk poster-boy/run
adalahudev
, dan saya cukup yakin/run/udev
menyertakan database internal. Setelah Anda memiliki/run
direktori, saya tidak berpikir ada orang yang ingin mengikuti perbedaan yang diklaim dan membuat direktori lain , menjadi berantakan/tmp
. Jadi dalam praktiknya kami hanya menggunakan/run
saat ini....
...
...
...
Kami agak lolos dengan legacySaya salah membaca/tmp
socket yang digunakan oleh sistem X window, seperti dijelaskan di atas.tmpfiles.d/x11.conf
. Sepertinya lebih bergantung pada kerjasama :). Saya menganggap kode itu sudah diaudit, sehingga penolakan layanan adalah yang terburuk yang bisa terjadi.sumber
/tmp
("API hanya untuk menggunakannya harus mkstemp (), mkdtemp () (dan teman-teman) sepenuhnya aman")./var/run
apakah sistem luas (mis. Untuk berkomunikasi ke basis data lokal),/tmp/
sekarang sering dibuat per pengguna . Secara historis, kuota / tmp juga disetel berbeda. Dan jawabannya kehilangan bahwa perbedaan penggunaan semantik juga penting.Direktori
/tmp
dan/usr/tmp
(nanti/var/tmp
) dulunya adalah tempat pembuangan segala sesuatu dan semua orang. Satu-satunya mekanisme perlindungan untuk file dalam direktori ini adalah bit sticky yang membatasi penghapusan atau penggantian nama file di sana untuk pemiliknya. Seperti yang ditunjukkan marcelm dalam komentar, pada prinsipnya tidak ada yang mencegah seseorang membuat file dengan nama yang digunakan oleh layanan (sepertinginx.pid
atausshd.pid
). (Dalam praktiknya, skrip startup dapat menghapus file palsu seperti itu terlebih dahulu.)/run
didirikan untuk data runtime non-persisten layanan berumur panjang seperti kunci, soket, file pid dan sejenisnya. Karena tidak dapat ditulisi untuk umum, ia melindungi data runtime layanan dari kekacauan/tmp
dan pekerjaan yang membersihkan di sana. Memang: Dua distribusi yang saya jalankan (tidak ada permainan yang dimaksudkan) memiliki izin 755 pada/run
, sementara/tmp
dan/var/tmp
(dan/dev/shm
dalam hal ini) memiliki izin 1777.sumber
/tmp
- Juga untuk menyediakan pelabuhan yang aman untuk data tersebut dari berbagai pekerjaan pembersihan yang menginjak-injak seluruh/tmp
./run
dan periksa struktur direktori yang rumit (well ...) yang disebabkan olehudev
,udisk
dll. Saya bukan ahli dalam masalah khusus ini, tapi saya kira skrip boot (yang dijalankan sebagai superuser) mengatur semuanya./tmp/nginx.pid
tetapi sudah ada karena beberapa program nakal./run/
mencegah hal ini dengan meminta hak istimewa untuk menulis./tmp
adalah lokasi untuk pembuatan file dan direktori sementara. Ini tidak dapat digunakan untuk menyimpan "nama-nama terkenal" (yaitu nama-nama proses lain dapat disadari tanpa Anda harus menyampaikan nama itu entah bagaimana) karena tidak ada yang memiliki kepemilikan atas namespace; siapa pun dapat membuat file di sana. Dengan demikian Anda biasanya menggunakannya ketika Anda memiliki utilitas yang memerlukan file (yaitu bukan pipa atau semacamnya) sebagai input atau output, di mana nama (dibuat secara acak) akan bekerja selama Anda memasukkan nama.Secara historis, beberapa hal (seperti X) melanggar prinsip ini dan memasukkan nama-nama terkenal (seperti
.X11-unix
) ke dalam/tmp
. Ini tentu saja buggy dan memungkinkan setiap pengguna untuk melakukan layanan yang perlu melakukannya hanya dengan berlomba untuk membuat file dengan nama yang diinginkan terlebih dahulu. Hal-hal seperti itu termasuk di bawah/run
(atau yang setara/var/run
jika Anda tidak berlangganan revisionisme Freedesktop.org). Tentu saja yang lebih baik adalah memperbaikinya untuk tidak menggunakan nama-nama terkenal di namespace global tetapi sebaliknya memberikan pathname.sumber
.socket
file systemd ... tetapi itu tidak membantu untuk seluruh direktori, atau untuk layanan yang baru diinstal/run/
itu sendiri diadopsi oleh FHS, saya tidak bisa melihat bagaimana itu ada hubungannya dengan fd.o. Kecuali jika kita benar-benar bermaksud mengeluh tentang upaya pembangunan yang tidak ditentukan yang berkontribusi pada keduanya./run
, mungkin memilih untuk menghindari mengacaukan/tmp
direktori bersama dengan file lebih banyak lagi.Menurut Standar Hierarki Filesystem,
/run
adalah untuk data variabel runtime yaitu informasi tentang sistem yang berjalan sejak reboot/tmp
adalah tempat umum untuk file sementara.Jadi segala sesuatu yang berkaitan dengan status daemon, pengguna yang masuk, perangkat yang dapat dilepas, dll. Akan masuk
/run
sementara file sementara yang dibuat oleh suatu program akan dimasukkan/tmp
.Sunting: seperti yang ditunjukkan oleh @JdeBP dalam komentar di bawah,
sumber
/tmp
file "lama"; tanpa mekanisme yang dimaksudkan untuk itu/run
. Oleh karena itu batas kejam pada program apa yang bisa diharapkan dari masa pakai apa pun dimasukkan/tmp
. Sementara program dapat mengharapkan file untuk hidup lebih lama/run
pada sistem yang terus-menerus naik, mereka juga diharapkan untuk merapikan diri mereka sendiri di sana.