Como reduzir o tamanho do grupo de volumes no 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

Então, eu tenho um VG com 65 GByte de espaço livre. Mas quando eu quero reduzir esse grupo de volumes em cerca de 50 GByte:

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

Portanto, a mensagem de erro é:

cannot resize to 63231 extents as later ones are allocated.

P: Como posso desfragmentar o vg_root para remover a parte desnecessária dele?

ps: Eu já descobri que só preciso redimensionar o PV para redimensionar o VG, ou existem comandos melhores para redimensionar o VG (por exemplo: o que posso fazer se você quiser vários VGs em um PV? ... )?

gasko peter
fonte

Respostas:

31

Você pode usar pvmovepara mover essas extensões para o início do dispositivo ou outro dispositivo:

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

Em seguida, pvmoveescolhe para onde mover as extensões, ou você pode especificar para onde movê-las.

Veja pvs -v --segments /dev/devicepara ver quais extensões estão atualmente alocadas.

Stéphane Chazelas
fonte
11
Para mim, o problema foi que ele mudou os PEs para outros lugares. Teve que especificar destino por exemplo:sudo pvmove --alloc anywhere /dev/sdX2:60000-76182 /dev/sdX2:3000-19182
akostadinov
29

Estas são as etapas necessárias para redimensionar uma partição LVM ou LVM2:

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

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

O último comando pvresize,, pode gerar o erro

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

Você precisa reorganizar o espaço não alocado no final do LVM. Isso significa que após a raiz e a partição swap_1. Você pode ver a disposição atual do espaço com este comando

pvs -v --segments /dev/sda5

pvs mostrará uma saída como esta

/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

Agora use pvmovepara remover a fragmentação externa:

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

Agora vamos ver se a movimentação do volume de troca foi bem-sucedida.

pvs -v --segments /dev/sda5

deve mostrar a nova ordem dos volumes:

/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

Depois disso, use GParted e redimensione o LVM para a área máxima usada. O restante ficará em espaço não alocado.

Ujjal Roy
fonte
Esta é uma resposta bastante abrangente - seria útil, se incluísse a etapa 0 para redimensionar o sistema de arquivos, por exemplo, resize2fs. Eu não acho que ele precisa ser em detalhes, mas apenas ter algo lá como um empurrãozinho para futuros espectadores seria útil
Justin
Eu tinha espaço livre no começo, chamar pvmove sem destino não o moveu para o começo. O que funcionou foi pvmove --alloc anywhere /dev/sda5:yyyy-end 0-newendcom o "newend" calculado como final - aaaa. No entanto, não tenho certeza se isso funciona se o espaço livre no início for menor que o intervalo a ser movido. Também acho que há um erro de digitação em suas saídas de pvs, acho que você quis dizer em /dev/sda5:0-xxxvez de /dev/sda:0-xxx.
pcworld 12/01
2
@ Justin O --resizefsparâmetro de lvresizejá cuida de redimensionar o sistema de arquivos subjacente.
pcworld 12/01
@pcworld acabou de ler a página de manual e parece que você está certo
Justin
Excelente resposta - mas você pode elaborar o último passo? Presumo que "redimensionar o LVM" significa "redimensionar o volume físico?" Existe uma maneira de fazer isso sem o GParted, na linha de comando, para sistemas que não possuem uma GUI?
Kevin Keane
1

Esta postagem mais antiga cobre esse tipo de encolhimento, para que você possa usar o novo espaço para outra coisa. Você precisará redimensioná-lo para os dados, no entanto, antes. Isso deve cobrir esse e outros erros que você recebe também. Como é mais antigo, leia primeiro:

DigitalTidBits
fonte
0

eu uso esse método, não tenho certeza se é o melhor, mas funciona para mim

use-o com cuidado e não com o SysAdmin

calcular a diferença que causa o problema

324% 4 = 0 sem problemas

mas

324% 32 = 10,125

esse é o problema para que não caiba

eu acho que se chama "obter número real"

lvmdiskscan

para listar partições envolvidas

então

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

eu tenho que adicionar 4M extras para trabalhar, acho que está relacionado ao tamanho antigo do PE

finalmente

vgchange -s 32M **
Mohamed Abo Badawy
fonte
0

As respostas anteriores me ajudaram a resolver esse problema, mas eu precisava automatizá-lo e escrevi 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

Isso chama o pvmove para você quantas vezes for necessário para desfragmentar o PV e o redimensiona para o tamanho mínimo possível (que é um pouco mais do que o tamanho usado devido aos metadados).

pdw
fonte