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
, dan systemd-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 langsung
Perbedaan 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 versi talk
daemon, menggunakan soket unix.
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
adalah udev
, 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.
Penggunaan ruang nama bersama yang dapat ditulisi dunia [seperti / tmp] untuk tujuan komunikasi selalu bermasalah, karena untuk membangun komunikasi Anda memerlukan nama yang stabil, tetapi nama yang stabil membuka pintu untuk serangan DoS. Ini dapat diperbaiki sebagian, dengan membuat direktori per aplikasi yang dilindungi untuk layanan tertentu selama boot awal (seperti yang kami lakukan untuk X11), tetapi ini hanya memperbaiki masalah sebagian, karena ini hanya berfungsi dengan benar jika setiap instalasi paket diikuti dengan reboot.
...
Fitur Fedora lain (untuk Fedora 17) mengubah semantik / tmp untuk banyak layanan sistem untuk membuatnya lebih aman, dengan mengisolasi ruang nama / tmp dari berbagai layanan
...
Karena / tmp tidak lagi perlu ruang nama bersama, biasanya tidak cocok sebagai lokasi komunikasi primitif.
...
[/ run] dijamin menjadi tmpfs dan karenanya secara otomatis memerah saat booting. Tidak ada pembersihan otomatis yang dilakukan selain itu.
...
Berikut ini panduan kasar bagaimana kami menyarankan Anda (pengembang aplikasi Linux) memilih direktori yang tepat untuk digunakan:
- Anda memerlukan tempat untuk meletakkan soket (atau primitif komunikasi lainnya) dan kode Anda berjalan dengan istimewa: gunakan subdirektori di bawah / jalankan. (Atau di bawah / var / run untuk kompatibilitas ekstra.)
- Anda memerlukan tempat untuk meletakkan soket Anda (atau primitif komunikasi lainnya) dan kode Anda berjalan tanpa hak: gunakan subdirektori di bawah $ XDG_RUNTIME_DIR.
- Anda memerlukan tempat untuk membuat unduhan dan unduhan Anda yang lebih besar dalam proses dan menjalankan undrivileged: gunakan $ XDG_DOWNLOAD_DIR.
- Anda memerlukan tempat untuk meletakkan file cache yang harus persisten dan dijalankan tanpa hak: gunakan $ XDG_CACHE_HOME.
- Tidak ada satu pun dari hal di atas yang berlaku dan Anda perlu menempatkan file kecil yang tidak membutuhkan persistensi: gunakan $ TMPDIR dengan fallback on / tmp. Dan gunakan mkstemp (), dan mkdtemp () dan tidak ada homegrown.
- Kalau tidak gunakan $ TMPDIR dengan fallback pada / var / tmp. Juga gunakan mkstemp () / mkdtemp ().
Perhatikan bahwa aturan di atas hanya disarankan oleh kami. Aturan-aturan ini memperhitungkan semua yang kita ketahui tentang topik ini dan menghindari masalah dengan distribusi saat ini dan masa depan, sejauh yang kita bisa melihatnya. Harap pertimbangkan untuk memperbarui proyek Anda untuk mengikuti aturan ini, dan ingatlah jika Anda menulis kode baru.
Satu hal yang kami ingin tekankan adalah bahwa / tmp dan / var / tmp lebih sering daripada tidak sebenarnya bukan pilihan yang tepat untuk usecase Anda. Ada kegunaan direktori ini yang valid, tetapi seringkali direktori lain mungkin merupakan tempat yang lebih baik. Jadi, berhati-hatilah, pertimbangkan opsi lain, tetapi jika Anda menggunakan / tmp atau / var / tmp maka setidaknya pastikan untuk menggunakan mkstemp () / mkdtemp ().
Kami agak lolos dengan legacy /tmp
socket yang digunakan oleh sistem X window, seperti dijelaskan di atas. Saya salah membaca tmpfiles.d/x11.conf
. Sepertinya lebih bergantung pada kerjasama :). Saya menganggap kode itu sudah diaudit, sehingga penolakan layanan adalah yang terburuk yang bisa terjadi.