ulimit: perbedaan antara batas keras dan lunak

87

Apa perbedaan antara batas keras dan lunak dalam ulimit?

Untuk jumlah file terbuka, saya memiliki batas lunak 1024 dan batas keras 10240. Dimungkinkan untuk menjalankan program yang membuka lebih dari 1024 file. Untuk apa batas lunaknya?

daniel kullmann
sumber
4
Apakah Anda berbicara tentang ulimit -n? Coba jalankan shell dengan nilai yang sangat rendah ( bash -c 'ulimit -n 4; exec 3>a; exec 4>b; exec 5>c'). Apa hasilnya?
Gilles

Jawaban:

77

Batas keras hanya dapat dinaikkan oleh root (proses apa pun dapat menurunkannya). Jadi ini berguna untuk keamanan: proses non-root tidak bisa melampaui batas keras. Tetapi tidak nyaman karena proses non-root tidak dapat memiliki batas yang lebih rendah daripada anak-anaknya.

Batas lunak dapat diubah oleh proses kapan saja. Jadi nyaman selama proses bekerja sama, tetapi tidak baik untuk keamanan.

Kasus penggunaan umum untuk batas lunak adalah untuk menonaktifkan dump inti ( ulimit -Sc 0) sambil tetap mempertahankan opsi untuk memungkinkannya untuk proses tertentu yang Anda debug ( (ulimit -Sc unlimited; myprocess)).

The ulimitperintah shell adalah pembungkus sekitar setrlimitsystem call, sehingga di situlah Anda akan menemukan dokumentasi yang definitif.

Perhatikan bahwa beberapa sistem mungkin tidak menerapkan semua batasan. Secara khusus, beberapa sistem tidak mendukung batas per-proses pada deskriptor file (Linux mendukung); jika Anda tidak, perintah shell mungkin no-op.

Gilles
sumber
6
+1 untuk kasus penggunaan batas lunak. Batas ukuran set penduduk ( ulimit -m, RLIMIT_RSS) adalah contoh batas yang tidak lagi efektif di Linux. Batas memori virtual ( ulimit -v, RLIMIT_AS) berfungsi, meskipun.
Adam Zalcman
@Gilles, maksud Anda tanpa memulai kembali proses, ketika kami mengubah batas lunak, itu bisa langsung berpengaruh?
Ryan
1
@Ryan Ya, program dapat mengubah batas lunaknya sendiri kapan saja dengan menelepon setrlimit(sejauh diizinkan oleh batas keras kecuali berjalan sebagai root tentu saja). Sebagian besar program tidak memiliki perintah yang memungkinkan pengguna melakukan itu, tetapi Anda dapat mencoba melampirkan ke program dengan debugger dan membuatnya mengeluarkan setrlimitpanggilan, atau di Linux Anda dapat memanggil prlimit(yang saya tidak tahu shell apa pun) utilitas).
Gilles
1
Sekarang ada prlimitutilitas shell juga.
telcoM
0

Batas kerasnya adalah untuk tujuan keamanan. Untuk pengguna non-root, ia hanya dapat mengurangi batas hard dari batas hard yang ditetapkan saat ini; dia tidak bisa meningkatkannya. Meningkatkan batas keras hanya dapat dilakukan oleh pengguna root (atau mungkin dengan hak istimewa sudo, tidak yakin tentang itu). Apa yang dapat dilakukan oleh pengguna non-root adalah memilih batas (disebut batas lunak) yang dapat berada dalam kisaran [0, batas keras] untuk prosesnya. Ini adalah batas lunak yang dilihat dan dipertimbangkan oleh proses.

Ankit Shubham
sumber