poniedziałek, 17 marca 2014

Kilka uwag u usuwaniu LUNów w Linuxie

Na początek motto:
- Co to jest: nie świeci i nie mieści się w dupie?
- Radzieckie urządzenie do świecenia w dupie.

To tyle emocji na temat organizacji mpio i używalności komend LVM w Linuxie, a może to są tylko frustracje starego AIXowca? :-P

Wprowadzenie

Sytuacja jest taka: Trzeba usunąć z RedHat Linuxa wystawione z macierzy IBM StorWize V7000 LUNy.
Oryginalna procedura jest tutaj i nie zamierzam jej przepisywać, tylko trochę poprawić, bo niektóre potrzebne informacje można sobie skasować, podczas gdy mogą być potrzebne później.

Aha - tutaj się usuwa dane. W zasadzie nieodwracalnie, więc jak nie wiesz co robisz, to przestań to czytać, albo kup bilet w jedną stronę do kraju, z którym nie ma umowy o ekstradycję... i happy deleting!

Procedura + komentarze

1. Przestać korzystać z urządzenia. Pewnie odmontować filesystem. Może się okazać, że będzie zajęty przez kogoś. Polecenia fuser i lsof na Linuxie mogą być bardzo pomocne.
Warto takżę zadbać o to, żeby filesystemy nie próbowały się już więcej montować. Można to zrobić np poprzez usunięcie bądź zakomentowanie w /etc/fstab wpisów je montujących:

#/dev/tsmadpvg/tsmadplv         /tsm/stgpools/adpool            xfs     defaults        1 2
#/dev/tsmstg2vg/tsmcbdxdplv     /tsm/stgpools/cbdxpool          xfs     defaults        1 2


To jest też dobry moment do zapamiętania w jak się nazywają wolumeny logiczne i do jakiej grupy należą.

2. Znaleźć pozostałe informacje potrzebne do poprawnego usunięcia tego co się chce (i tylko tego). Do znalezienia są jeszcze:
  • UUID LUNów
  • nazwy PV
  • Nazwy ścieżek.
Zatem od początku:
Logiczne wolumeny według grupy wolumenów:

root@c2-tsm01:mapper# vgscan        
  Reading all physical volumes.  This may take a while...
  Found volume group "tsmstgvg" using metadata type lvm2
  Found volume group "tsmactlogvg" using metadata type lvm2
  Found volume group "tsmadpvg" using metadata type lvm2
  Found volume group "vg_c2tsm01" using metadata type lvm2
  Found volume group "tsmvg" using metadata type lvm2

Grupa, którą chcę usunąć to tsmadpvg. trzeba się dowiedzieć, jakie wolumeny logiczne są w niej:

root@c2-tsm01:~# lvscan | grep tsmadpvg
  ACTIVE            '/dev/tsmadpvg/tsmadplv' [20.00 TiB] inherit

Ten krok był tylko, żeby upewnić się, czy na pewno wszystko zostało odmontowane.
Dla porządku wypadałoby się dowiedzieć, jak logiczny wolumen został nazwany przez devmappera:

root@c2-tsm01:~# ls -la /dev/tsmadpvg/tsmadplv
lrwxrwxrwx 1 root root 8 Feb 10 19:58 /dev/tsmadpvg/tsmadplv -> ../dm-25

Pora zidentyfikować fizyczne wolumeny jakich używa usuwana grupa:

root@c2-tsm01:~# pvscan | grep tsmadpvg
  PV /dev/mapper/360050768028601c91000000000000002     VG tsmadpvg      lvm2 [5.00 TiB / 0    free]
  PV /dev/mapper/360050768028601c91000000000000001     VG tsmadpvg      lvm2 [5.00 TiB / 0    free]
  PV /dev/mapper/360050768028205359800000000000001     VG tsmadpvg      lvm2 [5.00 TiB / 0    free]
  PV /dev/mapper/360050768028205359800000000000002     VG tsmadpvg      lvm2 [5.00 TiB / 0    free]

Te cyferki: 36005.... to UUID LUNu wystawionego z macierzy. Dzięki nim można ustalić jak w systemie nazywają się urządzenia reprezentujące pojedyncze ścieżki:

root@c2-tsm01:~# multipath -l | egrep -A 11 "360050768028601c91000000000000002|360050768028601c91000000000000001|360050768028205359800000000000001|360050768028205359800000000000002"
360050768028205359800000000000002 dm-12 IBM,2145
size=5.0T features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='round-robin 0' prio=0 status=active
| |- 2:0:4:1 sdbd 67:112 active undef running
| |- 3:0:4:1 sdbl 67:240 active undef running
| |- 5:0:4:1 sdbr 68:80  active undef running
| `- 8:0:4:1 sdbx 68:176 active undef running
`-+- policy='round-robin 0' prio=0 status=enabled
  |- 2:0:5:1 sdbf 67:144 active undef running
  |- 3:0:5:1 sdbz 68:208 active undef running
  |- 5:0:5:1 sdcb 68:240 active undef running
  `- 8:0:5:1 sdcd 69:16  active undef running
360050768028205359800000000000001 dm-11 IBM,2145
size=5.0T features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='round-robin 0' prio=0 status=active
| |- 2:0:5:0 sdbe 67:128 active undef running
| |- 3:0:5:0 sdby 68:192 active undef running
| |- 5:0:5:0 sdca 68:224 active undef running
| `- 8:0:5:0 sdcc 69:0   active undef running
`-+- policy='round-robin 0' prio=0 status=enabled
  |- 2:0:4:0 sdbc 67:96  active undef running
  |- 3:0:4:0 sdbk 67:224 active undef running
  |- 5:0:4:0 sdbq 68:64  active undef running
  `- 8:0:4:0 sdbw 68:160 active undef running
--
360050768028601c91000000000000002 dm-9 IBM,2145
size=5.0T features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='round-robin 0' prio=0 status=active
| |- 2:0:3:1 sdaj 66:48  active undef running
| |- 3:0:2:1 sdbh 67:176 active undef running
| |- 5:0:2:1 sdbn 68:16  active undef running
| `- 8:0:3:1 sdbv 68:144 active undef running
`-+- policy='round-robin 0' prio=0 status=enabled
  |- 2:0:2:1 sdah 66:16  active undef running
  |- 3:0:3:1 sdbj 67:208 active undef running
  |- 5:0:3:1 sdbp 68:48  active undef running
  `- 8:0:2:1 sdbt 68:112 active undef running
360050768028601c91000000000000001 dm-10 IBM,2145
size=5.0T features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='round-robin 0' prio=0 status=active
| |- 2:0:2:0 sdag 66:0   active undef running
| |- 3:0:3:0 sdbi 67:192 active undef running
| |- 5:0:3:0 sdbo 68:32  active undef running
| `- 8:0:2:0 sdbs 68:96  active undef running
`-+- policy='round-robin 0' prio=0 status=enabled
  |- 2:0:3:0 sdai 66:32  active undef running
  |- 3:0:2:0 sdbg 67:160 active undef running
  |- 5:0:2:0 sdbm 68:0   active undef running
  `- 8:0:3:0 sdbu 68:128 active undef running

Tak naprawdę to interesujące są tylko te cześći, które w ostatnim akapicie są zaznaczone na czerwono. Dlatego trzeba się posłużyć dodatkowyum polecem, które przygotuje tę listę w sposób użyteczny dla następnego kroku:

 root@c2-tsm01:~# multipath -l | egrep -A 11 "360050768028601c91000000000000002|360050768028601c91000000000000001|360050768028205359800000000000001|360050768028205359800000000000002" | grep running | cut -c 13-18 | while read path; do echo -n $path " " ; done ; echo " "
sdbd  sdbl  sdbr  sdbx  sdbf  sdbz  sdcb  sdcd  sdbe  sdby  sdca  sdcc  sdbc  sdbk  sdbq  sdbw  sdaj  sdbh  sdbn  sdbv  sdah  sdbj  sdbp  sdbt  sdag  sdbi  sdbo  sdbs  sdai  sdbg  sdbm  sdbu

Słowo komentarza do powyższego polecenia. Użyłem cut -c 13-18 - to wycina znaki od 13 do 18 w każdej podanej na wejściu linii. To jest mało zgrabne, jak ścieżki będą miały inną długość nazwy (bardzo prawdopodobne!!!) to się zawali. - jako proste zadanie dla czytelnika, zostawiam przerobienie tego na jakiegoś ładnego sed'a czy awk'a :-P. Dlaczego wypisałem wszystkie ścieżki w jednej linii okaże się za chwilę.

3. Jak już wszystkie informacje są na miejscu, można zacząć wycinać. Zaczynamy od góry:

  • Umount filesystemu
  • Wyciąć w /etc/fstab
  • Zdeaktywować grupę wolumenów
root@c2-tsm01:~# vgchange -a n tsmadpvg
  0 logical volume(s) in volume group "tsmadpvg" now active

  • Usunąć grupę wolumenów:
root@c2-tsm01:~# vgremove tsmadpvg
Do you really want to remove volume group "tsmadpvg" containing 1 logical volumes? [y/n]: y
  Logical volume "tsmadplv" successfully removed
  Volume group "tsmadpvg" successfully removed

  • Usunąć (dla porządku) sygnatury fizycznych wolumenów z LUNów:
root@c2-tsm01:~# pvscan
  PV /dev/mapper/360050768028601c91000000000000003     VG tsmstgvg        lvm2 [738.99 GiB / 0    free]
  PV /dev/mapper/360050768028205359800000000000004     VG tsmstgvg        lvm2 [738.99 GiB / 0    free]
  PV /dev/mapper/360050768028601c91000000000000004     VG tsmstgvg        lvm2 [738.99 GiB / 0    free]
  PV /dev/mapper/360050768028205359800000000000003     VG tsmstgvg        lvm2 [738.99 GiB / 0    free]
  PV /dev/mapper/3600605b004b4ef3017c973413b957cf7p1   VG tsmactlogvg     lvm2 [271.94 GiB / 34.49 GiB free]
  PV /dev/sda3                                         VG vg_c2tsm01      lvm2 [135.29 GiB / 77.43 GiB free]
  PV /dev/mapper/360080e50002eb72c00000348503ae6e6     VG tsmvg           lvm2 [299.99 GiB / 0    free]
  PV /dev/mapper/360080e50002eb72c0000034b503ae711     VG tsmvg           lvm2 [299.99 GiB / 0    free]
  PV /dev/mapper/360080e50002ebe0600000349503ae707     VG tsmvg           lvm2 [299.99 GiB / 0    free]
  PV /dev/mapper/360080e50002ebe060000034b503ae732     VG tsmvg           lvm2 [299.99 GiB / 0    free]
  PV /dev/mapper/360080e50002eb72c00000361503aecec     VG tsmvg           lvm2 [587.99 GiB / 0    free]
  PV /dev/mapper/360080e50002ebe0600000371503aed3a     VG tsmvg           lvm2 [999.99 GiB / 0    free]
  PV /dev/mapper/360050768028601c91000000000000002                        lvm2 [5.00 TiB]
  PV /dev/mapper/360050768028601c91000000000000001                        lvm2 [5.00 TiB]
  PV /dev/mapper/360050768028205359800000000000001                        lvm2 [5.00 TiB]
  PV /dev/mapper/360050768028205359800000000000002                        lvm2 [5.00 TiB]
  Total: 16 [26.01 TiB] / in use: 12 [6.01 TiB] / in no VG: 4 [20.00 TiB]

root@c2-tsm01:~# pvremove /dev/mapper/360050768028601c91000000000000002 /dev/mapper/360050768028601c91000000000000001 /dev/mapper/360050768028205359800000000000001 /dev/mapper/360050768028205359800000000000002
  Labels on physical volume "/dev/mapper/360050768028601c91000000000000002" successfully wiped
  Labels on physical volume "/dev/mapper/360050768028601c91000000000000001" successfully wiped
  Labels on physical volume "/dev/mapper/360050768028205359800000000000001" successfully wiped
  Labels on physical volume "/dev/mapper/360050768028205359800000000000002" successfully wiped
  • Korzystając w wypisanych w jednej linii nazw ścieżek usunąć je z systemu:
root@c2-tsm01:~# for i in sdbd  sdbl  sdbr  sdbx  sdbf  sdbz  sdcb  sdcd  sdbe  sdby  sdca  sdcc  sdbc  sdbk  sdbq  sdbw  sdaj  sdbh  sdbn  sdbv  sdah  sdbj  sdbp  sdbt  sdag  sdbi  sdbo  sdbs  sdai  sdbg  sdbm  sdbu 
> do
> echo "echo 1 > /sys/block/$i/device/delete"
> done
echo 1 > /sys/block/sdbd/device/delete
echo 1 > /sys/block/sdbl/device/delete
echo 1 > /sys/block/sdbr/device/delete
echo 1 > /sys/block/sdbx/device/delete
echo 1 > /sys/block/sdbf/device/delete
echo 1 > /sys/block/sdbz/device/delete
echo 1 > /sys/block/sdcb/device/delete
echo 1 > /sys/block/sdcd/device/delete
echo 1 > /sys/block/sdbe/device/delete
echo 1 > /sys/block/sdby/device/delete
echo 1 > /sys/block/sdca/device/delete
echo 1 > /sys/block/sdcc/device/delete
echo 1 > /sys/block/sdbc/device/delete
echo 1 > /sys/block/sdbk/device/delete
echo 1 > /sys/block/sdbq/device/delete
echo 1 > /sys/block/sdbw/device/delete
echo 1 > /sys/block/sdaj/device/delete
echo 1 > /sys/block/sdbh/device/delete
echo 1 > /sys/block/sdbn/device/delete
echo 1 > /sys/block/sdbv/device/delete
echo 1 > /sys/block/sdah/device/delete
echo 1 > /sys/block/sdbj/device/delete
echo 1 > /sys/block/sdbp/device/delete
echo 1 > /sys/block/sdbt/device/delete
echo 1 > /sys/block/sdag/device/delete
echo 1 > /sys/block/sdbi/device/delete
echo 1 > /sys/block/sdbo/device/delete
echo 1 > /sys/block/sdbs/device/delete
echo 1 > /sys/block/sdai/device/delete
echo 1 > /sys/block/sdbg/device/delete
echo 1 > /sys/block/sdbm/device/delete
echo 1 > /sys/block/sdbu/device/delete

Oczywiście jestem ciut nieufny w stosunku do automatów, dlatego wolę jak mi to coś wypisze komendę zamiast ją wykonać. Potem to sobie "przekleję". Opcja dla hardkorowców: Usunąć z powyższego polecenia to co jest na zielono. 

  • Odmapować luny na macierzy.
  • Być może warto usunąć też zoning z SANu.

Zamiast podsumowania


Na AIXie procedura wyglądałaby tak:
  • lsvg -o (lista włączonych grup wolumenów)
  • lsvg -l grupa_do_usunięcia (lista wolumenów logicznych do zamknięcia/odmontowania)
  • umount wszystkich wolumenów z tej grupy
  • lsvg -p grupa_do_usunięcia (lista hdisków do wycięcia)
  • varyoffvg grupa_do_usunięcia
  • exportvg grupa_do_usunięcia
  • for każdy PV z grupy_do_usunięcia; do rmdev -Rdl $PV; done
Trochę prościej :-P