Как я настраиваю вход для ulimits?

Обычно да; rsync работы путем проверки, существует ли файл, то, если его контрольная сумма не является тем же, то, если части файла имеют ту же контрольную сумму, то передают части, которые имеют другую контрольную сумму (или, отступая к передаче всего файла, если это отсутствует или невозможно найти часть, которая имеет контрольную сумму соответствия с обеих сторон). Таким образом, если у Вас есть файл с тем же именем, но совершенно другое содержание, может быть более дешево передать целый файл вместо различия.

Никакое состояние не сохранено за пределами самого файла, таким образом, не имеет значения, использовали ли Вы rsync прежде. Содержание в файле является единственной вещью это rsync использование для решения, что передать.

4
25.06.2014, 00:06
2 ответа

Для этого нужно проверить исходный код ядра.

Пример:

Таймеры процессора в ядре linux (posix-cpu-timers.c) просто отправит SIGKILL в процесс нарушения, когда будет достигнут жёсткий лимит. Мягкий лимит запускает SIGXCPU один раз в секунду, а также Watchdog-сообщение.

Вы можете искать другие лимиты и/или сигналы для получения более подробной информации.

.
1
27.01.2020, 20:56

Вы можете использовать аудит для регистрации сбоев соответствующих системных вызовов (syscalls), хотя не каждое превышение проявляется таким образом. Например, как Хенк Лангельд указал, что превышение RLIMIT_RTTIME заставляет ядро посылать сигнал.

Возьмем, к примеру, RLIMIT_NOFILE Предел:

Определяет значение на единицу больше, чем максимальный номер дескриптора файла, который может быть открыт этим процессом. Попытки ( открыть (2) , трубу (2), дублировать (2), и т.д.) при превышении этого предела выдается погрешность EMFILE . (Исторически сложилось так. лимит был назван RLIMIT_OFILE на BSD.)

Поэтому вам придется следить, например, за системным вызовом open. В его man page написано:

RETURN VALUE

open(), openat(), и creat() возвращает новый дескриптор файла, или -1, если произошла ошибка (в этом случае соответствующим образом устанавливается errno ).

ERRORS

open(), openat() и creat() могут возникнуть следующие ошибки:

EMFILE - В процессе уже открыто максимальное количество файлов.

Это означает, что необходимо проконтролировать системные блоки open, которые не работают с EMFILE. На странице man-страницы указано, что open возвращает -1 и устанавливает errno в EMFILE, но на самом деле происходит то, что открытый syscall возвращает -EMFILE и glibc преобразует его в -1 и устанавливает errno в EMFILE *.

Теперь, когда мы это исправили, давайте добавим правило аудита:

[root@h ~]# auditctl -a always,exit -F arch=`uname -m` -S open \
                                    -F uid=ciupicri -F exit=-EMFILE -k "UL-SE"

Давайте проверим лимиты:

[ciupicri@h ~]$ ulimit -n 10
[ciupicri@h ~]$ python -c 'from __future__ import print_function; f = [(print(i), open("/etc/passwd")) for i in range(10)]'
0
1
2
3
4
5
6
7
Traceback (most recent call last):
  File "<string>", line 1, in <module>
IOError: [Errno 24] Too many open files: '/etc/passwd'

И проверим журналы:

[root@h ~]# ausearch --start recent -k UL-SE
...
time->Wed Jun 25 21:27:37 2014
type=PATH msg=audit(1403720857.418:63): item=0 name="/etc/passwd" nametype=UNK
NOWN
type=CWD msg=audit(1403720857.418:63):  cwd="/home/ciupicri"
type=SYSCALL msg=audit(1403720857.418:63): arch=40000003 syscall=5 success=no 
exit=-24 a0=8ed72e0 a1=8000 a2=1b6 a3=8f24d11 items=1 ppid=1110 pid=1139 auid=
5000 uid=5000 gid=5000 euid=5000 suid=5000 fsuid=5000 egid=5000 sgid=5000 fsgi
d=5000 tty=pts3 ses=2 comm="python" exe="/usr/bin/python" subj=unconfined_u:un
confined_r:unconfined_t:s0-s0:c0.c1023 key="UL-SE"
...

В "Руководстве по безопасности" для Red Hat Enterprise Linux 6 есть "Аудит системы" глава, в которой вы можете прочитать больше по этой теме.

* Спасибо за указание на это в fche.

3
27.01.2020, 20:56

Теги

Похожие вопросы