2011. március 31., csütörtök

AIX - Rootvg költöztetés - csak óvatosan!!

Történt az a vicces eset, hogy a rootvg-t át kellett költöztetni egy AIX gépen.. Ez alapvetően nem is nagy nehézség:
- extendvg rootvg [new_disk]
- mirrorvg rootvg [new_disk]
- syncvg rootvg # Menjünk biztosra
- unmirrorvg rootvg [old_disk]
- reducevg rootvg [old_disk]
- bosboot -ad /dev/new_disk
- bootlist -m normal [new_disk]
Ez szépen is megy.. De sajna van egy bökkenő, ha mksysb-t is szeretnénk futtatni a gépen ezek után - az elég durván elhasal, ilyesmi hibaüzenettel:
0301-168 bosboot: The current boot logical volume, /dev/hd5,
does not exist on /dev/hdisk0.
Mint kiderül: A szituáció az, hogy az mksysb-nk meghívja az mkszfile parancsot, ami pedig hív egy 'bosboot -qv'-t.
A szerencsétlen bosboot-unk pedig nagyon nem is törődik a rendszer állapotával, őt csak az érdekli, hogy mi van az NVRAM-ban, ergo ez így csak restart után menne neki..
Kivétel persze, ha kicsit megszeghetjük a szabályokat =>
Az IBM már egy ideje tisztában van az adott problémával, sőt hibajegyet is adtak ki rá: IZ90977. Ez alapján már nem nehéz kicsit áttúrni az mkszfile-t, hogy azt csinálja ami nekünk kell: A /usr/bin/mkszfile file-an a 399. sor környékén írjuk át a számunkra szükséges sort az alábbiak alapján:
+399 BOOT_BLKS=`LC_MESSAGES=C ${bosboot} -qv | ${tail} -1l | ${awk} '{print $2 * 2}'`
=>
+399 BOOT_BLKS=`LC_MESSAGES=C ${bosboot} -qvd /dev/ipldevice | ${tail} -1l | ${awk} '{print $2 * 2}'`
Ezek után még figyeljünk arra, hogy a /dev/ipldevice-unk a megfelelő rhdisk-re mutasson:
# Test_server:root > ls -l /dev/rhdisk5
crw------- 2 root system 17, 5 Feb 18 15:01 /dev/rhdisk1
# Test_server:root > ls -l /dev/ipldevice
crw------- 2 root system 17, 5 Feb 18 15:01 /dev/ipldevice
Innen pedig már az mkszfile-unk is jól lefut, illetve az mksysb se fog kardjába dőlni..

2011. március 21., hétfő

"Pokoli" AIX adminisztrátor - LV decrease

Mai nap kolléga szögezte nekem a kérdést, hogy hogy is lehet AIX alatt LV-t csökkenteni (úgy, hogy az FS és az LV mérete nem egyezik meg). Nos.. Mint kiderült van egy hivatalos, meg egy kevésbé hivatalos mód is a kérdés megválaszolására (utóbbi a viccesebb), ezért gondoltam ezt meg is osztanám akkor már:
Adott a szituáció:
Van egy szimpla VG-nk, azon belül egy LV-nk, azon belül meg egy JFS2 filerendszer.. Eddig semmi szokatlan..
[test_server:root:/home/root:] lsfs -ql /kenny
Name Nodename Mount Pt VFS Size Options Auto Accounting
/dev/test2lv -- /kenny jfs2 524288 rw no no
(lv size: 524288, fs size: 524288, block size: 4096, sparse files: yes, inline log: no, inline log size: 0, EAformat: v1, Quota: no, DMAPI: no, VIX: no)
Az eredeti kérdésünk szerint az FS nem tölti ki teljesen az LV-t, így növeljük meg 1 PP-vel, hogy ezt elő is hozzuk:
[test_server:root:/home/root:] /usr/sbin/extendlv test2lv 1
[test_server:root:/home/root:] lsfs -ql /kenny
Name Nodename Mount Pt VFS Size Options Auto Accounting
/dev/test2lv -- /kenny jfs2 524288 rw no no
(lv size: 655360, fs size: 524288, block size: 4096, sparse files: yes, inline log: no, inline log size: 0, EAformat: v1, Quota: no, DMAPI: no, VIX: no)
A játék innen indul - állítsuk vissza az eredeti állapotot..
Hivatalosan ezt az alábbi módon kéne megtennünk:
Első körben az FS-t felnöveljük az LV méretére:
[test_server:root:/home/root:] chfs -a size=655360 /kenny
Filesystem size changed to 655360
[test_server:root:/home/root:] lsfs -ql /kenny
Name Nodename Mount Pt VFS Size Options Auto Accounting
/dev/test2lv -- /kenny jfs2 655360 rw no no
(lv size: 655360, fs size: 655360, block size: 4096, sparse files: yes, inline log: no, inline log size: 0, EAformat: v1, Quota: no, DMAPI: no, VIX: no)
Majd visszacsökkentjük az FS-t az eredeti méretére:
[test_server:root:/home/root:] chfs -a size=524288 /kenny
Filesystem size changed to 524288
[test_server:root:/home/root:] lsfs -ql /kenny
Name Nodename Mount Pt VFS Size Options Auto Accounting
/dev/test2lv -- /kenny jfs2 524288 rw no no
(lv size: 524288, fs size: 524288, block size: 4096, sparse files: yes, inline log: no, inline log size: 0, EAformat: v1, Quota: no, DMAPI: no, VIX: no)
A második módszer ennél kicsit veszélyesebb, de ennél fogva viccesebb is..
A felállás ugyan az, mint eddig:
[test_server:root:/home/root:] lsfs -ql /kenny
Name Nodename Mount Pt VFS Size Options Auto Accounting
/dev/test2lv -- /kenny jfs2 524288 rw yes no
(lv size: 655360, fs size: 524288, block size: 4096, sparse files: yes, inline log: no, inline log size: 0, EAformat: v1, Quota: no, DMAPI: no, VIX: no)
Nézzük meg a PP, és az LP összefüggéseket, csak hogy lássuk mink is van:
[test_server:root:/home/root:] lquerylv -L `getlvodm -l test2lv` -r
0057d91de041890e 3 1
0057d91ddb713a8c 54 1
0057d91de041890e 4 2
0057d91ddb713a8c 55 2
0057d91de041890e 5 3
0057d91ddb713a8c 56 3
0057d91de041890e 6 4
0057d91ddb713a8c 57 4
0057d91de041890e 2 5
0057d91ddb713a8c 53 5
Az egyszerűség kedvéért ugyan ez lslv-vel
[test_server:root:/home/root:] lslv -m test2lv
test2lv:/kenny
LP PP1 PV1 PP2 PV2 PP3 PV3
0001 0003 hdisk0 0054 hdisk1
0002 0004 hdisk0 0055 hdisk1
0003 0005 hdisk0 0056 hdisk1
0004 0006 hdisk0 0057 hdisk1
0005 0002 hdisk0 0053 hdisk1
Na szóval.. 1 FS, 5 LP, és 10 PP (azaz LVM mirror).
Hogy teljes legyen a kép, még kérjük ki az LV azonosítóját is

[test_server:root:/home/root:] getlvodm -l test2lv
0057d91d00004c0000000128b0057d95.17
Na és akkor innen indul a móka: Mind azt amit eddig kikértünk rakjuk bele egy file-ba:

[test_server:root:/home/root:] lquerylv -L `getlvodm -l test2lv` -r |awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' > /tmp/mapfile
Alapvetően az awk-os mókára nem lenne szükség (amúgy tac-ot emulál a drágája), viszont itt direkt azt akartam, hogy az utolsó LP-hez tartozó bejegyzések a file elején helyezkedjenek el.
És akkor innen induljon a móka:
[test_server:root:/home/root:] lreducelv -l `getlvodm -l test2lv` -s 2 /tmp/mapfile
Majd a visszaellenőrzés:
[test_server:root:/home/root:] lslv -m test2lv
test2lv:/kenny
LP PP1 PV1 PP2 PV2 PP3 PV3
0001 0003 hdisk0 0054 hdisk1
0002 0004 hdisk0 0055 hdisk1
0003 0005 hdisk0 0056 hdisk1
0004 0006 hdisk0 0057 hdisk1
[test_server:root:/home/root:] lsfs -ql /kenny
Name Nodename Mount Pt VFS Size Options Auto Accounting
/dev/test2lv -- /kenny jfs2 524288 rw no no
(lv size: 524288, fs size: 524288, block size: 4096, sparse files: yes, inline log: no, inline log size: 0, EAformat: v1, Quota: no, DMAPI: no, VIX: no)
Kis magyarázat: Az lreducelv parancs AIX alatt a map file alapján töröl PP-ket az adott LV-ből. A -s paraméterrel tudjuk megmondani, hogy pontosan hányat is töröljön (2 kellett jelen esetben a mirroring miatt), viszont van egy olyan rossz szokása, hogy a map file elejétől indul, és az onnan felvett értékekkel dolgozik (jelen esetben az első 2 sorban meghatározott PP került törlésre (ha nem fordítottam volna meg a map file-t, akkor az első 2őt törölte volna, ami nagyon nem lett volna egészséges))
Amire még figyelnünk kell: Ez a parancs nem csak az ODM-ben turkál, hanem magában a VGDA-ban is, így óvatosan a használatával, tekintve, hogy ha nem figyelünk, akkor könnyen kitudunk hozni egy ilyesmi állást is :)
[test_server:root:/home/root:] lslv test2lv
LOGICAL VOLUME: test2lv VOLUME GROUP: testvg
LV IDENTIFIER: 0057d91d00004c0000000128b0057d95.17 PERMISSION: read/write
VG STATE: active/complete LV STATE: opened/syncd
TYPE: jfs2 WRITE VERIFY: off
MAX LPs: 512 PP SIZE: 64 megabyte(s)
COPIES: SCHED POLICY: parallel
LPs: 0 PPs: 0
STALE PPs: 0 BB POLICY: relocatable
INTER-POLICY: minimum RELOCATABLE: yes
INTRA-POLICY: middle UPPER BOUND: 32
MOUNT POINT: /kenny LABEL: /kenny
MIRROR WRITE CONSISTENCY: on/ACTIVE
EACH LP COPY ON A SEPARATE PV ?: yes
Serialize IO ?: NO
=> Ez a leírás inkább csak olyan érdekesség képen született, tessék a hivatalos utat használni ilyen esetben :)

2011. március 8., kedd

5.8p1 OpenSSH forgatása AIX-re (gcc)+ csomag készítés (bff)

Sikerült belefutni egy elég idegesítő bugba..
Az AIX-hoz jelenleg elérhető legfrissebb OpenSSH (5.4p1) sajna egy elég pofátlan buggal érkezett - a csomagban lévő sftp-ből kiszedték az mput parancsot, amit 1-2 team nem fogadott őszínte mosollyal.
Az OpenSSH Changelogját elnézegetve látszik is, hogy ez tényleg nem azért történt, mert a funkció bugos lett volna, vagy hasonló, hanem szimplán "elveszett", ám az 5.6os verzióba már vissza került.. Ám mivel hivatalosan csak 5.4 állt rendelkezésre, így gondoltam nem szöszölök, nyomban forgatok egy latest-et (5.8p1)
Hozzávalók:
A forrás: http://ftp.fsn.hu/pub/OpenBSD/OpenSSH/portable/openssh-5.8p1.tar.gz
Némi kis dokumentáció: ftp://ftp.ca.openbsd.org/pub/OpenBSD/OpenSSH/portable/INSTALL
Zlib (A forgatáshoz): http://zlib.net/zlib-1.2.5.tar.gz
Illetve OpenSSL >=0.9.6
#Note - A forgatáshoz gcc-t választottam (ezt szoktam meg :)), de persze ha igazi IBM-es akarnék lenni, akkor XlC-t használnék.. Én úgy éreztem, hogy már így is kékebb a vérem mint kéne, így inkább nem teszek még rá még1 lapáttal :)
Mivel az 5.4-el szállított OpenSSL alapból is 0.9.8-al jött, így hála az égnek azzal nem kellett szöszöljek. A zlib viszont sajna ilyen állatfaj, úgy hogy a forrás leszedése után az a standard ./configure, make, make install triumvirátussal fel is kerül a helyére.
Az OpenSSH viszont érdekesebb állatfaj..
Az első problémája, hogy ha csak simán felrakja az ember a zlibet, akkor nem akaródzik megtalálni.. Nem baj, van --with-zlib kapcsolója a configure-nak.
Ami viszont már nagyobb fejfájást okozott az az alábbi jelenség volt:
ld: 0711-593 SEVERE ERROR: Symbol C_BSTAT (entry 1136) in object clientloop.o:
The symbol refers to a csect with symbol number 0, which was not
found. The new symbol cannot be associated with a csect and
is being ignored.
Némi kis nyomozás után kiderül mi a ludas: Hőn "szeretett" gcc-m: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46072
Ez a bug eddig még így nálam nem jött elő, de akkor innentől megjegyzem magamnak, hogy ezek után minden gcc-vel AIX-ra forgatott parancsnál ezt kötelezően használni illik:

--with-cflags=-g0
/* Az mondjuk külön vicc, hogy így a forgatás kb az alábbi módon fog kinézni:

gcc -g -O2 -Wall -Wpointer-arith -Wuninitialized -Wsign-compare -Wformat-security -Wno-pointer-sign -fno-strict-aliasing -fno-builtin-memset -g0 -I. -I.. -I. -I./.. -I/usr/local/include/ -DHAVE_CONFIG_H -c bsd-arc4random.c
Láthatólag a -g0 simán felülbírálja a -g-t a gcc-nél,de ha neki megfelel, akkor ki vagyok én, hogy ellenkezzek.. */
Így már hőn szeretett OpenSSH-nk is simán lefordul
[/i]/* A teljesség igénye nélkül: Az alábbi forgatási funkciókat használtam:

./configure --prefix=/usr --sysconfdir=/etc/ssh --with-cflags=-fno-builtin-memset --with-cflags=-DBROKEN_GETADDRINFO --with-cflags=-g0 --with-zlib=/usr/local/include/
*/[/i]
Amint készen vagyunk ezzel, nyomban make install-t is nyomhatunk, vagy ha lusták vagyunk, akkor nyomban a csomagban lévő script-el telepíthető bff csomagot készíthetünk az alábbi módon:

AIX_SRC=yes contrib/aix/buildbff.sh
Viszont én kicsit többre vágytam, így úgy gondoltam, hogy kicsit ragaszkodjunk is az eddigi csomagoknál használt naming convention-höz is, meg had legyen ez már tényleg olyan, amilyennek én szeretném :)
A választott célezközöm pedig az mkinstallp alkalmazás volt (bos.adt.insttools csomag része)
Első kör:
A make install-ból, vagy a forgatott file-jainkból állítsuk össze a szükséges mappa struktúrát (file jogosultságokra figyeljünk! )
# [/tmp/openssh/5.8p1/package:] find . -type f
./usr/openssh/README
./usr/openssh/license_ssh.txt
./usr/openssh/ChangeLog
./usr/sbin/ssh-rand-helper
./usr/sbin/ssh-keysign
./usr/sbin/sftp-server
./usr/sbin/sshd
./usr/bin/ssh-add
./usr/bin/ssh-keygen
./usr/bin/ssh-agent
./usr/bin/ssh-keyscan
./usr/bin/scp
./usr/bin/sftp
./usr/bin/ssh
./etc/ssh/moduli
./etc/ssh/ssh_prng_cmds
./etc/ssh/ssh_config
./etc/ssh/sshd_config
./etc/ssh/ssh_config.default
./etc/ssh/sshd_config.default
./etc/rc.d/rc2.d/Ssshd
./etc/rc.d/rc2.d/Ksshd
Második kör:
Hozzuk létre a szükséges pre/post install/uninstall scripteket (kicsit szöszölős meló). Én személy szerint úgy voltam vele, hogy szeretem elszeparálni a különböző taszkokat, így az alábbi file-okat dobtam össze:
# [/tmp/openssh/scripts:] find . -type f -ls
18780 1 -rw------- 1 root system 786 Mar 4 15:30 ./openssh.base.client.unpost_i
18775 4 -rw------- 1 root system 3221 Mar 7 17:47 ./openssh.base.server.post_i
18778 1 -rw------- 1 root system 803 Mar 4 15:30 ./openssh.base.server.pre_i
18777 1 -rw------- 1 root system 871 Mar 4 15:30 ./openssh.base.server.unpost
18779 1 -rw------- 1 root system 537 Mar 4 15:30 ./openssh.base.server.unpre_i
Harmadik kör:
A végére pedig dobjuk össze a template file-t ami alapján az mkinstallp majd dolgozni is tud:

# [/tmp/openssh/5.8p1/.info:] cat openssh.template*
*Katt az openssh.template alatt elérhető pastebin.com-os linkre
/* Személy szerint nem nagyon vagyok oda a licensz file-okért, de azért adjuk már meg a módját, ha nem kerül sok erőfeszítésbe */
Ha minden kész, akkor a célmappánkból indítva az alábbi parancsot kedves kis bff csomag vár majd minket a tmp/ alatt:

mkinstallp -d /tmp/openssh/5.8p1/package/ -T /tmp/openssh/5.8p1/.info/openssh.template
/* Ami a lustaságom miatt hiányzik: Nincs dependency check - azért azt az OpenSSL-t tényleg nézni kéne */
Ami előny ebből kijött:
- Saját csomag
- Ha nem is hivatalosan, de ismét helyreállt az mput funkció az sftp-n belül (legalább is amíg hivatalos csomag nem lesz helyette)
- A debug flag kikapcsolása miatt (-g0) az elkészült binárisok közel fele akkor lettek, mint a hivatalos csomagban elérhetőek (debugolni meg nem nagyon óhajtom ezt amúgy se)
- Ez kis howto a közösségnek :)