Jak zmniejszyć rozmiar grupy woluminów w LVM?

30
[root@localhost ~] vgdisplay
  --- Volume group ---
  VG Name               vg_root
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  7
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               297,59 GiB
  PE Size               4,00 MiB
  Total PE              76182
  Alloc PE / Size       59392 / 232,00 GiB
  Free  PE / Size       16790 / 65,59 GiB
  VG UUID               XXXXXXXXXX

PV:

[root@localhost ~] pvdisplay

  --- Physical volume ---
  PV Name               /dev/mapper/udisks-luks-uuid-ASDFASDF
  VG Name               vg_root
  PV Size               297,59 GiB / not usable 2,00 MiB
  Allocatable           yes 
  PE Size               4,00 MiB
  Total PE              76182
  Free PE               16790
  Allocated PE          59392
  PV UUID               YYYYYYYYYYY

Więc mam VG z 65 GB wolnego miejsca. Ale kiedy chcę zmniejszyć tę grupę woluminów o około 50 GB:

pvresize -tv --setphysicalvolumesize 247G /dev/mapper/udisks-luks-uuid-ASDFASDF
  Test mode: Metadata will NOT be updated and volumes will not be (de)activated.
    Using physical volume(s) on command line
    Test mode: Skipping archiving of volume group.
    /dev/mapper/udisks-luks-uuid-ASDFASDF: Pretending size is 517996544 not 624087040 sectors.
    Resizing volume "/dev/mapper/udisks-luks-uuid-ASDFASDF" to 624087040 sectors.
    Resizing physical volume /dev/mapper/udisks-luks-uuid-ASDFASDF from 0 to 63231 extents.
  /dev/mapper/udisks-luks-uuid-ASDFASDF: cannot resize to 63231 extents as later ones are allocated.
  0 physical volume(s) resized / 1 physical volume(s) not resized
    Test mode: Wiping internal cache
    Wiping internal VG cache

Komunikat o błędzie to:

cannot resize to 63231 extents as later ones are allocated.

P: Jak mogę zdefragmentować plik vg_root, aby usunąć niepotrzebną część?

ps: Już się dowiedziałem, że muszę tylko zmienić rozmiar PV, aby zmienić rozmiar VG, czy też są jakieś lepsze polecenia do zmiany rozmiaru VG (np .: co mogę zrobić, gdybym miał kilka VG na PV? ... )?

Gasko Peter
źródło

Odpowiedzi:

31

Możesz użyć, pvmoveaby przenieść te zakresy na początek urządzenia lub innego urządzenia:

sudo pvmove --alloc anywhere /dev/device:60000-76182

Następnie pvmovewybiera, gdzie przenieść zakresy, lub możesz określić, gdzie je przenieść.

Zobacz, pvs -v --segments /dev/devicejakie zakresy są obecnie przydzielone.

Stéphane Chazelas
źródło
1
Dla mnie problemem było to, że przeniósł PE do innych miejsc. Musiał określić miejsce docelowe, np .:sudo pvmove --alloc anywhere /dev/sdX2:60000-76182 /dev/sdX2:3000-19182
akostadinov
29

Oto kroki wymagane do zmiany rozmiaru partycji LVM lub LVM2:

sudo lvresize --verbose --resizefs -L -150G /dev/ubuntu/root

sudo pvresize --setphysicalvolumesize {any size here} /dev/sda5

Ostatnie polecenie pvresizemoże spowodować błąd

/dev/sda5: cannot resize to xxxxx extents as later ones are allocated.

Musisz zmienić rozmieszczenie nieprzydzielonego miejsca na końcu LVM. Oznacza to po partycji root i swap_1. Za pomocą tego polecenia możesz zobaczyć aktualny układ przestrzeni

pvs -v --segments /dev/sda5

pvs pokaże takie wyjście

/dev/sda5 ubuntu lvm2 a-- 698.04g 150g 0 xxx+1 root 0 linear /dev/sda:0-xxx
/dev/sda5 ubuntu lvm2 a-- 698.04g 150g xxx+1 iii 0 free
/dev/sda5 ubuntu lvm2 a-- 698.04g 150g yyyy jjj swap 0 linear /dev/sda5:yyyy-end

Teraz użyj, pvmoveaby usunąć fragmentację zewnętrzną:

sudo pvmove --alloc anywhere /dev/sda5:yyyy-end

Zobaczmy teraz, czy przeniesienie woluminu wymiany się powiodło.

pvs -v --segments /dev/sda5

powinien pokazać nową kolejność woluminów:

/dev/sda5 ubuntu lvm2 a-- 698.04g 150g 0 xxx+1 root 0 linear /dev/sda:0-xxx
/dev/sda5 ubuntu lvm2 a-- 698.04g 150g xxx+1 iii swap 0 linear /dev/sda5:xxx+1-yyyy
/dev/sda5 ubuntu lvm2 a-- 698.04g 150g yyyy+1 end 0 free

Następnie użyj GParted i zmień rozmiar LVM do maksymalnego używanego obszaru. Reszta będzie w nieprzydzielonym miejscu.

Ujjal Roy
źródło
Jest to dość wyczerpująca odpowiedź - byłoby pomocne, gdyby zawierała krok 0 do zmiany rozmiaru systemu plików, np. Resize2fs. Nie sądzę, że musi to być szczegółowo, ale po prostu byłoby coś, co byłoby troche dla przyszłych widzów
Justin
Na początku miałem wolne miejsce, wywołanie pvmove bez celu nie przesunęło go na początek. To, co zadziałało, to pvmove --alloc anywhere /dev/sda5:yyyy-end 0-newend„newend” liczony jako koniec - rrrr. Nie jestem jednak pewien, czy to zadziała, jeśli wolne miejsce na początku jest mniejsze niż zakres, który ma zostać przesunięty. Myślę też, że w twoich wyjściach z pvs jest literówka, myślę, że miałeś na myśli /dev/sda5:0-xxxzamiast /dev/sda:0-xxx.
pcworld
2
@Justin --resizefsParametr lvresizejuż dba o zmianę rozmiaru bazowego systemu plików.
pcworld
@ pccorld po prostu przeczytałem stronę podręcznika użytkownika i wydaje się, że masz rację
Justin
Doskonała odpowiedź - ale czy możesz rozwinąć ostatni krok? Zakładam, że „zmiana rozmiaru LVM” oznacza „zmienić rozmiar woluminu fizycznego?” Czy można to zrobić bez GParted w wierszu poleceń dla systemów, które nie mają GUI?
Kevin Keane
1

Ten starszy post dotyczy tego rodzaju kurczenia się, dzięki czemu możesz wykorzystać nowe miejsce na coś innego. Jednak wcześniej trzeba będzie zmienić jego rozmiar na dane. Powinno to obejmować również to i inne błędy, które otrzymujesz. Ponieważ jest starszy, najpierw przeczytaj:

DigitalTidBits
źródło
0

używam tej metody, nie jestem pewien, czy jest najlepsza, ale działa dla mnie

używaj go ostrożnie, a nie SysAdmin

obliczyć różnicę, która powoduje problem

324% 4 = 0 bez problemu

ale

324% 32 = 10,125

to jest problem, więc nie pasuje

myślę, że nazywa się to „zdobądź prawdziwy numer”

lvmdiskscan

aby wyświetlić listę partycji

następnie

pvresize /dev/*** --setphysicalvolumesize ***M

muszę dodać dodatkowe 4M do pracy, myślę, że jest to związane ze starym rozmiarem PE

Wreszcie

vgchange -s 32M **
Mohamed Abo Badawy
źródło
0

Poprzednie odpowiedzi pomogły mi rozwiązać ten problem, ale musiałem to zautomatyzować i tak napisałem pvshrink

# ./pvshrink /dev/vda2 
Moving 50 blocks from 714 to 664
  /dev/vda2: Moved: 4.00%
  /dev/vda2: Moved: 100.00%
50 of 50 (100.00%) done
Defragmentation complete.
Metadata size: 1048576 b
PE size: 4.0 MiB
Total size 1048576 b + 714 x 4194304 b = 2995781632 b (2.8 GiB)
    Wiping internal VG cache
    Wiping cache of LVM-capable devices
    Archiving volume group "fedora" metadata (seqno 15).
    /dev/vda2: Pretending size is 5851136 not 6287360 sectors.
    Resizing volume "/dev/vda2" to 5851136 sectors.
    Resizing physical volume /dev/vda2 from 0 to 714 extents.
    Updating physical volume "/dev/vda2"
    Creating volume group backup "/etc/lvm/backup/fedora" (seqno 16).
  Physical volume "/dev/vda2" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized

Powoduje to wywołanie pvmove tyle razy, ile jest to konieczne do defragmentacji PV, a następnie zmiana rozmiaru do minimalnego możliwego rozmiaru (który jest nieco większy niż rozmiar używany z powodu metadanych).

pdw
źródło