các giá trị ulimit mặc định được đặt ở đâu? (linux, centos)


34

Tôi có hai máy chủ CentOS 5 với thông số kỹ thuật gần như giống hệt nhau. Khi tôi đăng nhập và làm ulimit -u, trên một máy tôi nhận được unlimited, và trên máy khác tôi nhận được 77824.

Khi tôi chạy một cron như:

* * * * * ulimit -u > ulimit.txt

Tôi nhận được kết quả tương tự ( unlimited, 77824).

Tôi đang cố gắng xác định nơi chúng được đặt để tôi có thể thay đổi chúng. Họ không được thiết lập trong bất kỳ hồ sơ của tôi ( .bashrc, /etc/profile, vv). Những điều này sẽ không ảnh hưởng đến cron nào) cũng như trong /etc/security/limits.conf(trống rỗng).

Tôi đã lùng sục google và thậm chí còn đi xa để làm grep -Ir 77824 /, nhưng cho đến nay vẫn chưa có gì. Tôi không hiểu làm thế nào những máy này có thể được cài sẵn với các giới hạn khác nhau.

Tôi thực sự tự hỏi không phải cho các máy này, mà là cho một máy khác (CentOS 6) có giới hạn 1024, quá nhỏ. Tôi cần chạy các công việc định kỳ với giới hạn cao hơn và cách duy nhất tôi biết cách thiết lập công việc đó là trong chính công việc định kỳ. Điều đó ổn, nhưng tôi muốn thiết lập hệ thống rộng hơn để nó không bị hack.

Cảm ơn vì bất kì sự giúp đỡ. Điều này có vẻ như nó phải dễ dàng (KHÔNG).


EDIT - GIẢI QUYẾT

Ok, tôi đã tìm ra điều này. Có vẻ như đó là một vấn đề với CentOS 6 hoặc có lẽ là cấu hình máy của tôi. Trên cấu hình CentOS 5, tôi có thể thiết lập /etc/security/limits.conf:

* - nproc unlimited

và điều đó sẽ cập nhật hiệu quả các tài khoản và giới hạn cron. Tuy nhiên, điều này không hoạt động trong hộp CentOS 6 của tôi. Thay vào đó, tôi phải làm:

myname1 - nproc unlimited
myname2 - nproc unlimited
...

Và mọi thứ hoạt động như mong đợi. Có thể đặc tả UID hoạt động, nhưng ký tự đại diện (*) chắc chắn KHÔNG CÓ ở đây. Điều kỳ lạ là các ký tự đại diện làm việc cho nofilegiới hạn.

Tôi vẫn rất muốn biết các giá trị mặc định thực sự đến từ đâu, bởi vì theo mặc định, tệp này trống và tôi không thể hiểu tại sao tôi có các giá trị mặc định khác nhau cho hai hộp CentOS, có phần cứng giống hệt nhau và từ cùng một nhà cung cấp .


3
Bạn có gì trong đó /etc/security/limits.d/không?
Patrick

Không, thư mục đó trống rỗng
nomercysir

1
Bạn có thể đăng câu trả lời dưới dạng câu trả lời thực tế sau một khoảng thời gian chờ đợi nhất định.
sysadmin1138

2
Tôi đã từng nhìn nó ở đâu đó. Mặc định được đặt bởi kernel. Một phần được mã hóa cứng, một phần phụ thuộc vào ram có sẵn. Tôi nghĩ rằng tôi đã tìm thấy điều đó trên Oracle Metalink trong bối cảnh thiết lập SLES10 cho Oracle-DB 11.2
Nils

1
Câu hỏi này có thể được đánh dấu là đã giải quyết?

Câu trả lời:


45

Các giới hạn "mặc định" này được áp dụng bởi:

  • các hạt nhân Linux tại thời gian khởi động (cho initquá trình),
  • kế thừa , từ giới hạn của quy trình cha mẹ (tại fork(2)thời điểm),
  • PAM khi phiên người dùng được mở (có thể thay thế giá trị kernel / kế thừa),
  • các quá trình tự (có thể thay thế PAM & kernel / giá trị được thừa kế, xem setrlimit(2)).

Quá trình người dùng bình thường không thể tăng giới hạn cứng.

Nhân Linux

Khi khởi động, Linux đặt các giới hạn mặc định cho initquy trình, sau đó được kế thừa bởi tất cả các quy trình (con) khác. Để xem những giới hạn này : cat /proc/1/limits.

Ví dụ: mặc định kernel cho số lượng mô tả tệp tối đa ( ulimit -n) là 1024/1024 (mềm, cứng) và đã được nâng lên 1024/4096 trong Linux 2.6,39.

Số lượng quy trình tối đa mặc định mà bạn đang nói đến bị giới hạn ở mức xấp xỉ:

Total RAM in kB / 128

cho x86 kiến trúc (ít nhất), nhưng phân phối đôi khi thay đổi giá trị hạt nhân mặc định, vì vậy kiểm tra mã nguồn kernel cho kernel/fork.c, fork_init(). Giới hạn "số lượng quy trình" được gọi là RLIMIT_NPROC ở đó.

PAM

Thông thường, để đảm bảo xác thực người dùng khi đăng nhập, PAM được sử dụng cùng với một số mô-đun (xem /etc/pam.d/login).

Trên Debian, mô-đun PAM chịu trách nhiệm thiết lập các giới hạn có ở đây : /lib/security/pam_limits.so.

Thư viện này sẽ đọc cấu hình của nó từ /etc/security/limits.conf/etc/security/limits.d/*.conf, nhưng ngay cả khi các tệp đó trống, pam_limits.so có thể sử dụng các giá trị được mã hóa cứng mà bạn có thể kiểm tra trong mã nguồn.

Ví dụ: trên Debian, thư viện đã được vá để theo mặc định, số lượng tiến trình ( nproc) tối đa là không giới hạn và số lượng tệp ( nofile) tối đa là 1024/1024:

  case RLIMIT_NOFILE:
      pl->limits[i].limit.rlim_cur = 1024;
      pl->limits[i].limit.rlim_max = 1024;

Vì vậy, hãy kiểm tra mã nguồn mô-đun PAM của CentOS (tìm RLIMIT_NPROC).

Tuy nhiên, xin lưu ý rằng nhiều quy trình sẽ không trải qua PAM (thông thường, nếu chúng không được khởi chạy bởi người dùng đã đăng nhập, như trình nền và có thể là các công việc định kỳ).


Đúng, điểm lấy, bình luận loại bỏ. Tôi đoán tôi sẽ nói rằng đối với hầu hết người dùng, PAM có thể đã được bật, vì vậy tôi khuyên bạn nên kiểm tra các tệp /etc/security/limits.conf và /etc/security/limits.d/* của bạn trước. Trong trường hợp cụ thể này, mà tôi cũng gặp phải, có giới hạn 1024 quy trình / tổng số luồng người dùng được áp đặt theo mặc định trong CentOS 6 thông qua tệp giới hạn.d.
rogerdpack

@rogerdpack có, PAM chắc chắn đã được bật, nhưng, một lần nữa, như tôi đã nói trong câu trả lời của mình: "xin lưu ý rằng nhiều quy trình sẽ không thông qua PAM (thông thường, nếu chúng không được người dùng đăng nhập, như daemon và có thể là cron việc làm) ". Thảo luận của chúng tôi không có giá trị gia tăng, do đó, nếu bạn xóa tất cả các nhận xét của mình, tôi sẽ xóa thông tin của tôi. Cảm ơn bạn.
Totor

Các bản phân phối SuSE có gói ulimit cung cấp /etc/initscript- "một nơi thuận tiện để điều chỉnh theo giới hạn quy trình", có thể định cấu hình qua /etc/sysconfig/ulimit.
sendmoreinfo

Ngoài ra, thư viện Linux-PAM đọc các giới hạn được đặt bởi kernel (tức là /proc/1/limits) kể từ phiên bản 1.1.4 (phát hành 2011).
sendmoreinfo

@sendmoreinfo và thư viện Linux-PAM làm gì với các giới hạn được đặt bởi kernel ngoài việc đọc chúng?
Totor

15

Trên RHEL6 (CentOS6), "quy trình người dùng tối đa" được đặt thành 1024 theo mặc định.
Bạn có thể thay đổi giá trị này trong tệp:

/etc/security/limits.d/90-nproc.conf

Xem https://ormszilla.redhat.com/show_orms.cgi?id=432903 nếu bạn muốn phàn nàn về nó :)


Tôi nghi ngờ giá trị 1024 này cho nproc là chính xác và tác giả nói rằng dir.d.d của nó trống, vì vậy giá trị mặc định rõ ràng không được xác định ở đó.
Totor

Totor không thể tranh luận với bạn về mặt kỹ thuật nhưng Tom tôi thấy nó hữu ích vì vậy cảm ơn!
Một phần mây

3

Khi bạn kiểm tra các giới hạn, bạn có đang sử dụng người dùng root để làm như vậy không?

Từ limits.conftrang hướng dẫn:

LƯU Ý: giới hạn nhóm và ký tự đại diện không được áp dụng cho người dùng root. Để đặt giới hạn cho người dùng root, trường này phải chứa gốc tên người dùng bằng chữ.

Sử dụng tên người dùng rõ ràng sẽ giải quyết vấn đề trong trường hợp này.


Hãy cẩn thận, đây có lẽ là một cụ Debian "tính năng".
Toto

Ngoài ra, limits.conftập tin trống (như limits.dthư mục).
Toto

3

Thông tin về điều này là khủng khiếp trên internet, đây là tệp giới hạn. Tôi đã tạo cho debian linux, hiển thị tất cả các tùy chọn có thể và giới hạn "an toàn" tối đa của chúng, điều chỉnh cho phù hợp.

Đây là những giá trị cao nhất bạn có thể đặt, một số thứ được băm ra, kích hoạt những nguyên nhân khiến bạn gặp lỗi và không thể đăng nhập vào bảng điều khiển của bạn, tự sửa đổi các tùy chọn nhận xét có nguy cơ, nhưng bạn không cần (mặc định là không giới hạn hầu hết)

Tôi hy vọng điều này hữu ích với ai đó, vì tôi không thể tìm thấy thông tin này ở bất cứ đâu, có 4 giờ nghiên cứu về tập tin này.

==== FILE START =====
# /etc/security/limits.conf
# 
#Each line describes a limit for a user in the form:
#
#<domain>        <type>  <item>  <value>
#
#Where:
#<domain> can be:
#- a user name
#- a group name, with @group syntax
#- the wildcard     *, for default entry
#- the wildcard %, can be also used with %group syntax,
#         for maxlogin limit
#- NOTE: group and wildcard limits are not applied to     root.
#  To apply a limit to the     root user, <domain> must be
#  the literal username     root.
#
#<type> can have the two values:
#- "soft" for enforcing the soft limits
#- "hard" for enforcing hard limits
#
#<item> can be one of the following:
#- core - limits the core file size (KB)
#- data - max data size (KB)
#- fsize - maximum filesize (KB)
#- memlock - max locked-in-memory address space (KB)
#- nofile - max number of open files
#- rss - max resident set size (KB)
#- stack - max stack size (KB)
#- cpu - max CPU time (MIN)
#- nproc - max number of processes
#- as - address space limit (KB)
#- maxlogins - max number of logins for this user
#- maxsyslogins - max number of logins on the system
#- priority - the priority to run user process with
#- locks - max number of file locks the user can hold
#- sigpending - max number of pending signals
#- msgqueue - max memory used by POSIX message queues (bytes)
#- nice - max nice priority allowed to raise to values: [-20, 19]
#- rtprio - max realtime priority
#- chroot - change     root to directory (Debian-specific)
#
#<domain>      <type>  <item>         <value>
#

#*               soft    core            0
#root            hard    core            100000
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#ftp             -       chroot          /ftp
#@student        -       maxlogins       4

# -- Defaults:
#(core) core file size                (blocks, -c) 0 (ulimit -Hc or -Sc)
#(data) data seg size                  (bytes, -d) unlimited
#(priority) scheduling priority               (-e) 0
#(fsize) file size                    (blocks, -f) unlimited
#(sigpending) pending signals                 (-i) 378197
#(memlock) max locked memory          (kbytes, -l) 64
# max memory size                     (kbytes, -m) unlimited
#(nofile) open files                          (-n) 65536
# pipe size                        (512 bytes, -p) 8
#(msgqueue) POSIX message queues       (bytes, -q) 819200
#(rtprio) real-time priority                  (-r) 0
#(stack) stack size                   (kbytes, -s) 8192
#(cpu) cpu time                      (seconds, -t) unlimited
#(nproc) max user processes                   (-u) 378197
# virtual memory                      (kbytes, -v) unlimited
#(locks) file locks                           (-x) unlimited

# --     root Limits:
root               -    core            -1
root               -    data            -1
root               -    fsize           -1
root               -    memlock         -1
root               -    nofile          999999
root               -    stack           -1
root               -    cpu             -1
root               -    nproc           -1
root               -    priority        0
root               -    locks           -1
root               -    sigpending      -1
root               -    msgqueue        -1
root               -    rtprio          -1
root               -    maxlogins       -1
root               -    maxsyslogins    -1
#root               -    rss             -1
#root               -    as              -1
#root               -    nice            0
#root               -    chroot          -1

#All Users:
# -- Hard Limits
*               hard    core            -1
*               hard    data            -1
*               hard    fsize           -1
*               hard    memlock         -1
*               hard    nofile          999999
*               hard    stack           -1
*               hard    cpu             -1
*               hard    nproc           -1
*               hard    priority        0
*               hard    locks           -1
*               hard    sigpending      -1
*               hard    msgqueue        -1
*               hard    rtprio          -1
*               hard    maxlogins       -1
*               hard    maxsyslogins    -1
#*               hard    rss             -1
#*               hard    as              -1
#*               hard    nice            0
#*               hard    chroot          -1

# -- Soft Limits
*               soft    core            -1
*               soft    data            -1
*               soft    fsize           -1
*               soft    memlock         -1
*               soft    nofile          999999
*               soft    stack           -1
*               soft    cpu             -1
*               soft    nproc           -1
*               soft    priority        0
*               soft    locks           -1
*               soft    sigpending      -1
*               soft    msgqueue        -1
*               soft    maxlogins       -1
*               soft    maxsyslogins    -1
*               soft    rtprio          -1
#*               soft    rss             -1
#*               soft    as              -1
#*               soft    nice            0
#*               soft    chroot          -1

#randomuser:
# -- Soft Limits
randomuser           soft    core            -1
randomuser           soft    data            -1
randomuser           soft    fsize           -1
randomuser           soft    memlock         -1
randomuser           soft    nofile          999999
randomuser           soft    stack           -1
randomuser           soft    cpu             -1
randomuser           soft    nproc           -1
randomuser           soft    priority        0
randomuser           soft    locks           -1
randomuser           soft    sigpending      -1
randomuser           soft    msgqueue        -1
randomuser           soft    maxlogins       -1
randomuser           soft    maxsyslogins    -1
randomuser           soft    rtprio          -1
#randomuser           soft    rss             -1
#randomuser           soft    as              -1
#randomuser           soft    nice            0
#randomuser           soft    chroot          -1

# End of file

2

kernel / fork.c

max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);

Trên 64 bit Kích thước luồng là 8192

 grep -i total /proc/meminfo 
 MemTotal:        8069352 kB

Bây giờ tôi nhận được tổng số kb chia cho 4

 echo $((8069352/4))
 2017338

Bây giờ tôi đã có số lượng trang

 echo $((8 * 8192 / 4096)
 16

Kết quả cuối cùng là

echo $((2017338/16))
126083

Theo cách này, bạn có tham số luồng tối đa và giới hạn quy trình người dùng mặc định là một nửa

init_task.signal->rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;
init_task.signal->rlim[RLIMIT_NPROC].rlim_max = max_threads/2;

ulimit từ gốc

ulimit -u
62932
echo $((62932*2))
125864 #we are near

1

Nó dường như là /etc/security/limits.conf

http://ss64.com/bash/limits.conf.html


1
Tôi đã đề cập rằng trong bài viết của tôi rồi. Nó không có hiệu lực, cũng không có các giá trị đó (không giới hạn, 77824) được đặt ở đó cho các máy tương ứng (tệp đó trống).
nomercysir

oh tôi thấy bạn đã kiểm tra .bashrc, v.v. nhưng không thấy bạn cũng đề cập đến cái này.
jamesbtate

1

Có một khả năng nữa là cấu hình cho "noproc" không hoạt động trong khi định cấu hình trong /etc/security/limits.conf.

Có thêm một tệp ghi đè cấu hình của bạn /etc/security/limits.d/90-nproc.conf.

* nproc 1024 mềm
root mềm nproc không giới hạn

Ở đây * config sẽ ghi đè bất cứ thứ gì bạn đặt trong tệp cấu hình trước đó. Vì vậy, lý tưởng bạn cấu hình cài đặt của bạn trong tập tin này.

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.