Reduzindo o volume físico do LVM no array RAID degradado do mdadm, adicionando um sobressalente e reconstruindo-o

8

Eu tenho um sistema Debian Wheezy com um par de HDDs de 500 GB em RAID-1 ( mdadm mirror), em cima do qual fica LVM volumes lógicos com 5 partições ( boot , root , usr , var e tmp ), tamanho total de 47.15 GiB. 418,38 GiB no volume físico estão livres. GRUB instalado em ambas as unidades.

Um dos HDDs falhou e agora o array está degradado, mas os dados estão intactos.

O que eu quero é trocar todos esses 2 HDDs por SSDs de 80 GB sem a necessidade de reinstalar o sistema a partir do zero. O ponto sutil aqui é que eu preciso diminuir o volume físico do LVM para corresponder ao tamanho do SSD, mas os volumes lógicos não são contíguos (há muito espaço livre no começo), então eu tenho que de alguma forma mover volumes lógicos dentro de um físico . E não existe o comando lvmove no Debian.

Como faço para isso?

Alguma saída do console:

Versões:

root@wheezy:~# uname -a && mdadm --version && lvm version
Linux wheezy 3.2.0-4-amd64 #1 SMP Debian 3.2.63-2+deb7u1 x86_64 GNU/Linux
mdadm - v3.2.5 - 18th May 2012
  LVM version:     2.02.95(2) (2012-03-06)
  Library version: 1.02.74 (2012-03-06)
  Driver version:  4.22.0

Detalhes da matriz:

root@wheezy:~# mdadm -D /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Thu Dec  4 12:20:22 2014
     Raid Level : raid1
     Array Size : 488148544 (465.53 GiB 499.86 GB)
  Used Dev Size : 488148544 (465.53 GiB 499.86 GB)
   Raid Devices : 2
  Total Devices : 1
    Persistence : Superblock is persistent

    Update Time : Thu Dec  4 13:08:59 2014
          State : clean, degraded 
 Active Devices : 1
Working Devices : 1
 Failed Devices : 0
  Spare Devices : 0

           Name : wheezy:0  (local to host wheezy)
           UUID : 44ea4079:b3b837d3:b9bb2ca1:1b95272a
         Events : 26

Number   Major   Minor   RaidDevice State
   0       8       16        0      active sync   /dev/sdb
   1       0        0        1      removed

Detalhes breves do LVM:

root@wheezy:~# pvs && vgs && lvs                                                                                               
  PV         VG     Fmt  Attr PSize   PFree                                                                                          
  /dev/md0   system lvm2 a--  465.53g 418.38g                                                                                        
  VG     #PV #LV #SN Attr   VSize   VFree                                                                                            
  system   1   5   0 wz--n- 465.53g 418.38g                                                                                          
  LV   VG     Attr     LSize   Pool Origin Data%  Move Log Copy%  Convert                                                            
  boot system -wi----- 152.00m                                                                                                       
  root system -wi-----   2.00g                                                                                                       
  tmp  system -wi-----  10.00g                                                                                                       
  usr  system -wi-----  20.00g                                                                                                       
  var  system -wi-----  15.00g

Segmentação do PV:

root@wheezy:~# pvs -v --segments /dev/md0
    Using physical volume(s) on command line
    PV         VG     Fmt  Attr PSize   PFree   Start  SSize LV   Start Type   PE Ranges             
    /dev/md0   system lvm2 a--  465.53g 418.38g      0 89600          0 free                         
    /dev/md0   system lvm2 a--  465.53g 418.38g  89600    38 boot     0 linear /dev/md0:89600-89637  
    /dev/md0   system lvm2 a--  465.53g 418.38g  89638   512 root     0 linear /dev/md0:89638-90149  
    /dev/md0   system lvm2 a--  465.53g 418.38g  90150  5120 usr      0 linear /dev/md0:90150-95269  
    /dev/md0   system lvm2 a--  465.53g 418.38g  95270  3840 var      0 linear /dev/md0:95270-99109  
    /dev/md0   system lvm2 a--  465.53g 418.38g  99110  1280          0 free                         
    /dev/md0   system lvm2 a--  465.53g 418.38g 100390  2560 tmp      0 linear /dev/md0:100390-102949
    /dev/md0   system lvm2 a--  465.53g 418.38g 102950 16226          0 free  
    
por TranslucentCloud 04.12.2014 / 14:08

3 respostas

5

Você não precisa reduzir o pv ou reconstruir o array. Você só precisa criar um novo array a partir das novas unidades e adicioná-lo como um novo pv ( pvcreate + vgextend ), então pvmove de todos os lvs existentes do antigo pv, depois remover o antigo pv ( vgreduce ) e tire essa unidade de serviço.

    
por 04.12.2014 / 15:37
3

Não é lvmove , mas pvmove .

pvmove --alloc=anywhere /dev/md0:89600-102950 /dev/md0:0-12070

Isso deve mover quaisquer extensões dentro do intervalo 89600-102950 para o intervalo de 0-12070. De acordo com os dados que você postou, isso deve fazer com que seus LVs sejam realocados para o início do seu PV.

    
por 04.12.2014 / 14:40
3

ATENÇÃO: ESTE GUIA ESTÁ LONGO A PARTIR DO OPTIMAL. VERIFIQUE A RESPOSTA ACEITADA

Ok, descobri como fazer o que tentei. Este será um tipo de tutorial.

Durante esse tempo eu ainda não tinha percebido, que as manipulações com LVs são possíveis quando os sistemas de arquivos são montados e iniciados em alguma distribuição live do Linux (SystemRescueCD). As pessoas aqui me explicaram que não há necessidade disso se você não estiver manipulando com sistemas de arquivos reais e apenas alinhando LVs e encolhendo PV.

Assim, com este guia, você definitivamente conseguirá o que deseja, mas não de maneira eficiente, porque confronta a natureza do LVM - possibilidade de fazer coisas ao vivo .

  1. Devido à natureza não contígua dos volumes lógicos no meu volume físico, eu deveria de alguma forma movê-los no início do volume físico. O comando pvmove , como sugerido por @frostschutz, pode mover LVs dentro de PV :

    root@wheezy:/home/a# pvmove --alloc=anywhere /dev/md0:89600-102950 /dev/md0:0-12070
    /dev/md0: Moved: 100.0%
    
    root@wheezy:/home/a# pvs -v --segments /dev/md0
        Using physical volume(s) on command line
      PV         VG     Fmt  Attr PSize   PFree   Start SSize  LV   Start Type   PE Ranges          
      /dev/md0   system lvm2 a--  465.53g 418.38g     0     38 boot     0 linear /dev/md0:0-37      
      /dev/md0   system lvm2 a--  465.53g 418.38g    38    512 root     0 linear /dev/md0:38-549    
      /dev/md0   system lvm2 a--  465.53g 418.38g   550   5120 usr      0 linear /dev/md0:550-5669  
      /dev/md0   system lvm2 a--  465.53g 418.38g  5670   2560 tmp      0 linear /dev/md0:5670-8229 
      /dev/md0   system lvm2 a--  465.53g 418.38g  8230   3840 var      0 linear /dev/md0:8230-12069
      /dev/md0   system lvm2 a--  465.53g 418.38g 12070 107106          0 free  
    
  2. Agora o PV está pronto para encolher para o tamanho do SSD (80 GB). 80 gigabytes são na verdade 80000000000 bytes:

    root@wheezy:/home/a# pvresize --setphysicalvolumesize 80000000000B /dev/md0
      Physical volume "/dev/md0" changed
      1 physical volume(s) resized / 0 physical volume(s) not resized
    
    root@wheezy:/home/a# pvs
      PV         VG     Fmt  Attr PSize  PFree 
      /dev/md0   system lvm2 a--  74.50g 27.36g
    
  3. Depois disso, posso redimensionar o array em si. Não há sistemas de arquivos neste nível, então acabo com apenas o comando mdadm --grow , que pode realmente ser usado para reduzir matrizes também. O tamanho deve ser digitado em kibibytes , por isso é 80000000000/1024 = 78125000:

    root@wheezy:/home/a# mdadm --grow --size=78125000 /dev/md0
    mdadm: component size of /dev/md0 has been set to 78125000K
    
    root@wheezy:/home/a# mdadm -D /dev/md0
    /dev/md0:
            Version : 1.2
      Creation Time : Thu Dec  4 12:20:22 2014
         Raid Level : raid1
         Array Size : 78125000 (74.51 GiB 80.00 GB)
      Used Dev Size : 78125000 (74.51 GiB 80.00 GB)
       Raid Devices : 2
      Total Devices : 1
        Persistence : Superblock is persistent
    
        Update Time : Thu Dec  4 17:56:53 2014
              State : clean, degraded 
     Active Devices : 1
    Working Devices : 1
     Failed Devices : 0
      Spare Devices : 0
    
               Name : wheezy:0  (local to host wheezy)
               UUID : 44ea4079:b3b837d3:b9bb2ca1:1b95272a
             Events : 60
    
        Number   Major   Minor   RaidDevice State
           0       8       16        0      active sync   /dev/sdb
           1       0        0        1      removed
    
  4. Agora é hora de adicionar um SSD existente ao array e deixá-lo reconstruir:

    root@wheezy:/home/a# mdadm --add /dev/md0 /dev/sdc
    mdadm: added /dev/sdc
    
    root@wheezy:/home/a# cat /proc/mdstat 
    Personalities : [raid1] 
    md0 : active raid1 sdc[2] sdb[0]
          78125000 blocks super 1.2 [2/1] [U_]
          [>....................]  recovery =  1.3% (1081920/78125000)         finish=11.8min speed=108192K/sec
    
    unused devices: <none>
    

Após a reconstrução, tenho um array saudável. Seus membros podem ser trocados e a instalação do GRUB pode ser executada rotineiramente (após a inicialização no sistema de produção) com grub-install /dev/sdc .

    
por 04.12.2014 / 16:13