SELinux a RLIMIT_NOFILE

Jan Kasprzak kas na fi.muni.cz
Pátek Červen 19 17:58:39 CEST 2020


	Dobré odpoledne,

mám takovýto problém a už nevím kam se dívat:

Je nedobře napsaná aplikace (pdftex), která po sobě neuzavírá soubory,
takže když má zpracovat 10k souborů, tak po cca 1013 souborech spadne
s too many open files.

Aplikace je spouštěná z démona, kterému jsem teda zkusil nastavit hard i soft
limit RLIMIT_NOFILE na 20k souborů. Podle /proc/<pid>/limits je tento limit
skutečně nastavený:

# grep 'open files' /proc/<pid démona>/limits
Max open files            20480                20480                files     

Nicméně pdftex spouštěný přes fork+exec (ne přes shell) má soft limit
zpátky na 1024, a pak samozřejmě spadne:

# grep 'open files' /proc/<pid pdftexu>/limits
Max open files            1024                 20480                files     

Zkoušel jsem na toho démona volat strace -f, po fork() je vidět ještě
testovací getrlimit() který jsem tam přidal, a který vrací očekávaných
{ 20480, 20480 }. Pak je execve() toho pdftexu, není tam dál vidět
žádný pokus o setrlimit(), ale přesto to podle /proc má snížený soft
limit a na konci to samozřejmě spadne.

Divné na tom je, že když řeknu "setenforce 0", tak to projde.
Pak zase vrátím na "setenforce 1" a spadne to při open() s -EMFILE.

A teď nevím jestli mi strace ukazuje pod SElinuxem skutečnost,
nebo mi někde něco skrývá, anebo SELinux má ještě své vlastní limity
na počet otevřených souborů, anebo co dalšího se tam může dít.
Neumím si představit, jak se stane, že potomek (pdftex) má najednou
jiný soft limit RLIMIT_NOFILE než rodič, aniž by volal setrlimit().

Démon i pdftex mají své SELinuxové domény, v audit logu jsem nic
podezřelého nenašel (ale může být něco dontauditovaného).

Napadá vás někoho, kam se dál dívat? Díky.

-Y.

-- 
| Jan "Yenya" Kasprzak <kas at {fi.muni.cz - work | yenya.net - private}> |
| http://www.fi.muni.cz/~kas/                         GPG: 4096R/A45477D5 |
IORING_OP_NOP ... the benefits of doing nothing asynchronously are minimal,
but sometimes a placeholder is useful.             --Jonathan Corbet at LWN


Další informace o konferenci Linux