Converta um volume LVM de unidade única em um volume distribuído em três unidades

4

No meu servidor usando LVM, eu tenho um LV linear simples em uma única unidade (PV). Agora, adicionei mais 2 unidades (mesmo tamanho) (PVs) ao servidor.

Eu quero converter meu LV linear existente em um LV distribuído (como RAID0) nas três unidades, se possível, on-line. Isso me permitiria melhorar o desempenho, graças ao striping. Eu sei que é teoricamente possível.

Eu tentei muitas coisas, como criar um espelho listrado do meu LV, com base em esta técnica de site , mas no meu caso é mais complicado porque eu quero continuar usando a unidade original (no site, é uma migração de uma única unidade LV para 3 outras unidades ).

Estou ficando cada vez mais familiarizado com as ferramentas pvmove , lvconvert e outras ferramentas do LVM, mas não obtive êxito. Por favor ajude. :)

Se necessário, tenho muito pouco espaço extra em outra unidade (cerca de 5% do tamanho original do meu VE).

Meu lvdisplay -m é o seguinte:

--- Logical volume ---
LV Path                /dev/vg_space/vol_space
LV Name                vol_space
VG Name                vg_space
LV Status              available
# open                 1
LV Size                260.75 GiB
Current LE             66752
Segments               1
Allocation             inherit
Read ahead sectors     auto
- currently set to     256
Block device           253:0

--- Segments ---
Logical extent 0 to 66751:
  Type                linear       
  Physical volume     /dev/sda5
  Physical extents    0 to 66751
    
por Totor 03.03.2017 / 11:01

1 resposta

3

Eu finalmente encontrei um truque .

A configuração : digamos que nossa unidade original seja /dev/sda (PV é /dev/sda1 ) e nossas duas novas unidades sejam /dev/sdb e /dev/sdc . Todas as unidades são 100 MB grandes.

A ideia : como todos os nossos dados podem caber na metade de sdb e sdc , podemos colocar temporariamente nossos dados lá e, enquanto isso, criar um espelho listrado de nosso LV entre as outras três metades das unidades. Em seguida, elimine o lado original do espelho (temporário) e estenda nosso LV listrado até o tamanho real.

Esta maravilhosa obra de arte deve explicar melhor:

original state:

   sda       sdb       sdc
 _______   _______   _______
|       | |       | |       |
|       | |       | |       |
|lv_orig| | empty | | empty |
|       | |       | |       |
|       | |       | |       |
|       | |       | |       |
|       | |       | |       |
|_______| |_______| |_______|


partition sdb & sdc, pvmove, then partition sda:

   sda       sdb       sdc
 _______   _______   _______
|       | |       | |       |
| sda1  | | sdb1  | | sdc1  |
| empty | | empty | | empty |
|_______| |_______| |_______|
|       | |       | |       |
| sda2  | |lv_orig| |lv_orig| <= linear on 2 drives
| empty | |half 1 | |half 2 |
|_______| |_______| |_______|


add sda{1,2,3} to vg, mirror the LV on this in striped mode:

   sda       sdb       sdc
 _______   _______   _______
|lv_orig| |lv_orig| |lv_orig|
|mirror | |mirror | |mirror |  <= striped!
|stripe1| |stripe2| |stripe3|
|_______| |_______| |_______|
|       | |       | |       |
| sda2  | |lv_orig| |lv_orig|
| empty | |half 1 | |half 2 |
|_______| |_______| |_______|



get rid of the sd{b,c}2 side of the mirror:

   sda       sdb       sdc
 _______   _______   _______
|       | |       | |       |
|lv_orig| |lv_orig| |lv_orig|  <= still striped!
|stripe1| |stripe2| |stripe3|
|_______| |_______| |_______|
|       | |       | |       |
| sda2  | | sdb2  | | sdc2  |
| empty | | empty | | empty |
|_______| |_______| |_______|


delete sd{a,b,c}2 partitions to extend sd{a,b,c}1 on the whole disk,
finally, extend the lv:

   sda       sdb       sdc
 _______   _______   _______
|       | |       | |       |
| sda1  | | sdb1  | | sdc1  |
|       | |       | |       |
|lv_orig| |lv_orig| |lv_orig|  <= definitely striped!
|       | |       | |       |
|bigger&| |bigger&| |bigger&|
|striped| |striped| |striped|
|_______| |_______| |_______|

Veja como proceder:

Disclaimer: Eu escrevi isso principalmente com base em memórias, por favor, verifique os comandos (e edite o post, se necessário!)

  • crie as partições sdb1 e sdb2 , respectivamente 42 e 58 MB,
  • mesma coisa para sdc ,
  • pvcreate /dev/sd{b,c}{1,2} ,
  • vgextend vg_orig /dev/sdb2 /dev/sdc2 ,
  • pvmove /dev/sda1 moverá todos os dados do LV para sdb2 e sdc2 ,
  • vgreduce vg_orig /dev/sda1 e pvremove /dev/sda1 farão com que o LVM pare completamente de usar sda
  • crie uma partição de 42 MB /dev/sda1 (apagando a anterior, se necessário) e pvcreate /dev/sda1 , vgextend vg_orig dev/sd{a,b,c}1 ,
  • lvconvert --type mirror --mirrors 1 --stripes 3 vg_orig/lv_orig /dev/sd{a,b,c}1 criará um espelho separado do nosso volume LV original (o que estamos procurando!), você pode verificar os detalhes com lvdisplay -am ,
  • o comando anterior pode falhar se o número total de extensões no LV não for um múltiplo de 3, nesse caso, você pode simplesmente adicionar 1 ou 2 ao LV da seguinte forma: lvextend -l +1 vg_orig/lv_orig ,
  • com este comando, nos livraremos da cópia espelhada temporária dos dados que temos em sdb2 e sdc2 : lvconvert --type mirror --mirrors 0 vg_orig/lv_orig /dev/sd{b,c}2 ,
  • remova as partições sdX2 das quais não precisamos mais: vgreduce vg_orig /dev/sd{b,c}2 , pvremove /dev/sd{b,c}2 ,
  • agora temos uma versão distribuída de nossos dados originais, ainda precisamos aumentar as partições de sd{a,b,c}1 , exclua as partições sdb2 e sdc2 e recrie as sda1 , sdb1 e sdc1 , partições para que elas comecem no mesmo número de setor, mas terminem em um número de setor maior (não tenha medo :)),
  • partprobe /dev/sd{a,b,c}1 para atualizar a tabela de partições do kernel,
  • pvresize /dev/sd{a,b,c}1 para fazer o LVM perceber que os PVs são maiores,
  • lvextend -l 100%VG vg_orig/lv_orig para tornar o LV maior agora,
  • resize2fs vg_orig/lv_orig se você tiver um sistema de arquivos ext que deseja expandir on-line.

Aqui está!

É bastante confuso que uma ferramenta como o LVM, supostamente feita para este tipo de operação, não seja capaz de fazer essa tarefa facilmente em um único (ou dois) comando ...

    
por 04.03.2017 / 03:10

Tags