Lokasi idiomatis untuk soket berbasis file pada sistem Debian

13

Saya menulis proses daemon untuk sistem Debian Cyang menggunakan Socket Unix Domain .

Jika direktori kerja proses daemon adalah direktori root, apakah ada direktori idiomatik untuk menempatkan soket pada sistem file?

recursion.ninja
sumber
Mengapa Anda tidak membiarkannya dikonfigurasi?
BatchyX
3
@ BatchyX Yah, semacam nilai default (daripada memaksa setiap administrator untuk membuat keputusan sepenuhnya sendiri) tentu saja bisa menyenangkan. :)
a CVn

Jawaban:

17

Mereka umumnya ditemukan di /tmpatau subdirektori daripadanya. Perhatikan bahwa semua yang ada di /tmpdalamnya dapat dihapus saat shutdown - bukan berarti itu terhapus, hanya perlu diperhatikan , jadi jika Anda menggunakannya, periksa apakah Anda harus membuat subdirektori setiap kali. Anda akan ingin menggunakan subdirektori jika Anda ingin membatasi akses melalui izin, karena /tmpdapat dibaca dunia.

/rundan /var/run(yang dapat dihubungkan secara simultan) digunakan dengan cara yang serupa, tetapi mereka umumnya dipasang sebagai sistem file tmpfs - artinya mereka dibuat saat boot dan berada di memori , bukan pada disk (jadi jangan gunakan itu sebagai tempat untuk membuang jumlah data yang banyak). Untuk soket runtime, itu mungkin pilihan yang baik.

Perhatikan bahwa /run, dan semua direktori lain yang disebutkan di sini kecuali /tmp , hanya dapat ditulis oleh root. Untuk proses sistem, ini baik-baik saja, tetapi jika aplikasi dapat dijalankan oleh pengguna yang tidak memiliki hak istimewa, Anda ingin menggunakan /tmpatau membuat direktori permanen di suatu tempat dan menetapkan izin untuk itu, atau menggunakan lokasi di $ HOME pengguna.

Dimungkinkan untuk membuat direktori di /usr/share(atau /usr/local/share) selama instalasi. Direktori dan konten di sana tidak berpotensi menuai sepatu bot karena akan berada di /tmpatau /run. Namun, seperti yang ditunjukkan jordanm dalam komentar, /usrdapat dipasang hanya-baca dan pedoman hierarki sistem file linux mencerminkan hal ini . Tentu saja, itu tidak dapat dibaca-saja ketika aplikasi Anda diinstal, jadi jika Anda merasa nyaman membuat soket di sana, Anda dapat meninggalkannya dan menggunakannya nanti (Anda masih dapat menulis ke soket meskipun file hanya baca).

Jika Anda menginginkan tempat yang persisten di seluruh boot yang tidak bisa dipasang hanya baca, /etcadalah taruhan yang cukup aman, karena ini sering digunakan untuk konfigurasi dan konfigurasi ulang di seluruh sistem. OTOH, adalah mungkin untuk memiliki sistem di mana perangkat yang mendasari seluruh sistem file root adalah read-only (misalnya, embedded system), dengan / tmp dan / dijalankan pada perangkat lain (mungkin: tmpfs dalam memori). Jadi dua strategi yang paling kuat tampaknya:

  • Pasang soket ke lokasi permanen saat aplikasi diinstal.

  • Buat direktori di dalam /runatau /var/runsaat runtime dan masukkan soket di sana.

  • Lakukan hal yang sama hanya di /tmp.

Keuntungan yang pertama adalah bahwa apa pun yang terjadi, setelah aplikasi diinstal, Anda akan memiliki soket untuk digunakan. Keuntungan dari yang kedua adalah bahwa itu mungkin lebih kondusif untuk pemrograman waras. Keuntungan yang ketiga adalah tidak membutuhkan hak superuser. Seharusnya mudah untuk beralih dari satu implementasi ke implementasi lainnya jika Anda berubah pikiran nanti.

Akhirnya, ketika BatchyX muncul, Anda setidaknya harus menawarkan opsi konfigurasi untuk ini, kembali ke pilihan default Anda.

goldilocks
sumber
2
/runatau /var/runjuga sering digunakan untuk proses root.
BatchyX
Baik. Itu bahkan lebih tmp daripada /tmp. Saya akan mengeditnya.
goldilocks
/usrdapat dipasang sebagai hanya baca. File tidak boleh dibuat di sana saat runtime. Saran lainnya bagus.
jordanm
1
Terima kasih atas masukan Anda, diskusi ini sangat informatif. Saya memutuskan untuk membuat lokasi default /tmp/.APPNAME/.APPSOCKkarena daemon tidak memerlukan data persisten.
recursion.ninja
1
Perbedaan utama antara /tmpdan /run, adalah bahwa hanya root yang memiliki izin menulis /run.
BatchyX