UNIX Tip: Pozor na smazane, ale stale pouzivane soubory

Vladimir Macek macek na sandbox.cz
Úterý Únor 10 12:19:31 CET 2015


Chtel bych se s vami podelit o ponekud neprijemna zjisteni. Myslim, ze to
bude radu z vas novinka, za coz se ponekud zastydite jako ja. :-)

Mel jsem nejaky ten rok zato, ze prikaz

     lsof +L1

vypise vsechny soubory, ktere jsou na UNIX/Linuxovem systemu smazane, ale
stale zustavaji otevrene. Pro vysvetleni: Ke skutecnemu uvolneni diskovych
bloku po poslednim unlinku dochazi az po zavreni souboru vsemi procesy.
Proces muze pouzivat "smazanou" verzi souboru jak dlouho chce. Pomoci
symlinku v /proc/PID/fd se jde k obsahu smazaneho, ale neuvolneneho souboru
dostat, aspon v Linuxu. Po zavreni toho handlu uz tezko...

Nedavno jsem vsak zjistil, ze lsof klame telem... Jeste totiz muzou byt
soubory otevrene mapovanim. A to je zaludnejsi, protoze se tak "oteviraji"
sdilene knihovny, ktere mohou zustat stare i po bezpecnostnich
aktualizacich systemu, pokud se pouzivajici procesy nerestartuji!

lsof je vypisuje take, ale jinak: Ve sloupci FD je, jak zjistuju, slovo DEL.
Nebo je mozne porovnat cislo ve sloupci NODE s i-nodem aktualniho souboru
v te ceste. Dalsi moznosti je pouzit tento prikaz:

     egrep -l '\(deleted\)$' /proc/*/maps | tr -cd 0-9\\n | xargs -r ps uw

Ten pekne vypise vsechny procesy s mapovanymi zastaralymi soubory. Vsimnete si
tez hezkeho triku s tr. Pro standardne otevrene soubory lze pouzit toto:

     find -L /proc/[0-9]*/fd -maxdepth 1 -links -1 -printf "%h\n" 2>/dev/null \
     | tr -cd 0-9\\n | xargs -r ps uw

Zkombinovani obou kolon do jedne ponechme jako domaci cviceni. :-)

Sam vsak pouzivam v cronu toto:

     lsof | egrep ' DEL |\(deleted\)$' \
     | egrep -v -f /etc/allowed_deleted_but_used_files \
     | sed -e 's/^/DELETED-USED-FILE: /'

V souboru /etc/allowed_deleted_but_used_files mam vzorky toho, o cem nechci
byt informovan. Varovani: Tento soubor regularnich vyrazu nesmi obsahovat
prazdny radek! Pro INSPIRACI nektere vzorky (ale radeji si vytvorte svuj
soubor):

^apache2 .* /var/run/apache2/(ssl_mutex|wsgi\.[0-9.]+\.lock) \(deleted\)$
^mysqld .* /var/tmp/ib...... \(deleted\)$
^imap .* /var/home/[^ ]+/dovecot(\.index|-uidlist) \(deleted\)$
^(apache2|sshd) .* /dev/zero$
 /SYSV[0-9a-f]{8}$
^(cron|sh|run-parts|curl|sh|gpg) .* (/var)?/tmp/tmpf...... \(deleted\)$

Muzete pouzit prepinac lsof -s pro vypsani sloupce s velikosti smazaneho
souboru. Pokud pouzivate Linuxovou verzi lsof, optimalizujte jeho beh
vynechanim sitovych spojeni (-X). Prepinac -R pro vypis PID rodicovskych
procesu se taky muze hodit.

Dosti mi to prislo vhod pred par dny. Na stale podporovanem Debianu Squeeze
LTS jsem nainstaloval aktualizace:

[UPGRADE] libgssapi-krb5-2 1.8.3+dfsg-4squeeze8 -> 1.8.3+dfsg-4squeeze9
[UPGRADE] libgssrpc4 1.8.3+dfsg-4squeeze8 -> 1.8.3+dfsg-4squeeze9
[UPGRADE] libk5crypto3 1.8.3+dfsg-4squeeze8 -> 1.8.3+dfsg-4squeeze9
[UPGRADE] libkadm5clnt-mit7 1.8.3+dfsg-4squeeze8 -> 1.8.3+dfsg-4squeeze9
[UPGRADE] libkadm5srv-mit7 1.8.3+dfsg-4squeeze8 -> 1.8.3+dfsg-4squeeze9
[UPGRADE] libkdb5-4 1.8.3+dfsg-4squeeze8 -> 1.8.3+dfsg-4squeeze9
[UPGRADE] libkrb5-3 1.8.3+dfsg-4squeeze8 -> 1.8.3+dfsg-4squeeze9
[UPGRADE] libkrb5support0 1.8.3+dfsg-4squeeze8 -> 1.8.3+dfsg-4squeeze9

Mel jsem zato, ze upgrade restartuje procesy, ktere .so knihovny pouzivaji.
Mam zato, ze drive se to tak aspon delavalo. :-) Ale tentokrat tomu tedy
tak nebylo... apache2, sshd, dovecot, kvm, ... vsechny takoveto nevinne
procesy i po security
aktualizaci (urgency=high) stale pouzivaly stare verze...

---

Tez jsem nasel, ze v Debianu/Ubuntu je balik debian-goodies, ktery mj.
obsahuje skript checkrestart (ukecaneji s -v). Na Fedore je podobny:
needs-restarting. Detekuje prave procesy se startymi knihovnami a pise
doporuceni, co delat.

Mimochodem, zajimavost: lsof -P je sikovny prepinac pro vypis sitovych
spojeni (-i). Dlouho jsem ho chtel: Vypne preklad cisel portu na nazvy,
lepe se v tom pak hleda. Prepinac -n snad zna kazdy casty uzivatel lsof ci
netstatu. A posledni zajimavost, vedeli jste, ze uz par let existuje
protokol c. 136 s nazvem UDPLITE? :-)

Dekuji za pozornost, snad vam to k necemu bude.
Uvitam prispevky k tomuto tematu. :-)

-- 
:  Vladimir Macek  :  http://macek.sandbox.cz  :  +420 608 978 164
:  UNIX && Dev || Training  :  Python, Django  :  PGP key 97330EBD




Další informace o konferenci Linux