2011. április 11., hétfő

Pokoli AIX adminisztrátor - XCOFF file header módosítása

Ilyen is ritkán fordul elő, de néha azért csak szembejön, úgy hogy gondoltam megér egy újabb blog bejegyzést.
Éppen aktuális szituáció: Az audit subsystem által generált $trail file-t nem képes az auditcat rotálni.
Mint kiderült a (/etc/security/audit/bincmds file) subsystem az alábbi parancs futtatása során vérzett el (persze futás közben hibaüzenetet sehova nem akar írni)
test_server@root:/ # /usr/sbin/auditcat -p -o /var/log/eprise/working -r /var/log/eprise/bin1
auditcat: ** out of memory
auditcat: Not enough space
Na akkor nézzük mink is van
- 1 alap bin file-unk, ami rendesen meg is hízott:
test_server@root:/ # ls -l /var/log/eprise/bin1
-rw-rw---- 1 root system 541955176 Apr 11 11:09 /var/log/eprise/bin1
- 1 éppen 0ás méretű working out file-unk
test_server@root:/ # ls -l /var/log/eprise/working
-rw-r----- 1 root system 0 Apr 11 11:06 /var/log/eprise/working
- A jelek szerint elég memória:
test_server@root:/ # svmon -G |head -2
size inuse free pin virtual
memory 950272 565469 384803 216798 475335
A log alapján még valami hely hibába is belefutottunk, de mivel a /var/log/eprise alatt van elég hely, így kicsit tanácstalan vagyok merre is induljak el.. Szóval inkább sorba megyek, és foglalkozok a memória "hibával".
És itt jön a képbe az alábbi kis kérdés: Mire jó az XCOFF header? :)
Egyik pozitívuma, hogy vannak olyan (a headerben meghatározott) entry-k amiket azért lehet piszkálni is.. Az 1ik ilyen a maxdata változó.
Definíció szerint a következőre használható: "Specifies the maximum data size (in bytes) allowed for this executable. If the value is 0, the system default maximum data size is used.". Az alapértelmezett az 256 MB legjobb tudomásom szerint, úgy hogy a kutya egy része tutira itt van elásva, már ha a maxdata nincs beállítva:
test_server@root:/ # od -HAx -N4 -j76 /usr/sbin/auditcat |head -1
0000000 00000000
Vagy ha valaki valami olvashatóbb formára vágyik, akkor:
test_server@root:/ # dump -ov /usr/sbin/auditcat |tail -2
maxSTACK maxDATA SNbss magic modtype
0x00000000 0x00000000 0x0003 0x010b 1L
Oksa.. Hát akkor állítsuk be ezt egy picit magasabbra, töröljük le a working file-unk, majd nézzük újra mit sikerül lőni a búcsúban:
test_server@root:/ # ls -l /var/log/eprise/working
-rw-r----- 1 root system 0 Apr 11 11:06 /var/log/eprise/working
test_server@root:/ # rm /var/log/eprise/working
test_server@root:/ # cp -p /usr/sbin/auditcat /usr/sbin/auditcat.bck
test_server@root:/ # ldedit -b maxdata:0x40000000 /usr/sbin/auditcat
ldedit: File /usr/sbin/auditcat has been updated.
test_server@root:/ # /usr/sbin/auditcat -p -o /var/log/eprise/working -r /var/log/eprise/bin1
/audit: No space left on device
auditcat: ** auditpack failed packing "/var/log/eprise/working"
auditcat: No space left on device
Na ez még mindig nem az az unikornis, amit mi akartunk.. De már közelebb vagyunk, mert legalább már közli velünk, hogy a /audit alatt nincs elég helye..
Nos.. mint kiderült az auditcat ha tetszik, ha nem, használni akarja a /audit alatti helyet, így gyógyírként a számára szükséges helyet meg kell neki adni (éljen a JFS2: Amint megkapta amit akart, és megcsinálja amit én akarok, nyomban el is veszem tőle a "nyalókát"! :DDD )
test_server@root:/ # rm /var/log/eprise/working
test_server@root:/ # df -m /audit
Filesystem MB blocks Free %Used Iused %Iused Mounted on
/dev/hd4 768.00 667.84 14% 6864 5% /
test_server@root:/ # chfs -a size=+512M /
Filesystem size changed to 1572864
test_server@root:/ # /usr/sbin/auditcat -p -o /var/log/eprise/working -r /var/log/eprise/bin1
test_server@root:/ # du -m /var/log/eprise/working
67.73 /var/log/eprise/working
test_server@root:/ # audit off
auditing disabled
test_server@root:/ # audit shutdown
auditing reset
test_server@root:/ # audit start
test_server@root:/ # chfs -a size=-512M /
Filesystem size changed to 524288
Note: aki esetleg nem akar az ldedit-el játszani, az még próbálkozhat az alábbi módszerrel is:

export LDR_CNTRL=MAXDATA=0x40000000