Questão Como posso redimensionar uma partição raiz ext em tempo de execução?


Como posso aumentar o tamanho da partição raiz de um sistema em tempo de execução?

Eu tenho uma partição que não é alocada após a partição raiz (que também é ext4), como posso adicionar esse espaço não alocado para o espaço alocado para a partição raiz sem ter que desligar o servidor?


194
2018-01-30 17:23


origem


Eu odeio soar como um pau na lama, mas isso implica um pouco de risco? Por que isso precisa acontecer? O tempo de atividade é a principal restrição? - DevNull
Você não pode redimensionar uma partição para a esquerda, porque isso seria realmente uma jogada. - Zaz
Aumentar o tamanho das partições on-line do ext4 é fácil. A parte difícil seria encolher (seu título é sobre "redimensionar"). Para pessoas interessadas por qualquer manipulação em uma partição raiz (mover, encolher, alterar sistema de arquivos, dispositivo) em tempo de execução deve consultar minha resposta: askubuntu.com/a/728141/21888 - vaab


Respostas:


GUI (Ubuntu 14.04 e posterior): GParted v0.17 e posteriores fornecem uma boa interface gráfica para isso. (Versões mais antigas recusarão redimensionar uma partição montada).

Linha de comando (qualquer versão do Ubuntu): Existem três etapas para isso.

Passo 1. A partição deve primeiro ser redimensionada. Se você está usando o LVM, é fácil e você provavelmente sabe como proceder. Se você está usando partições clássicas, é um pouco mais complicado, e pode requerer uma reinicialização (embora você nunca precise inicializar outro sistema ou live CD).

É assim que eu faço: Use fdisk primeiro exclua a partição (a idéia é que os dados no disco serão preservados) e, em seguida, recrie-a cuidadosamente com um tamanho maior na mesma posição.

Exemplo:

$ sudo fdisk /dev/sda

Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     9437183     4717568   83  Linux

Command (m for help): d
Selected partition 1

Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4, default 1): 1
First sector (2048-10485759, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-10485759, default 10485759):
Using default value 10485759

Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048    10485759     5241856   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: 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)
Syncing disks.

Novamente, é crítico que a nova partição inicie no mesmo bloco que a antiga. O Id também deve corresponder (83 para sistemas Linux). Esteja preparado para perder todos os seus dados ao menor erro de digitação.

Para estar no lado seguro, você também pode restaurar o sinalizador de inicialização (que de acordo com a Wikipedia ainda é necessário em alguns computadores) pressionando a.

Veja a seção de comentários sobre o que fazer se sua partição swap estiver no caminho.

Até agora, deve ficar claro por que as pessoas recomendam usar um CD ao vivo. ;-)

Passo 2. Como fdisk De maneira útil, você deve recarregar a tabela de partições antes de continuar. A maneira mais segura é simplesmente reiniciar; mas você também pode usar partprobe ou kpartx  (Mais Informações).

Etapa 3. Uma vez que a partição é redimensionada e a tabela de partições recarregada, é uma questão simples de executar resize2fs no sistema de arquivos, e você pode fazer isso mesmo quando estiver montado como a partição raiz.

Exemplo:

$ sudo resize2fs /dev/sda1

170
2018-04-06 14:23



Isso funcionou perfeitamente para mim. No entanto eu fiz adicionalmente garantir que o sinalizador de inicialização mantido é o estado original. - Augustus Kling
@ jbo5112: Como fdisk diz: partprobe ou kpartx pode funcionar em vez de uma reinicialização; Veja também essa questão. Mesmo se você reinicializar, a solução ainda é preferível ao uso de um live CD quando se trata de tempo de inatividade, em que uma simples reinicialização pode ser menor que 10 s para uma máquina virtual. Também é mais rápido no tempo do operador, e é por isso que eu geralmente uso essa abordagem eu mesmo. :) - Søren Løvborg
@ Raymond: Se a pressão da memória permitir (consulte free -h), desative a troca (swapoff /dev/sda2), altere a tabela de partição (incluindo a exclusão e a recriação da partição de troca) e 1) reinicialize ou 2) recarregue a tabela de partições e swapon novamente. (Se a memória estiver muito apertada para desativar a troca temporariamente, você ainda pode criar e ativar uma Novo partição swap (/dev/sda3), em seguida, trocar sda2; mas depois você terá que atualizar /etc/fstab com o novo nome do dispositivo de troca.) - Søren Løvborg
Se você estiver usando o vmware e tiver estendido o tamanho do disco, será necessário executar o sudo lshw -C disk para verificar novamente os sistemas de arquivos para que o vm reconheça a unidade maior. Em seguida, siga as instruções acima. - Guy
E quanto a encolher? - Aaron Franke


É possível fazer um redimensionamento on-line de um sistema de arquivos ext4, mesmo que seja sua partição raiz. Use o resize2fs comando.

sudo resize2fs /dev/sda1

EDIT: encolhimento on-line não é permitido:

root@brunojcm-htpc:/home# resize2fs /dev/sda5 2654693
resize2fs 1.42 (29-Nov-2011)
Filesystem at /dev/sda5 is mounted on /; on-line resizing required
resize2fs: On-line shrinking not supported

109
2018-03-02 10:50



A partir de man resize2fs: The resize2fs program does not manipulate the size of partitions. If you wish to enlarge a filesystem, you must make sure you can expand the size of the underlying partition first. This can be done using fdisk(8) by deleting the partition and recreating it with a larger size or using lvextend(8),if you're using the logical volume manager lvm(8). Esta questão é sobre redimensionar o partição, não o sistema de arquivo. A distinção é sutil, mas muito importante. - Eliah Kagan
Você pode usar o fdisk para excluir a partição raiz e depois recriá-la no mesmo bloco inicial. O fdisk irá escrever a alteração, mas não terá efeito até depois de uma reinicialização. Após a reinicialização, você pode usar o programa resize2fs para enviar o disco para preencher a partição. - James Becwar
Acabei de redimensionar uma partição raiz do ext4 online. Portanto, posso confirmar que é possível. Mas em vez de passar / dev / sda * como parâmetro para resize2fs, você precisa passar o nome do volume lógico. - CDR
Eu acho o primeiro parágrafo do resize2fs manpage mais interessante para a pergunta inicial: The resize2fs program will resize ext2, ext3, or ext4 file systems. It can be used to enlarge or shrink an unmounted file system located on device. If the filesystem is mounted, it can be used to expand the size of the mounted filesystem, assuming the kernel supports on-line resizing. (As of this writing, the Linux 2.6 kernel supports on-line resize for filesystems mounted using ext3 and ext4.). - mo'
Por favor, não mexa com fdisk quando growpart vai fazer isso muito facilmente para você. - STRML


Uma solução mais fácil - use growpart <device> <partition>:

growpart /dev/xvda 1  # Grows the partition; note the space
resize2fs /dev/xvda1  # Grows the filesystem

Como sempre, faça backup de sua tabela de partições (sfdisk -d /dev/xvda > partition_bak.dmp) apenas no caso de.


22
2017-07-18 13:26



E quanto a encolher? - Aaron Franke
Esperava usar esse método, mas sfdisk: /dev/nvme0n1p5: does not contain a recognized partition table (usando dual boot com windows) - monkut
Encolhendo não é possível fazer on-line. Eu recomendo usar gparted para isso. - STRML
Isso foi perfeito para redimensionar a partição raiz e o sistema de arquivos da minha VM da AWS. Felicidades. - MetaFight
O growpart faz parte dos utilitários da nuvem. Caso você não tenha instalado, você pode instalar com apt-get install cloud-utils - klor


Você também pode fazer uso de GParted - desde que a partição que você está redimensionando não seja aquela da qual você inicializou - então eu sugiro CD ao vivo opção é um pouco mais fácil para iniciantes.

GParted basicamente faz todas as etapas - apenas com base em uma GUI liderada.


8
2017-09-30 11:34



Eu inicializei meu sistema com o Ubuntu Live 12.04 e redimensionei a partição ext4 com o GParted. Trabalhou bem para mim. De qualquer forma, antes dessa operação, fiz backup de todos os meus dados importantes. - StandDuPp
Eu acho que o gparted precisa de partição desmontada. mas eu posso estar errado. - Nick
A questão é obviamente sobre a partição da qual eles iniciaram e inicializar um live CD requer o reinício da máquina. -1 - wjandrea


Sim, você pode diminuir / mover / aumentar uma partição raiz online sem qualquer reinicialização (nem livecd, nem usbkey): consulte esta resposta. É muito bem escrito e fácil de seguir, embora bastante longo e um pouco arriscado. Então, se você quer apenas aumentar sua partição ext4, você pode se ater ao trabalho convencional resize2fssoluções.

A solução geral que eu criei funcionará em qualquer tipo de solução dedicada ou VPS, por exemplo.

TLDR; esta solução implica pivot_root para tmpfs então você pode umount seguramente sua partição raiz vive e mexer com isto. Uma vez feito, você vai pivot_root de volta à sua nova partição raiz.

Isso permite praticamente qualquer manipulação no sistema de arquivos raiz (movê-lo, alterar o sistema de arquivos, alterando seu dispositivo físico ...).

Nenhuma reinicialização é necessária no processo, e isso permite ignorar a limitação do resize2fs  não ser capaz de encolher  ext4 partições.

Eu pessoalmente usei isso, e funciona muito bem no sistema debian também, então deve funcionar no Ubuntu. Estou muito surpreso em não ver essa solução em profundidade um pouco mais ligada às muitas perguntas nos sites da stackexchange que lida com o mesmo problema.

Nota: Claro, se você quiser aumentar sua partição, um simples resize2fs será suficiente, conforme indicado em vários lugares e em outras respostas aqui.


8
2018-02-01 02:08



Eu acho que para a maioria das pessoas, uma vez que você tenha parado todos os programas e serviços que acessam a partição raiz, você deve ter reiniciado a máquina. Para encolher / mover, isso ainda pode ser mais rápido do que usar um live CD, mas para crescer (de longe a tarefa mais comum, e sobre o que o OP perguntou), existem maneiras que não envolvem um desligamento temporário da maior parte do sistema . - Søren Løvborg
@ SørenLøvborg: Você pode reiniciar os serviços principais que precisam de produção contínua enquanto executa o procedimento completo. Existem muitas configurações nas quais você não pode colocar LiveCD (instâncias de VPS, servidores dedicados ...) ou circunstâncias em que deseja evitar reinicializações por motivos específicos. O título da pergunta original menciona "redimensionamento", que atrai pessoas que buscam encolher partições on-line. ** Nenhuma outra solução permite encolher o ext4 online. ** Esta solução é arriscada, complexa, mas a mais poderosa de todas e preenche as deficiências das outras. - vaab


Acabei de redimensionar uma partição raiz ext4 em um sistema ativo enquanto a raiz era montada.

[root@habib i686]# resize2fs /dev/vg_habib/lv_root
resize2fs 1.42 (29-Nov-2011)
Filesystem at /dev/vg_habib/lv_root is mounted on /; on-line resizing required
old_desc_blocks = 4, new_desc_blocks = 10
Performing an on-line resize of /dev/vg_habib/lv_root to 38427648 (4k) blocks.
The filesystem on /dev/vg_habib/lv_root is now 38427648 blocks long.

[root@habib i686]# 

5
2017-12-04 22:40





Eu fiz isso com sucesso sem umount, pivot_rootou remoção temporária da partição principal, usando o parted 3.2 no kernel do Ubuntu 16.04, 4.4.0. Para ser cauteloso, fiz tudo, desde um console virtual com rede desativada, e tirei um instantâneo de antemão, apenas no caso, mas o instantâneo não era necessário, então eu poderia ter feito isso também via SSH e sem alterar os níveis de execução.

Determinar o tamanho da partição: parted /dev/sda1 print | egrep "Disk.*GB"

Opcionalmente mude para o modo multiusuário sem rede (deve ser feito a partir de um console, não SSH):

runlevel     # remember the original runlevel
init 2

Como opção, tire um instantâneo da VM para ser cauteloso.

Redimensionar partição:

parted
p
resizepart NUMBER SIZE
# answer "Yes" when asked about resizing a live partition.
q

Redimensionar o sistema de arquivos: resize2fs /dev/sda1

Se algo der errado, você poderá restaurar seu instantâneo aqui. Se tudo correu bem, retorne ao runlevel normal (obtido acima) - normalmente 5: init 5. Pode ser melhor fazer uma reinicialização completa neste ponto para garantir que tudo volte corretamente (eu tive um problema de data / ntp posteriormente).


1
2017-07-14 00:09





Como dito antes:

  • É possível expandir vivo a partir de um sistema de raiz (sem dificuldades, pois a seção de inicialização não deve ser movida)

  • encolher uma partição raiz ao vivo precisa ser feito a partir do dispositivo de boot externo (boot do sistema live cd / usb-stick), como se houvesse alguma falha, incompatibilidade .. o que quer que ... seu sistema trava, precisa ser reinicializado e eventualmente não será capaz de inicializar corretamente.

Qualquer tipo de "mas eu fiz e funciona" é pura sorte.


0
2018-01-10 21:58