Redimensionamento ao vivo de uma partição GPT no Linux

12

No Linux, eu costumava redimensionar partições MBR usando o fdisk, mesmo em sistemas de arquivos dinâmicos, e depois emitia um resize2fs / pvresize / ... (dependendo do tipo fs) para obter o novo espaço alocado.

Ultimamente, tenho usado partições Xen e GPT, e notei que, infelizmente, as partições não parecem permitir o redimensionamento instantâneo de uma partição montada; na verdade, ela irá reclamar:

Error: Partition XXX is being used. You must unmount it before you modify it with Parted.

Eu tentei o resizecomando e a combinação rm+ mkpart, mas ambos reclamarão da partição que está sendo montada.

Como eu posso fazer isso?

cyberz
fonte
Uma maneira disponível fora da caixa no RHEL / CentOS seria muito apreciada
cyberz

Respostas:

12

A maneira mais segura de fazer isso é inicializar usando uma mídia de emergência (um CD ao vivo ou semelhante) e usar GParted, que redimensionará a partição e o sistema de arquivos que ela contém. Isso funcionará apenas se a partição não estiver sendo usada no momento.

Se você não puder pagar nenhum tempo de inatividade, tente usar em gdiskvez de parted. Você precisará excluir a partição que deseja redimensionar e criar uma nova em seu lugar, com o mesmo ponto de início, da mesma forma que teria feito fdisk. gdiskestá disposto a trabalhar em um disco em uso, embora o kernel possa não registrar nenhuma alteração. Nesse caso, pode ser necessário usar partprobeou kpartxfazer com que o kernel aceite a nova tabela de partição ou até mesmo reinicie o computador se isso não funcionar. (Tudo isso deve ser bem parecido com o uso fdisk.)

Rod Smith
fonte
Parece bom, mas não está incluído por padrão no CentOS. Mais maneiras padrão? Quer dizer, um redhat-like sistema deve ser capaz de se auto redimensionamento sem depender de programas externos
cyberz
2
Não há nenhuma ferramenta fornecida com o CentOS que fará o trabalho. Você deve sair do repositório do CentOS para fazer o que quiser. Observe que quase todas as outras distribuições (incluindo o Fedora) incluem gdiskem seus repositórios, e ouvi dizer que gdiskserão incluídas na próxima versão do RHEL (e, portanto, do CentOS).
Rod Smith
Obrigado pela resposta eo comentário, é exatamente a informação que eu estava procurando
cyberz
1
gdiskestá disponível no EPEL.
jornane 27/08
Eu tentei os dois partxe, partprobeeventualmente, tive que reiniciar. De qualquer forma, obrigado por essas dicas
Alexandre Bourlier
10

Isso geralmente funciona apenas com distribuições Linux mais recentes. Ferramentas necessárias:

  • partprobe (geralmente parte do parted)
  • gdisk / sgdisk

Uma partição GPT armazena um cabeçalho de backup no final do disco. Se você redimensionou o dispositivo subjacente, o cabeçalho do backup estará em algum lugar no meio. O primeiro passo é mover o cabeçalho da partição para o final do disco.

Supondo que o disco seja / dev / sda e a partição seja / dev / sda3 (também deve ser a última partição):

sgdisk -e /dev/sda

Em seguida, exclua a última partição e recrie-a:

sgdisk -d 3 /dev/sda
sgdisk -N 3 /dev/sda

Você geralmente verá uma mensagem indicando que o kernel não pode recarregar a tabela de partições. Você precisa executar o partprobe para que a partição seja registrada com o novo tamanho:

partprobe /dev/sda

Se isso não der certo, você precisará reiniciar a máquina virtual. Depois disso, você pode aumentar seu sistema de arquivos com a ferramenta apropriada, para ext4 etc .:

resize2fs /dev/sda3

Cuidado : a execução do sgdisk pode ser destrutiva. Verifique se você possui os procedimentos de backup adequados.

Nils Meyer
fonte
Impressionante! Obrigado especialmente pela partprobeetapa - sempre achei necessário reiniciar ao alterar a tabela de partições com quaisquer partições montadas.
piit79
Lembre-se de que destruir e recriar a partição irá gerar um novo PARTUUID para a partição, que é a única maneira confiável e independente do sistema de arquivos para o fstab / GRUB / etc identificar partições de maneira confiável nas configurações de vários discos.
Teo Klestrup Röijezon
5

Aqui está um exemplo que uma ferramenta automatizada usa para redimensionar uma partição online, em uma execução:

sgdisk -d 1 -n 1: 2048: 0 -c 1: -u 1: E485F29F-A1F4-4953-9DD8-799EAEA0119B -t 1: 0700 / dev / xvda

Aqui está uma lista de opções para o comando sgdisk:

  • -d 1 primeira partição de exclusão
  • -n 1: 2048: 0 diz criar uma nova partição "número 1", com o setor inicial 2048. Setor final = "0", que significa "usar todo o espaço disponível para esta partição
  • -u define um guia exclusivo para essa partição (isso é específico para partições GPT); você pode usar 'R' para que o GUID seja definido como um valor aleatório. Você também pode obter o ID das partições atuais através da gdisk /dev/xvda; psaída para reutilizar o mesmo uid
  • -t 1: 0700 basicamente significa que a primeira partição é do código de tipo '0700'.

/ dev / xvda foi o disco que reparticionamos.

Portanto, ele exclui e cria uma nova partição imediatamente.

PS. Algumas notas no código de tipo '0700'. Do homem SGDISK (8)

   -t, --typecode=partnum:{hexcode|GUID}
          Change a single partition's type  code.  You  enter  the  type  code  using  either  a  two-byte  hexadecimal  number,  as 

descrito anteriormente ou um valor GUID totalmente especificado, como EBD0A0A2-B9E5-4433-87C0-68B6B72699C7.

A melhor explicação encontrada para o que '0700' significa aqui - http://www.rodsbooks.com/gdisk/walkthrough.html

"Mas espere", você diz, "pensei que o disco tivesse uma partição FAT!" De fato faz. O Windows usa um único código GUID para todas as suas partições de dados, sejam elas FAT ou NTFS. No passado, o mesmo código era usado no Linux para suas partições de dados. (Mais sobre isso em breve ....) Assim, neste caso, vários códigos MBR diferentes são todos traduzidos em um único código GUT GPT. O GPT fdisk usa, de maneira arbitrária, o código 0x0700 (ou mais precisamente, EBD0A0A2-B9E5-4433-87C0-68B6B72699C7) para todos esses.

No meu caso, acredito que era uma partição ext4 do Linux, mas o código de tipo da partição não significa o tipo de sistema de arquivos, então '0700' parece mais um tipo de catchall para o sgdisk. Pelo menos nos casos que eu já vi.

PPS. Pode ser necessário executar o partprobekernel para conhecer as alterações no particionamento sem reiniciar o sistema.

Tagar
fonte
'p' mostra o UUID do disco. 'i' mostrará o UUID de uma partição.
Keith
2

Estou apenas resumindo algumas respostas e comentários aqui:

partedsimplesmente recusará alterar qualquer partição montada. gdiskfará o trabalho para você, mas não está no repositório RHEL ou CentOS padrão. Está no repositório EPEL , no entanto.

Lembre-se de que alterar as partições em um disco em uso pode impedir o kernel de registrar as alterações. Se isso acontecer, o uso partprobe, partxou reiniciar.

jornane
fonte
1

Você está perguntando sobre redimensionar um volume lógico? Aqui está como eu faria isso:

vgextend vgname /dev/sdb3
lvextend -L +3T /dev/mapper/location
resize2fs /mount/point

OU (xfs):

xfs_growfs /mount/point -D <bytes>
jredd
fonte
ele provavelmente não está usando ext2 / ext3 / ext4, caso contrário resize2fs deve funcionar em tempo real?
1
@Antony Lee: se você passar -rpara lvextend, então ele invoca resize2fspara você.
jmtd
0

fdisk normalmente ainda está disponível e pode fazer isso, se a partição for a última e o início da partição não estiver em movimento.

No entanto, esta é uma operação perigosa que deve ser realizada com muito cuidado. Faça um backup!

ec2-user@ip-10-0-20-15 ~]$ sudo fdisk /dev/nvme0n1

Welcome to fdisk (util-linux 2.30.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/nvme0n1: 24 GiB, 25769803776 bytes, 50331648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 70E4A118-98BD-4BF4-8DF9-6926A964902A

Device           Start      End  Sectors Size Type
/dev/nvme0n1p1    4096 16777182 16773087   8G Linux filesystem
/dev/nvme0n1p128  2048     4095     2048   1M BIOS boot

Partition table entries are not in disk order.

Command (m for help): d
Partition number (1,128, default 128): 1

Partition 1 has been deleted.

Command (m for help): n
Partition number (1-127, default 1): 1
First sector (34-50331614, default 4096):
Last sector, +sectors or +size{K,M,G,T,P} (4096-50331614, default 50331614):

Created a new partition 1 of type 'Linux filesystem' and of size 24 GiB.
Partition #1 contains a xfs signature.

Do you want to remove the signature? [Y]es/[N]o: n

Command (m for help): p

Disk /dev/nvme0n1: 24 GiB, 25769803776 bytes, 50331648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 70E4A118-98BD-4BF4-8DF9-6926A964902A

Device           Start      End  Sectors Size Type
/dev/nvme0n1p1    4096 50331614 50327519  24G Linux filesystem
/dev/nvme0n1p128  2048     4095     2048   1M BIOS boot

Partition table entries are not in disk order.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy

The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).

[ec2-user@ip-10-0-20-15 ~]$ sudo partprobe

[ec2-user@ip-10-0-20-15 ~]$ sudo fdisk -l
Disk /dev/nvme0n1: 24 GiB, 25769803776 bytes, 50331648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 70E4A118-98BD-4BF4-8DF9-6926A964902A

Device           Start      End  Sectors Size Type
/dev/nvme0n1p1    4096 50331614 50327519  24G Linux filesystem
/dev/nvme0n1p128  2048     4095     2048   1M BIOS boot

Partition table entries are not in disk order.

[ec2-user@ip-10-0-20-15 ~]$ sudo xfs_growfs /
meta-data=/dev/nvme0n1p1         isize=512    agcount=4, agsize=524159 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1 spinodes=0
data     =                       bsize=4096   blocks=2096635, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2096635 to 6290939
```
Daniel Farrell
fonte