Substituição de discos de menor capacidade por discos de maior capacidade no Linux.

Olá a todos. Às vésperas do início de um novo grupo do curso Administrador Linux publicamos um material útil, escrito por nosso aluno e mentor dos cursos, especialista em suporte técnico de produtos corporativos da REG.RU — Roman Travyin.

Neste artigo, serão discutidos 2 casos de substituição de discos e migração de informações para novos discos de maior capacidade, com posterior expansão do array e do sistema de arquivos. O primeiro caso se referirá à substituição de discos com a mesma partição MBR/MBR ou GPT/GPT, enquanto o segundo caso diz respeito à substituição de discos com partição MBR por discos com mais de 2 TB, que necessitarão de partição GPT com a seção biosboot. Em ambos os casos, os discos para os quais os dados estão sendo transferidos já estão instalados em servidor. O sistema de arquivos utilizado para a partição raiz é o ext4.

Caso 1: Substituição de discos de menor capacidade por discos de maior capacidade (até 2TB)

Problema: Substituir os discos atuais por discos de maior capacidade (até 2 TB) com migração de informações. Neste caso, temos discos de 2 x 240 GB SSD (RAID-1) com o sistema instalado e discos de 2 x 1 TB SATA, para os quais é necessário transferir o sistema.

Vamos considerar a partição atual dos discos.

[root@localhost ~]# lsblk
NAME           MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda              8:0    0 223,6G  0 disk  
├─sda1           8:1    0     1G  0 part  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sda2           8:2    0 222,5G  0 part  
  └─md127        9:127  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]
sdb              8:16   0 223,6G  0 disk  
├─sdb1           8:17   0     1G  0 part  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sdb2           8:18   0 222,5G  0 part  
  └─md127        9:127  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]
sdc              8:32   0 931,5G  0 disk  
sdd              8:48   0 931,5G  0 disk  

Vamos verificar o espaço usado do sistema de arquivos até o momento.

[root@localhost ~]# df -h
Sistema de Arquivos     Tamanho Usado  Disponível Uso% Montado em
devtmpfs                32G            0   32G            0% /dev
tmpfs                   32G            0   32G            0% /dev/shm
tmpfs                   32G         9,6M   32G            1% /run
tmpfs                   32G            0   32G            0% /sys/fs/cgroup
/dev/mapper/vg0-root   204G         1,3G  192G            1% /
/dev/md126            1007M         120M  837M           13% /boot
tmpfs                  6,3G            0  6,3G            0% /run/user/0

O tamanho do sistema de arquivos antes da substituição dos discos é de 204 GB, sendo utilizados 2 arrays de software md126, que está montado em /boot e md127, que é utilizado como volume físico para o grupo VG vg0.

1. Remoção das partições do disco dos arrays

Verificamos o estado do array

[root@localhost ~]# cat /proc/mdstat 
Personalidades: [raid1] 
md126: raid1 ativo sda1[0] sdb1[1]
      1047552 blocos super 1.2 [2/2] [UU]
      bitmap: 0/1 páginas [0KB], 65536KB chunk

md127: raid1 ativo sda2[0] sdb2[1]
      233206784 blocos super 1.2 [2/2] [UU]
      bitmap: 0/2 páginas [0KB], 65536KB chunk

dispositivos não utilizados:

O sistema utiliza 2 arrays: md126 (ponto de montagem /boot) — consiste na partição /dev/sda1 e /dev/sdb1, md127 (LVM para swap e raiz do sistema de arquivos) — consiste em /dev/sda2 e /dev/sdb2.

Marcamos as partições do primeiro disco, que são usadas em cada array, como com falha.

mdadm /dev/md126 --fail /dev/sda1

mdadm /dev/md127 --fail /dev/sda2

Removemos as partições do dispositivo de bloco /dev/sda dos arrays.

mdadm /dev/md126 --remove /dev/sda1

mdadm /dev/md127 --remove /dev/sda2

Depois de remover o disco do array, a informação sobre os dispositivos de bloco ficará assim.

[root@localhost ~]# lsblk
NAME           MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda              8:0    0 223,6G  0 disco  
├─sda1           8:1    0     1G  0 parte  
└─sda2           8:2    0 222,5G  0 parte  
sdb              8:16   0 223,6G  0 disco  
├─sdb1           8:17   0     1G  0 parte  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sdb2           8:18   0 222,5G  0 parte  
  └─md127        9:127  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]
sdc              8:32   0 931,5G  0 disco  
sdd              8:48   0 931,5G  0 disco  

Estado dos arrays após a remoção dos discos.

[root@localhost ~]# cat /proc/mdstat 
Personalidades: [raid1] 
md126: raid1 ativo sdb1[1]
      1047552 blocos super 1.2 [2/1] [_U]
      bitmap: 0/1 páginas [0KB], 65536KB chunk

md127: raid1 ativo sdb2[1]
      233206784 blocos super 1.2 [2/1] [_U]
      bitmap: 1/2 páginas [4KB], 65536KB chunk

dispositivos não utilizados:

2. Copiando a tabela de partições para um novo disco

Você pode verificar a tabela de partições usada no disco com o seguinte comando.

fdisk -l /dev/sdb | grep 'Tipo de etiqueta do disco'

A saída para MBR será:

Tipo de etiqueta do disco: dos

para GPT:

Tipo de etiqueta do disco: gpt

Copiando a tabela de partições para MBR:

sfdisk -d /dev/sdb | sfdisk /dev/sdc

Neste comando primeiro o disco está indicado com cuja partição está sendo copiada, o segundo — para onde copiar.

ATENÇÃO: Para GPT primeiro o disco está indicado para o qual copiar a partição, o segundo disco indicado é o disco de onde copiar a partição. Se inverter os discos, a partição originalmente correta será sobrescrita e destruída.

Copiando a tabela de partições para GPT:

sgdisk -R /dev/sdc /dev/sdb

Em seguida, atribuímos ao disco um UUID aleatório (para GPT).


sgdisk -G /dev/sdc

Após o comando executado, as partições devem aparecer no disco. /dev/sdc.

[root@localhost ~]# lsblk
NAME           MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda              8:0    0 223,6G  0 disco  
├─sda1           8:1    0     1G  0 parte  
└─sda2           8:2    0 222,5G  0 parte  
sdb              8:16   0 223,6G  0 disco  
├─sdb1           8:17   0     1G  0 parte  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sdb2           8:18   0 222,5G  0 parte  
  └─md127        9:127  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]
sdc              8:32   0 931,5G  0 disco  
├─sdc1           8:33   0     1G  0 parte  
└─sdc2           8:34   0 222,5G  0 parte  
sdd              8:48   0 931,5G  0 disco  

Se após a ação realizada as partições no sistema no disco /dev/sdc não foram reconhecidas, execute o comando para reler a tabela de partições.

sfdisk -R /dev/sdc

Se nos discos atuais estiver sendo utilizada a tabela MBR e a informação precisar ser transferida para discos com mais de 2 TB, será necessário criar manualmente uma partição GPT nos novos discos usando a partição biosboot. Este caso será abordado na parte 2 deste artigo.

3. Adicionando partições do novo disco ao array

Vamos adicionar as partições do disco aos arrays correspondentes.

mdadm /dev/md126 --add /dev/sdc1

mdadm /dev/md127 --add /dev/sdc2

Verificamos se as partições foram adicionadas.

[root@localhost ~]# lsblk
NAME           MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda              8:0    0 223,6G  0 disco  
├─sda1           8:1    0     1G  0 parte  
└─sda2           8:2    0 222,5G  0 parte  
sdb              8:16   0 223,6G  0 disco  
├─sdb1           8:17   0     1G  0 parte  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sdb2           8:18   0 222,5G  0 parte  
  └─md127        9:127  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]
sdc              8:32   0 931,5G  0 disco  
├─sdc1           8:33   0     1G  0 parte  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sdc2           8:34   0 222,5G  0 parte  
  └─md127        9:127  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]
sdd              8:48   0 931,5G  0 disco  

Após isso, aguardamos a sincronização dos arrays.

[root@localhost ~]# cat /proc/mdstat 
Personalities : [raid1] 
md126 : active raid1 sdc1[2] sdb1[1]
      1047552 blocks super 1.2 [2/2] [UU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

md127 : active raid1 sdc2[2] sdb2[1]
      233206784 blocks super 1.2 [2/1] [_U]
      [==>..................]  recovery = 10.6% (24859136/233206784) finish=29.3min speed=118119K/sec
      bitmap: 2/2 pages [8KB], 65536KB chunk

unused devices:

É possível monitorar continuamente o processo de sincronização com a ferramenta observar.

watch -n 2 cat /proc/mdstat

Parâmetro -n que indica com que intervalos em segundos é necessário executar o comando para verificar o progresso.

Repetimos os itens 1 a 3 para o próximo disco substituído.

Marcamos as partições do segundo disco que estão sendo usadas em cada array como defeituosas.

mdadm /dev/md126 --fail /dev/sdb1

mdadm /dev/md127 --fail /dev/sdb2

Removemos as partições do dispositivo de bloco /dev/sdb dos arrays.

mdadm /dev/md126 --remove /dev/sdb1

mdadm /dev/md127 --remove /dev/sdb2

Depois de remover o disco do array, a informação sobre os dispositivos de bloco ficará assim.

[root@localhost ~]# lsblk
NAME           MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda              8:0    0 223,6G  0 disco  
├─sda1           8:1    0     1G  0 parte  
└─sda2           8:2    0 222,5G  0 parte  
sdb              8:16   0 223,6G  0 disco  
├─sdb1           8:17   0     1G  0 parte  
└─sdb2           8:18   0 222,5G  0 parte  
sdc              8:32   0 931,5G  0 disco  
├─sdc1           8:33   0     1G  0 parte  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sdc2           8:34   0 222,5G  0 parte  
  └─md127        9:127  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]
sdd              8:48   0 931,5G  0 disco  

Estado dos arrays após a remoção dos discos.

[root@localhost ~]# cat /proc/mdstat 
Personalidades: [raid1] 
md126: raid1 ativo sdc1[2]
      1047552 blocos super 1.2 [2/1] [U_]
      bitmap: 0/1 páginas [0KB], 65536KB chunk

md127: raid1 ativo sdc2[2]
      233206784 blocos super 1.2 [2/1] [U_]
      bitmap: 1/2 páginas [4KB], 65536KB chunk

dispositivos não utilizados:

Copiando a tabela de partição MBR do disco /dev/sdс para o disco /dev/sdd.

sfdisk -d /dev/sdc | sfdisk /dev/sdd

Após o comando executado, as partições devem aparecer no disco. /dev/sdd.

[root@localhost ~]# lsblk
NAME           MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda              8:0    0 223,6G  0 disco  
├─sda1           8:1    0     1G  0 parte  
└─sda2           8:2    0 222,5G  0 parte  
sdb              8:16   0 223,6G  0 disco  
├─sdb1           8:17   0     1G  0 parte  
└─sdb2           8:18   0 222,5G  0 parte  
sdc              8:32   0 931,5G  0 disco  
├─sdc1           8:33   0     1G  0 parte  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sdc2           8:34   0 222,5G  0 parte  
  └─md127        9:127  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]
sdd              8:48   0 931,5G  0 disco  
├─sdd1           8:49   0     1G  0 parte  
└─sdd2           8:50   0 222,5G  0 parte  

Adicionando partições do disco aos arrays.

mdadm /dev/md126 --add /dev/sdd1

mdadm /dev/md127 --add /dev/sdd2

Verificamos se as partições foram adicionadas.

[root@localhost ~]# lsblk
NAME           MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda              8:0    0 223,6G  0 disco  
├─sda1           8:1    0     1G  0 parte  
└─sda2           8:2    0 222,5G  0 parte  
sdb              8:16   0 223,6G  0 disco  
├─sdb1           8:17   0     1G  0 parte  
└─sdb2           8:18   0 222,5G  0 parte  
sdc              8:32   0 931,5G  0 disco  
├─sdc1           8:33   0     1G  0 parte  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sdc2           8:34   0 222,5G  0 parte  
  └─md127        9:127  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]
sdd              8:48   0 931,5G  0 disco  
├─sdd1           8:49   0     1G  0 parte  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sdd2           8:50   0 222,5G  0 parte  
  └─md127        9:127  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]

Após isso, aguardamos a sincronização dos arrays.

[root@localhost ~]# cat /proc/mdstat 
Personalidades : [raid1] 
md126 : raid1 ativo sdd1[3] sdc1[2]
      1047552 blocos super 1.2 [2/2] [UU]
      bitmap: 0/1 páginas [0KB], 65536KB chunk

md127 : raid1 ativo sdd2[3] sdc2[2]
      233206784 blocos super 1.2 [2/1] [U_]
      [>....................]  recuperação =  0.5% (1200000/233206784) finish=35.4min speed=109090K/sec
      bitmap: 2/2 páginas [8KB], 65536KB chunk

dispositivos não utilizados:

5. Instalação do GRUB em novos discos

Para CentOS:

grub2-install /dev/sdX

Para Debian/Ubuntu:

grub-install /dev/sdX

onde X — letra do dispositivo de bloco. Neste caso, é necessário instalar o GRUB em /dev/sdc e /dev/sdd.

6. Expansão do sistema de arquivos (ext4) da partição raiz

Em novos discos /dev/sdc e /dev/sdd estão disponíveis 931,5 GB. Devido ao fato de que a tabela de partições foi copiada de discos de menor capacidade, nas partições /dev/sdc2 e /dev/sdd2 estão disponíveis 222,5 GB.

sdc 8:32 0 931,5G 0 disco 
├─sdc1 8:33 0 1G 0 parte 
│ └─md126 9:126 0 1023M 0 raid1 /boot
└─sdc2 8:34 0 222,5G 0 parte 
 └─md127 9:127 0 222,4G 0 raid1 
 ├─vg0-root 253:0 0 206,4G 0 lvm /
 └─vg0-swap 253:1 0 16G 0 lvm [SWAP]
sdd 8:48 0 931,5G 0 disco 
├─sdd1 8:49 0 1G 0 parte 
│ └─md126 9:126 0 1023M 0 raid1 /boot
└─sdd2 8:50 0 222,5G 0 parte 
 └─md127 9:127 0 222,4G 0 raid1 
 ├─vg0-root 253:0 0 206,4G 0 lvm /
 └─vg0-swap 253:1 0 16G 0 lvm [SWAP]

Necessário:

  1. Expandir a partição 2 em cada um dos discos,
  2. Expandir o array md127,
  3. Expandir PV (volume físico),
  4. Expandir LV (volume lógico) vg0-root,
  5. Expandir o sistema de arquivos.

Usando a ferramenta parted expandiremos a partição /dev/sdc2 até o valor máximo. Executamos o comando parted /dev/sdc (1) e visualizamos a tabela de partições atual com o comando p (2).

Substituição de discos de menor capacidade por discos de maior capacidade no Linux.

Como pode ser visto, o final da partição 2 termina em 240 GB. Faremos a expansão da partição com o comando resizepart 2, onde 2 é o número da partição (3). Indicamos o valor em formato numérico, por exemplo, 1000 GB, ou usamos a indicação de fração do disco — 100%. Novamente verificamos se a partição tem um novo tamanho (4).

Repetimos as ações acima para o disco /dev/sdd. Após a expansão das partições /dev/sdc2 e /dev/sdd2 tornaram-se iguais a 930,5 GB.

[root@localhost ~]# lsblk 
NOME MAJ:MIN RM TAMANHO RO TIPO PONTO_DE_MONTAGEM
sda 8:0 0 223,6G 0 disco 
├─sda1 8:1 0 1G 0 parte 
└─sda2 8:2 0 222,5G 0 parte 
sdb 8:16 0 223,6G 0 disco 
├─sdb1 8:17 0 1G 0 parte 
└─sdb2 8:18 0 222,5G 0 parte 
sdc 8:32 0 931,5G 0 disco 
├─sdc1 8:33 0 1G 0 parte 
│ └─md126 9:126 0 1023M 0 raid1 /boot
└─sdc2 8:34 0 930,5G 0 parte 
 └─md127 9:127 0 222,4G 0 raid1 
 ├─vg0-root 253:0 0 206,4G 0 lvm /
 └─vg0-swap 253:1 0 16G 0 lvm [SWAP]
sdd 8:48 0 931,5G 0 disco 
├─sdd1 8:49 0 1G 0 parte 
│ └─md126 9:126 0 1023M 0 raid1 /boot
└─sdd2 8:50 0 930,5G 0 parte 
 └─md127 9:127 0 222,4G 0 raid1 
 ├─vg0-root 253:0 0 206,4G 0 lvm /
 └─vg0-swap 253:1 0 16G 0 lvm [SWAP]

Após isso, realizaremos a expansão do array md127 até o máximo.

mdadm --grow /dev/md127 --size=max

Verificamos se o array foi expandido. Agora seu tamanho é 930,4 GB.

[root@localhost ~]# lsblk
NAME           MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda              8:0    0 223,6G  0 disk  
├─sda1           8:1    0     1G  0 part  
└─sda2           8:2    0 222,5G  0 part  
sdb              8:16   0 223,6G  0 disk  
├─sdb1           8:17   0     1G  0 part  
└─sdb2           8:18   0 222,5G  0 part  
sdc              8:32   0 931,5G  0 disk  
├─sdc1           8:33   0     1G  0 part  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sdc2           8:34   0 930,5G  0 part  
  └─md127        9:127  0 930,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]
sdd              8:48   0 931,5G  0 disk  
├─sdd1           8:49   0     1G  0 part  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sdd2           8:50   0 930,5G  0 part  
  └─md127        9:127  0 930,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]

Estamos expandindo volume físico. Antes de expandir, vamos verificar o estado atual do PV.

[root@localhost ~]# pvscan
  PV /dev/md127   VG vg0             lvm2 [222,40 GiB / 0    livre]
  Total: 1 [222,40 GiB] / em uso: 1 [222,40 GiB] / sem VG: 0 [0   ]

Como podemos ver, o PV /dev/md127 utiliza 222,4 GB de espaço.

Vamos expandir o PV com o seguinte comando.

pvresize /dev/md127

Verificamos o resultado da expansão do PV.

[

root@localhost ~]# pvscan
  PV /dev/md127   VG vg0             lvm2 [930,38 GiB / 707,98 GiB livre]
  Total: 1 [930,38 GiB] / em uso: 1 [930,38 GiB] / sem VG: 0 [0   ]

Expandindo volume lógico. Antes de expandir, vamos verificar o estado atual do LV (1).

[root@localhost ~]# lvscan
  ATIVO            '/dev/vg0/swap' [<16,00 GiB] herdado
  ATIVO            '/dev/vg0/root' [<206,41 GiB] herdado

LV /dev/vg0/root utiliza 206,41 GB.

Vamos expandir o LV com o seguinte comando (2).

lvextend -l +100%FREE /dev/mapper/vg0-root

Verificamos a ação executada (3).

[root@localhost ~]# lvscan 
  ATIVO            '/dev/vg0/swap' [<16,00 GiB] herdado
  ATIVO            '/dev/vg0/root' [<914,39 GiB] herdado

Como podemos ver, após a expansão, o volume ocupado no espaço em disco tornou-se 914,39 GB.

Substituição de discos de menor capacidade por discos de maior capacidade no Linux.

O tamanho do LV aumentou (4), mas o sistema de arquivos ainda ocupa 204 GB (5).

1. Vamos expandir o sistema de arquivos.

resize2fs /dev/mapper/vg0-root

Verificamos após o comando executado o tamanho do sistema de arquivos.

[root@localhost ~]# df -h
Sistema de arquivos     Tamanho Usado  Disponível % Usado Montado em
devtmpfs                32G            0   32G            0% /dev
tmpfs                   32G            0   32G            0% /dev/shm
tmpfs                   32G         9,5M   32G            1% /run
tmpfs                   32G            0   32G            0% /sys/fs/cgroup
/dev/mapper/vg0-root   900G         1,3G  860G            1% /
/dev/md126            1007M         120M  837M           13% /boot
tmpfs                  6,3G            0  6,3G            0% /run/user/0

O tamanho do sistema de arquivos raiz aumentará para 900 GB. Após as ações realizadas, os discos antigos podem ser removidos.

Caso 2: Substituição de discos menores por discos maiores (mais de 2TB)

Tarefa: Substituir os discos atuais por discos de maior capacidade (2 x 3TB) mantendo as informações. No caso, temos discos 2 x 240 GB SSD (RAID-1) com o sistema instalado e discos 2 x 3 TB SATA, para os quais é necessário transferir o sistema. Nos discos atuais, utiliza-se a tabela de partições MBR. Como os novos discos têm capacidade superior a 2 TB, será necessária a utilização da tabela GPT, já que o MBR não pode trabalhar com discos acima de 2TB.

Vamos analisar a disposição atual dos discos.

[root@localhost ~]# lsblk
NAME           MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda              8:0    0 223,6G  0 disk  
├─sda1           8:1    0     1G  0 part  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sda2           8:2    0 222,5G  0 part  
  └─md127        9:127  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]
sdb              8:16   0 223,6G  0 disk  
├─sdb1           8:17   0     1G  0 part  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sdb2           8:18   0 222,5G  0 part  
  └─md127        9:127  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]
sdc              8:32   0   2,7T  0 disk  
sdd              8:48   0   2,7T  0 disk  

Verificaremos a tabela de partições utilizada no disco /dev/sda.

[root@localhost ~]# fdisk -l /dev/sda | grep 'Disk label type'
Disk label type: dos

No disco /dev/sdb utiliza-se uma tabela de partições semelhante. Vamos verificar o espaço em disco utilizado no sistema.

[root@localhost ~]# df -h
Sistema de Arquivos     Tamaño Usado  Disponível Uso% Montado em
devtmpfs                16G            0   16G            0% /dev
tmpfs                   16G            0   16G            0% /dev/shm
tmpfs                   16G         9,5M   16G            1% /run
tmpfs                   16G            0   16G            0% /sys/fs/cgroup
/dev/mapper/vg0-root   204G         1,3G  192G            1% /
/dev/md126            1007M         120M  837M           13% /boot
tmpfs                  3,2G            0  3,2G            0% /run/user/0

Como pode ser visto, a raiz do sistema de arquivos ocupa 204 GB. Vamos verificar o estado atual do array RAID de software.

1. Instalação da tabela de partições GPT e formatação do disco

Vamos verificar a partição dos discos por setores.

[root@localhost ~]# parted /dev/sda print
Modelo: ATA KINGSTON SVP200S (scsi)
Disco /dev/sda: 240GB
Tamanho do setor (lógico/físico): 512B/512B
Tabela de partições: msdos
Disk Flags: 

Número  Início  Fim   Tamanho  Tipo      Sistema de Arquivos  Flags
 1     1049kB  1076MB  1075MB  primary                    inicial, raid
 2     1076MB  240GB   239GB   primary                    raid

No novo disco de 3TB, precisaremos criar 3 partições:

  1. Seção bios_grub com tamanho de 2MiB para compatibilidade GPT com BIOS,
  2. Partição para o array RAID, que será montado em /boot.
  3. Partição para o array RAID, onde estará LV root e LV swap.

Instalamos a ferramenta parted com o comando yum install -y parted (para CentOS), apt install -y parted (para Debian/Ubuntu).

Usando parted executaremos os seguintes comandos para a formatação do disco.

Executamos o comando parted /dev/sdc e entramos no modo de edição da partição do disco.

Criamos a tabela de partições GPT.

(parted) mktable gpt

Criamos a 1ª partição bios_grub partição e definimos a bandeira para ela.

(parted) mkpart primary 1MiB 3MiB
(parted) set 1 bios_grub on  

Criamos a 2ª partição e definimos a bandeira para ela. A partição será usada como bloco para o array RAID e montada em /boot.

(parted) mkpart primary ext2 3MiB 1028MiB
(parted) set 2 boot on

Criamos a 3ª partição, que também será utilizada como bloco do array em que haverá LVM.

(parted) mkpart primary 1028MiB 100% 

Neste caso, definir a bandeira não é obrigatório, mas se necessário, pode ser definida com o seguinte comando.

(parted) set 3 raid on

Verificamos a tabela de partições criada.

(parted) p                                                                
Modelo: ATA TOSHIBA DT01ACA3 (scsi)
Disco /dev/sdc: 3001GB
Tamanho do setor (lógico/físico): 512B/4096B
Tabela de partições: gpt
Bandeiras do disco: 

Número  Início  Fim   Tamanho  Sistema de Arquivos  Nome      Bandeiras
 1     1049kB  3146kB  2097kB                    primary  bios_grub
 2     3146kB  1077MB  1074MB                    primary  inicial
 3     1077MB  3001GB  3000GB                    primary

Atribuímos um novo GUID aleatório ao disco.

sgdisk -G /dev/sdd

2. Remoção das partições do primeiro disco dos arrays

Verificamos o estado do array

[root@localhost ~]# cat /proc/mdstat 
Personalidades: [raid1] 
md126: raid1 ativo sda1[0] sdb1[1]
      1047552 blocos super 1.2 [2/2] [UU]
      bitmap: 0/1 páginas [0KB], 65536KB chunk

md127: raid1 ativo sda2[0] sdb2[1]
      233206784 blocos super 1.2 [2/2] [UU]
      bitmap: 0/2 páginas [0KB], 65536KB chunk

dispositivos não utilizados:

O sistema utiliza 2 arrays: md126 (ponto de montagem /boot) — consiste em /dev/sda1 e /dev/sdb1, md127 (LVM para swap e raiz do sistema de arquivos) — consiste em /dev/sda2 e /dev/sdb2.

Marcamos as partições do primeiro disco, que são usadas em cada array, como com falha.

mdadm /dev/md126 --fail /dev/sda1

mdadm /dev/md127 --fail /dev/sda2

Removemos as partições do dispositivo de bloco /dev/sda dos arrays.

mdadm /dev/md126 --remove /dev/sda1

mdadm /dev/md127 --remove /dev/sda2

Verificamos o estado do array após a remoção do disco.

[root@localhost ~]# cat /proc/mdstat 
Personalidades: [raid1] 
md126: active raid1 sdb1[1]
      1047552 blocks super 1.2 [2/1] [_U]
      bitmap: 0/1 pages [0KB], 65536KB chunk

md127: active raid1 sdb2[1]
      233206784 blocks super 1.2 [2/1] [_U]
      bitmap: 2/2 pages [8KB], 65536KB chunk

dispositivos não utilizados:

3. Adicionando partições do novo disco ao array

O próximo passo é adicionar as partições do novo disco aos arrays para sincronização. Vamos verificar o estado atual das formatações dos discos.

[root@localhost ~]# lsblk
NOME           MAJ:MIN RM   TAMANHO RO TIPO  PONTO DE MONTAGEM
sda              8:0    0 223,6G  0 disco  
├─sda1           8:1    0     1G  0 parte  
└─sda2           8:2    0 222,5G  0 parte  
sdb              8:16   0 223,6G  0 disco  
├─sdb1           8:17   0     1G  0 parte  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sdb2           8:18   0 222,5G  0 parte  
  └─md127        9:127  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]
sdc              8:32   0   2,7T  0 disco  
├─sdc1           8:33   0     2M  0 parte  
├─sdc2           8:34   0     1G  0 parte  
└─sdc3           8:35   0   2,7T  0 parte  
sdd              8:48   0   2,7T  0 disco  

Seção /dev/sdc1 é bios_grub partição e não participa na criação de arrays. Apenas /dev/sdc2 e /dev/sdc3. Adicionamos essas partições aos arrays correspondentes.

mdadm /dev/md126 --add /dev/sdc2

mdadm /dev/md127 --add /dev/sdc3

Após isso, aguardamos a sincronização do array.

[root@localhost ~]# cat /proc/mdstat 
Personalidades : [raid1] 
md126 : raid1 ativo sdc2[2] sdb1[1]
      1047552 blocos super 1.2 [2/2] [UU]
      bitmap: 0/1 páginas [0KB], 65536KB chunk

md127 : raid1 ativo sdc3[2] sdb2[1]
      233206784 blocos super 1.2 [2/1] [_U]
      [>....................]  recuperação =  0.2% (619904/233206784) finaliza=31.2min velocidade=123980K/seg
      bitmap: 2/2 páginas [8KB], 65536KB chunk
dispositivos não utilizados:

Particionamento do disco após a adição de partições ao array.

[root@localhost ~]# lsblk
NOME           MAJ:MIN RM   TAMANHO RO TIPO  PONTO DE MONTAGEM
sda              8:0    0 223,6G  0 disco  
├─sda1           8:1    0     1G  0 parte  
└─sda2           8:2    0 222,5G  0 parte  
sdb              8:16   0 223,6G  0 disco  
├─sdb1           8:17   0     1G  0 parte  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sdb2           8:18   0 222,5G  0 parte  
  └─md127        9:127  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]
sdc              8:32   0   2,7T  0 disco  
├─sdc1           8:33   0     2M  0 parte  
├─sdc2           8:34   0     1G  0 parte  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sdc3           8:35   0   2,7T  0 parte  
  └─md127        9:127  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]
sdd              8:48   0   2,7T  0 disco  

4. Remoção das partições do segundo disco dos arrays

Marcamos as partições do segundo disco que estão sendo usadas em cada array como defeituosas.

mdadm /dev/md126 --fail /dev/sdb1

mdadm /dev/md127 --fail /dev/sdb2

Removemos as partições do dispositivo de bloco /dev/sda dos arrays.

mdadm /dev/md126 --remove /dev/sdb1

mdadm /dev/md127 --remove /dev/sdb2

5. Copiamos a tabela de partição GPT e sincronizamos o array

Para copiar a tabela de partição GPT, usaremos a ferramenta sgdisk, que faz parte do pacote para trabalhar com partições de disco e a tabela GPT — gdisk.

Instalação gdisk para CentOS:

yum install -y gdisk

Instalação gdisk para Debian/Ubuntu:

apt install -y gdisk

ATENÇÃO: Para GPT primeiro o disco está indicado para o qual copiamos a partição, o segundo disco indicado é o disco de onde copia a partição. Se os discos forem trocados, a partição originalmente correta será sobrescrita e destruída.

Copiamos a tabela de partição GPT.

sgdisk -R /dev/sdd /dev/sdc

Particionamento do disco após a transferência da tabela para o disco /dev/sdd.

[root@localhost ~]# lsblk
NOME           MAJ:MIN RM   TAMANHO RO TIPO  PONTO DE MONTAGEM
sda              8:0    0 223,6G  0 disco  
├─sda1           8:1    0     1G  0 parte  
└─sda2           8:2    0 222,5G  0 parte  
sdb              8:16   0 223,6G  0 disco  
├─sdb1           8:17   0     1G  0 parte  
└─sdb2           8:18   0 222,5G  0 parte  
sdc              8:32   0   2,7T  0 disco  
├─sdc1           8:33   0     2M  0 parte  
├─sdc2           8:34   0     1G  0 parte  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sdc3           8:35   0   2,7T  0 parte  
  └─md127        9:127  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]
sdd              8:48   0   2,7T  0 disco  
├─sdd1           8:49   0     2M  0 parte  
├─sdd2           8:50   0     1G  0 parte  
└─sdd3           8:51   0   2,7T  0 parte  

Em seguida, adicionamos cada uma das partições que fazem parte dos arrays RAID baseados em software.

mdadm /dev/md126 --add /dev/sdd2

mdadm /dev/md127 --add /dev/sdd3

Aguardamos a sincronização do array.

[root@localhost ~]# cat /proc/mdstat 
Personalidades : [raid1] 
md126 : ativo raid1 sdd2[3] sdc2[2]
      1047552 blocos super 1.2 [2/2] [UU]
      bitmap: 1/1 páginas [4KB], 65536KB chunk

md127 : ativo raid1 sdd3[3] sdc3[2]
      233206784 blocos super 1.2 [2/1] [U_]
      [>....................]  recuperação =  0.0% (148224/233206784) finish=26.2min velocidade=148224K/sec
      bitmap: 2/2 páginas [8KB], 65536KB chunk
dispositivos não utilizados: <nenhum>

Após copiar a partição GPT para o segundo novo disco, a partição ficará assim.

[root@localhost ~]# lsblk
NOME           MAJ:MIN RM   TAMANHO RO TIPO  PONTO_DE_MONTAGEM
sda              8:0    0 223,6G  0 disco  
├─sda1           8:1    0     1G  0 parte  
└─sda2           8:2    0 222,5G  0 parte  
sdb              8:16   0 223,6G  0 disco  
├─sdb1           8:17   0     1G  0 parte  
└─sdb2           8:18   0 222,5G  0 parte  
sdc              8:32   0   2,7T  0 disco  
├─sdc1           8:33   0     2M  0 parte  
├─sdc2           8:34   0     1G  0 parte  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sdc3           8:35   0   2,7T  0 parte  
  └─md127        9:127  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   \
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]
sdd              8:48   0   2,7T  0 disco  
├─sdd1           8:49   0     2M  0 parte  
├─sdd2           8:50   0     1G  0 parte  
│ └─md126        9:126  0  1023M  0 raid1 /boot
└─sdd3           8:51   0   2,7T  0 parte  
  └─md127        9:127  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   \
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]

Em seguida, instalamos o GRUB nos novos discos.

Instalação para CentOS:

grub2-install /dev/sdX

Instalação para Debian/Ubuntu:

grub-install /dev/sdX

onde X — letra do disco, neste caso os discos /dev/sdc e /dev/sdd.

Atualizamos as informações do array.

Para CentOS:

mdadm --detail --scan --verbose > /etc/mdadm.conf

Para Debian/Ubuntu:

echo "DISPOSITIVOS partições" > /etc/mdadm/mdadm.conf

mdadm --detail --scan --verbose | awk '/ARRAY/ {print}' >> /etc/mdadm/mdadm.conf

Atualizamos a imagem initrd:
Para CentOS:

dracut -f -v --regenerate-all

Para Debian/Ubuntu:

update-initramfs -u -k all

Atualizamos a configuração do GRUB.

Para CentOS:

grub2-mkconfig -o /boot/grub2/grub.cfg

Para Debian/Ubuntu:

update-grub

Após as ações realizadas, os discos antigos podem ser removidos.

6. Expansão do sistema de arquivos (ext4) da partição raiz

Particionamento dos discos antes da expansão do sistema de arquivos após a transferência para discos 2 x 3TB (RAID-1).

[root@localhost ~]# lsblk
NOME           MAJ:MIN RM   TAMANHO RO TIPO  PONTO_DE_MONTAGEM
sda              8:0    0 223,6G  0 disco  
sdb              8:16   0 223,6G  0 disco  
sdc              8:32   0   2,7T  0 disco  
├─sdc1           8:33   0     2M  0 parte  
├─sdc2           8:34   0     1G  0 parte  
│ └─md127        9:127  0  1023M  0 raid1 /boot
└─sdc3           8:35   0   2,7T  0 parte  
  └─md126        9:126  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   \
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]
sdd              8:48   0   2,7T  0 disco  
├─sdd1           8:49   0     2M  0 parte  
├─sdd2           8:50   0     1G  0 parte  
│ └─md127        9:127  0  1023M  0 raid1 /boot
└─sdd3           8:51   0   2,7T  0 parte  
  └─md126        9:126  0 222,4G  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   \
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]

Agora as partições /dev/sdc3 e /dev/sdd3 ocupam 2,7 TB. Como criamos uma nova partição de disco com uma tabela GPT, o tamanho de 3 partições foi imediatamente definido para o espaço máximo disponível, portanto, não é necessário expandir a partição neste caso.

Necessário:

  1. Expandir o array md126,
  2. Expandir PV (volume físico),
  3. Expandir LV (volume lógico) vg0-root,
  4. Expandir o sistema de arquivos.

1. Expandindo o array md126 até o máximo.

mdadm --grow /dev/md126 --size=max

Após a expansão do array md126 o tamanho do espaço ocupado aumentou para 2,7 TB.

[root@localhost ~]# lsblk
NAME           MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda              8:0    0 223,6G  0 disk  
sdb              8:16   0 223,6G  0 disk  
sdc              8:32   0   2,7T  0 disk  
├─sdc1           8:33   0     2M  0 part  
├─sdc2           8:34   0     1G  0 part  
│ └─md127        9:127  0  1023M  0 raid1 /boot
└─sdc3           8:35   0   2,7T  0 part  
  └─md126        9:126  0   2,7T  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]
sdd              8:48   0   2,7T  0 disk  
├─sdd1           8:49   0     2M  0 part  
├─sdd2           8:50   0     1G  0 part  
│ └─md127        9:127  0  1023M  0 raid1 /boot
└─sdd3           8:51   0   2,7T  0 part  
  └─md126        9:126  0   2,7T  0 raid1 
    ├─vg0-root 253:0    0 206,4G  0 lvm   /
    └─vg0-swap 253:1    0    16G  0 lvm   [SWAP]

Expandindo volume físico.

Antes de expandir, verificamos o valor atual do espaço ocupado PV /dev/md126.

[root@localhost ~]# pvs
  PV         VG  Fmt  Attr PSize   PFree
  /dev/md126 vg0 lvm2 a--  222,40g    0 

Expandimos o PV com o seguinte comando.

pvresize /dev/md126

Verificamos a ação realizada.

[root@localhost ~]# pvs
  PV         VG  Fmt  Attr PSize  PFree
  /dev/md126 vg0 lvm2 a--  <2,73t 2,51t

Expandindo volume lógico vg0-root.

Após a expansão do PV, vamos verificar o espaço ocupado do VG.

[root@localhost ~]# vgs
  VG  #PV #LV #SN Attr   VSize  VFree
  vg0   1   2   0 wz--n- <2,73t 2,51t

Verificamos o espaço ocupado do LV.

[root@localhost ~]# lvs
  LV   VG  Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root vg0 -wi-ao---- <206,41g                                                    
  swap vg0 -wi-ao---- <16,00g            

O volume vg0-root ocupa 206,41 GB.

Expandimos o LV até o máximo do espaço em disco.

lvextend -l +100%FREE /dev/mapper/vg0-root 

Verificamos o espaço do LV após a expansão.

[root@localhost ~]# lvs
  LV   VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root vg0 -wi-ao----   2,71t                                                    
  swap vg0 -wi-ao---- <16,00g

Expandimos o sistema de arquivos (ext4).

Verificamos o tamanho atual do sistema de arquivos.

[root@localhost ~]# df -h
Sistema de arquivos     Tamanho Usado  Disponível %Usado Montado em
devtmpfs                16G            0   16G            0% /dev
tmpfs                   16G            0   16G            0% /dev/shm
tmpfs                   16G         9,6M   16G            1% /run
tmpfs                   16G            0   16G            0% /sys/fs/cgroup
/dev/mapper/vg0-root   204G         1,4G  192G            1% 
/dev/md127            1007M         141M  816M           15% /boot
tmpfs                  3,2G            0  3,2G            0% /run/user/0

O volume /dev/mapper/vg0-root ocupa 204 GB após a expansão do LV.

Expandimos o sistema de arquivos.

resize2fs /dev/mapper/vg0-root 

Verificando o tamanho do sistema de arquivos após sua expansão.

[root@localhost ~]# df -h
Sistema de arquivos     Tamanho Usado   Disponível Usado% Montado em
devtmpfs                16G          0   16G          0% /dev
tmpfs                   16G          0   16G          0% /dev/shm
tmpfs                   16G       9,6M   16G          1% /run
tmpfs                   16G          0   16G          0% /sys/fs/cgroup
/dev/mapper/vg0-root   2,7T       1,4G  2,6T          1% /
/dev/md127            1007M       141M  816M         15% /boot
tmpfs                  3,2G          0  3,2G          0% /run/user/0

O tamanho do sistema de arquivos foi aumentado para todo o volume do disco.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster