ulimit: sự khác biệt giữa giới hạn cứng và mềm


87

Sự khác biệt giữa giới hạn cứng và mềm trong ulimit là gì?

Đối với số lượng tệp đang mở, tôi có giới hạn mềm là 1024 và giới hạn cứng là 10240. Có thể chạy các chương trình mở hơn 1024 tệp. Giới hạn mềm là gì?


4
Bạn đang nói về ulimit -n? Hãy thử chạy shell với giá trị rất thấp ( bash -c 'ulimit -n 4; exec 3>a; exec 4>b; exec 5>c'). Đầu ra là gì?
Gilles

Câu trả lời:


77

Một giới hạn cứng chỉ có thể được nâng lên bằng root (bất kỳ quá trình nào cũng có thể hạ thấp nó). Vì vậy, nó rất hữu ích cho bảo mật: một quá trình không root có thể vượt qua giới hạn cứng. Nhưng thật bất tiện khi một quy trình không root có thể có giới hạn thấp hơn so với con của nó.

Một giới hạn mềm có thể được thay đổi bởi quá trình bất cứ lúc nào. Vì vậy, nó thuận tiện miễn là các quy trình hợp tác, nhưng không tốt cho bảo mật.

Trường hợp sử dụng thông thường cho các giới hạn mềm là vô hiệu hóa các kết xuất lõi ( ulimit -Sc 0) trong khi vẫn giữ tùy chọn bật chúng cho một quy trình cụ thể mà bạn đang gỡ lỗi ( (ulimit -Sc unlimited; myprocess)).

Lệnh ulimitshell là một trình bao bọc xung quanh lệnh setrlimitgọi hệ thống, vì vậy đó là nơi bạn sẽ tìm thấy tài liệu chính thức.

Lưu ý rằng một số hệ thống có thể không thực hiện tất cả các giới hạn. Cụ thể, một số hệ thống không hỗ trợ giới hạn mỗi quy trình đối với bộ mô tả tệp (Linux hiện); nếu bạn không, lệnh shell có thể là lệnh không.


6
+1 cho trường hợp sử dụng giới hạn mềm. Giới hạn kích thước cài đặt thường trú ( ulimit -m, RLIMIT_RSS) là một ví dụ về giới hạn không còn hiệu lực trên Linux nữa. Giới hạn bộ nhớ ảo ( ulimit -v, RLIMIT_AS) hoạt động, mặc dù.
Adam Zalcman

@Gilles, ý bạn là không khởi động lại quá trình, khi chúng ta thay đổi giới hạn mềm, nó có thể có hiệu lực ngay lập tức?
Ryan

1
@Ryan Có, một chương trình có thể thay đổi giới hạn mềm của chính mình bất cứ lúc nào bằng cách gọi setrlimit(trong phạm vi được giới hạn cứng cho phép trừ khi chạy bằng root tất nhiên). Hầu hết các chương trình không có lệnh cho phép người dùng thực hiện điều đó, nhưng bạn có thể thử đính kèm chương trình với trình gỡ lỗi và thực hiện setrlimitcuộc gọi hoặc trong Linux bạn có thể gọi prlimit(mà tôi không biết về bất kỳ trình bao nào tiện ích).
Gilles

1
Bây giờ có một prlimittiện ích shell quá.
telcoM

0

Giới hạn cứng là cho mục đích bảo mật. Đối với người dùng không root, anh ta chỉ có thể giảm giới hạn cứng từ giới hạn cứng hiện được đặt; anh ta không thể tăng nó Việc tăng giới hạn cứng chỉ có thể được thực hiện bởi người dùng root (hoặc có thể với đặc quyền sudo, không chắc chắn về điều đó). Những gì người dùng không phải root có thể làm là chọn một giới hạn (gọi là giới hạn mềm) có thể nằm trong phạm vi [0, giới hạn cứng] cho các quy trình của nó. Đó là giới hạn mềm được xem xét và xem xét bởi các quy trình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.