"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 :)

Hozzászólások

Köszi, ezzel most adtál egy ötletet.

------------------------------------------
"Nincs ez el**szva, csak másra lesz jó!"

> (amúgy tac-ot emulál a drágája)

Ilyen kis kimeneten (AIX-en 20k alatt) jo a tail -r.


$ lquerylv -L $(getlvodm -l usribmlv) -r | tail -r
00527aaa8627132a 196  5
00527aaa8627132a 195  4
00527aaa8627132a 194  3
00527aaa8627132a 193  2
00527aaa8627132a 192  1

Amugy tenyleg eleg horror az otlet. ;-)

'tail -r'-t köszönöm :) (megszoktam már, hogy awk, meg perl az ultimate string kezelő :D )
Amúgy meg nézd a dolog pozitív oldalát - most végre láthattál olyan szituációt, amikor egy LV 0 LP-s :)))
____________________________________
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..