ulimit -n не изменяется - значения limit.conf не действуют

13

Я пытаюсь поднять максимум дескриптора открытого файла для всех пользователей на машине с Ubuntu.

Этот вопрос является своего рода продолжением этого вопроса.

Ограничение дескриптора открытого файла. Параметр conf не читается ulimit, даже если требуется pam_limits.so

за исключением того, что я добавил необходимые «корневые» записи в limit.conf

Вот записи

*               soft    nofile           100000
*               hard    nofile           100000
root            soft    nofile           100000
root            hard    nofile           100000

Строки, связанные с pam_limits.soкомментариями во всех соответствующих файлах в /etc/pam.d/ и fs.file-maxбыли правильно установлены в /etc/sysctl.conf

Тем не менее, я все еще вижу

abc@machine-2:/etc/pam.d$ ulimit -n
1024

после перезагрузки.

В чем может быть проблема?

Моя оболочка по умолчанию - / bin / sh, и я не могу использовать chsh, чтобы изменить оболочку по умолчанию, так как мой пользователь на машине аутентифицирован с помощью некоторой распределенной схемы аутентификации.

Nerrve
источник
strace -o loglimit su - abc и после этого egrep "(limit | open)" loglimit, возможно, ваша конфигурация
pam
@ c4f4t0r, опция - для su вызывает новый логин только тогда, когда это последний аргумент. Я знаю это только потому, что просто читал эту справочную страницу. Также, как деталь, обычный пользователь не может связать двоичный файл suid root.
etherfish
В качестве пользователя root вы должны использовать команду strace -o loglimit su - abc
c4f4t0r
извините за спам , но у меня есть такой вопрос unix.stackexchange.com/questions/200310/...
vladeli

Ответы:

5

У меня была похожая проблема, но только с SSH логинами. Локальные логины (через консоль) соблюдаются /etc/security/limits.conf.

Как оказалось, при установке:

UsePrivilegeSeparation yes

в /etc/ssh/sshd_configфайле, тогда sshd разветвляет непривилегированного ребенка, чтобы настроить env учетной записи. Поскольку этот дочерний элемент непривилегирован, установка верхнего предела pam_limits.so не имела никакого эффекта.

Как только я установил

UsePrivilegeSeparation no

в /etc/ssh/sshd_configи отклонил службу SSH, тогда файл limit.conf был соблюден при входе в систему SSH.

user418149
источник
2
В моем случае я изменил sshd-config на UsePAM yes. (+1 за указание на sshd-config)
Рэндалл Уитмен,
4

Я подозреваю, что ulimit применяется профилем / etc / или ~ / .bashrc. Тот факт, что ваша система имеет сложную пам, я бы подтвердил, что что-то не так.

Я также подтвердил бы, что в /etc/security/limits.d/ нет файла с ошибками, который анализируется, как указано в pam_limits (8).

Я бы добавил параметр отладки в строку pam_limits.conf, необходимую для сеанса, и затем смотрел бы /var/log/auth.log при входе в систему.

Если ваш мягкий лимит составляет 1024, каков ваш жесткий лимит?

su должен получить новый, новый вход в систему с помощью аргумента -l.

su -l -s / bin / bash

Удачи.

etherfish
источник
мой жесткий лимит 4096, т. е.ulimit -Hn
Nerrve
4

На сервере Redhat вошли как root

/etc/security/limits.conf

user01  -       nofile  2048

команда strace зарегистрирована как root

strace -o loglimit su - user01

с другой оболочкой открыть логлимит

grep "limit" loglimit
open("/lib64/security/pam_limits.so", O_RDONLY) = 6
 ..........
 ..........
 open("/etc/security/limits.conf", O_RDONLY) = 3
 read(3, "# /etc/security/limits.conf\n#\n#E"..., 4096) = 1823
 open("/etc/security/limits.d", O_RDONLY|O_NONBLOCK|O_DIRECTORY) = 3
 setrlimit(RLIMIT_NOFILE, {rlim_cur=2*1024, rlim_max=2*1024}) = 0

Таким образом, я знаю, что pam_limits был загружен и limit.conf был прочитан, если ваш pam_limits был загружен, но вы все еще видите другие значения, используя ulimit -n, проверьте свой профиль оболочки, как сказал @etherfish

c4f4t0r
источник
3

У меня была такая проблема, вот что я сделал.

Команда strace напечатает все взаимодействия, которые процесс выполняет с внешними библиотеками, поэтому мы можем увидеть, загружен ли наш конфиг или нет.

Итак, я делаю, как предложено выше:

root:/etc/pam.d$ strace -o ~/loglimit su - glaudiston
glaudiston:~$ exit
logout
root:/etc/pam.d$ cat ~/loglimit | grep limits.conf

В моем выпуске журнал strace (strace -o log su - username) не имеет экземпляра текста ограничений, поэтому файл limit.conf НЕ был загружен.

Сначала я проверяю, что pam_limits.so ищет /etc/security/limits.conf

root:/etc/pam.d$ strings /lib/security/pam_limits.so | grep limits.conf
/etc/security/limits.conf

Итак, я проверяю, что модуль pam_limits.so загружается в режиме аутентификации в файлах, расположенных в /etc/pam.d ... например, в /etc/pam.d/su я добавил:

session   required    pam_limits.so

Теперь я могу сделать su для моего пользователя, и ограничения будут загружены. Вы можете повторить шаг strace, чтобы убедиться в этом.

Мой linux - LFS, поэтому я виноват в отсутствии pam_limits.so в файлах /etc/pam.d. В других дистрибутивах я не думаю, что это именно та проблема.

Но надеюсь, это поможет.

тонна
источник
1

В моем случае (Centos 6.10) strace показал, что после того, как лимит был установлен из /etc/security/limits.conf, позже в процессе входа в систему он был сброшен из /etc/security/limits.d/90-nproc.conf для всех не Пользователи root:

*          soft    nproc     1024
root       soft    nproc     unlimited
пятно
источник