Como redimensionar uma partição raiz ext no tempo de execução?


236

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 está alocada após a partição raiz (que também é ext4), como posso adicionar esse espaço não alocado ao espaço alocado para a partição raiz sem precisar desligar o servidor?


3
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?
Cloud

Você não pode redimensionar uma partição para a esquerda, porque isso seria realmente uma mudança.
Zaz

5
Aumentar o tamanho das partições ext4 online é fácil. A parte difícil seria diminuir (seu título é sobre "redimensionar"). Para pessoas interessadas em qualquer manipulação em uma partição raiz (mover, reduzir, alterar sistema de arquivos, dispositivo) em tempo de execução, consulte a minha resposta: askubuntu.com/a/728141/21888
vaab

Respostas:


214

GUI (Ubuntu 14.04 e posterior) : GParted v0.17 e posterior fornecem uma boa interface gráfica para isso. (As versões mais antigas se recusam a redimensionar uma partição montada).

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

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

É assim que eu faço: use fdiskpara excluir primeiro a partição (a idéia é que os dados no disco sejam preservados) e, em seguida, recriá-la 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, é fundamental 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 com o menor erro de digitação.

Para garantir a segurança, 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 para saber o que fazer se sua partição de swap estiver no caminho.

Até agora, deve estar claro por que as pessoas recomendam o uso de um CD ao vivo. ;-)

Etapa 2. Como fdiskvocê lembra, é necessário recarregar a tabela de partição antes de continuar. A maneira mais segura é simplesmente reiniciar; mas você também pode usar partprobeou kpartx (mais informações) .

Etapa 3. Depois que a partição é redimensionada e a tabela de partição recarregada, é uma questão simples de executar resize2fsno sistema de arquivos, e você pode fazer isso mesmo quando montada como partição raiz.

Exemplo:

$ sudo resize2fs /dev/sda1

16
Isso funcionou perfeitamente para mim. No entanto, eu também assegurei que o sinalizador de inicialização mantido fosse o estado original.
Augustus Kling

4
@ jbo5112: Como fdiskdiz, partprobeou kpartxpode funcionar em vez de uma reinicialização; veja também esta pergunta . Mesmo se você reiniciar, a solução ainda será preferível ao uso de um CD ao vivo quando houver tempo de inatividade, em que uma reinicialização simples pode ser inferior a 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. :)
Søren Løvborg

1
@ Raymond: Se a pressão da memória permitir (consulte free -h), desative a troca ( swapoff /dev/sda2), altere a tabela de partições (incluindo excluir e recriar a partição de troca) e 1) reinicialize ou 2) recarregue a tabela de partição swaponnovamente. (Se a memória é muito apertado para desativar troca temporariamente, você ainda pode criar e ativar uma nova partição swap ( /dev/sda3), então swapoff sda2, mas então você vai ter que atualizar /etc/fstabcom o novo nome do dispositivo swap.)
Søren Løvborg

1
Se você estiver usando o vmware e estendeu o tamanho do disco, será necessário executar o disco sudo lshw -C para verificar novamente os sistemas de arquivos para que o vm reconheça a unidade maior. Siga as instruções acima.
26616 Guy

2
Que tal encolher?
Aaron Franke

114

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

sudo resize2fs /dev/sda1

EDIT: O 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

55
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 pergunta é sobre redimensionar a partição , não o sistema de arquivos . A distinção é sutil, mas muito importante.
Eliah Kagan

8
Você pode usar o fdisk para excluir a partição raiz e depois recriá-la no mesmo bloco inicial. O fdisk gravará a alteração, mas não entrará em vigor até após a reinicialização. após a reinicialização, você pode usar o programa resize2fs para enviar o disco para preencher a parte.
James Becwar

3
Acabei de redimensionar uma partição raiz ext4 online. Portanto, posso confirmar que é possível. Mas, em vez de passar / dev / sda * como parâmetro para redimensionar2fs, é necessário passar o nome do volume lógico.
CDR

10
Acho o primeiro parágrafo da página de manual resize2fs 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 '23/

5
Por favor, não mexa com fdiskquando growpartisso fará isso muito facilmente para você.
STRML 16/09

54

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 da sua tabela de partição ( sfdisk -d /dev/xvda > partition_bak.dmp) por precaução.


Que tal encolher?
Aaron Franke

Estava esperando para usar este método, mas tenho sfdisk: /dev/nvme0n1p5: does not contain a recognized partition table(usando dual boot com o Windows)
monkut

Encolher não é possível fazer on-line. Eu recomendo usá gparted-lo.
STRML 29/07

4
growpart faz parte dos cloud-utils. Caso você não tenha instalado, você pode instalar comapt-get install cloud-utils
klor

1
@monkut Tarde da festa, mas é provável que seu disco/dev/nvme0n1 . p5 é a partição 5 neste disco. Compare com as fatias de disco BSD tradicionais, elas usam um esquema de numeração semelhante.
Per Lundberg

12

Sim, você pode reduzir / mover / aumentar uma partição raiz on-line sem nenhuma reinicialização (nem livecd nem usbkey): consulte esta resposta . É muito bem escrito e fácil de seguir, embora bastante longo e um pouco arriscado. Portanto, se você quiser apenas aumentar sua partição ext4, poderá seguir as resize2fssoluções de trabalho convencionais .

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

TLDR; Esta solução implica em pivot_rootpara tmpfsque você possa umountviver com segurança sua partição raiz e mexer nela. Uma vez feito, você pivot_rootretornará à sua nova partição raiz.

Isso permite praticamente qualquer manipulação no sistema de arquivos raiz (mova-o, altere o sistema de arquivos, altere o dispositivo físico ...).

Nenhuma reinicialização é necessária no processo, e isso permite ignorar a limitação de resize2fs não ser possível reduzir as ext4 partições.

Eu pessoalmente usei isso, e ele funciona muito bem no sistema debian também, por isso deve funcionar no Ubuntu. Estou muito surpreso por não ver esta solução detalhada um pouco mais vinculada às muitas perguntas nos sites stackexchange que tratam do mesmo problema.

Nota: Obviamente, se você quiser aumentar sua partição, resize2fsbasta um simples , conforme indicado em vários locais e em outras respostas aqui.


4
Penso que para a maioria das pessoas, depois de interromper todos os programas e serviços que acessam a partição raiz, é possível que você tenha reiniciado a máquina. Para diminuir / mover, isso ainda pode ser mais rápido do que usar um CD ao vivo, mas para crescer (de longe a tarefa mais comum e o que o OP perguntou), existem maneiras de não envolver um desligamento temporário da maior parte do sistema .
Søren Løvborg 8/03/16

2
@ 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 o LiveCD (instâncias 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 procuram por partições reduzidas online. ** Nenhuma outra solução permite reduzir o ext4 online. ** Esta solução é arriscada, complexa, mas a mais poderosa de todas e preenche as deficiências das outras.
vaab

1
Por favor, não poste respostas, dependendo de links externos. Coloque a parte relevante em sua resposta ou poste o link como um comentário para a pergunta. Consulte Como responder para obter detalhes.
Melebius

10

Você também pode usar o GParted - desde que a partição que você está redimensionando não seja a que você inicializou - caso contrário, sugiro que a opção de CD ao vivo seja um pouco mais fácil para iniciantes.

O GParted basicamente executa todas as etapas - apenas com base em uma interface gráfica do usuário.


Inicializei meu sistema com o Ubuntu 12.04 Live CD e redimensionei a partição ext4 com o GParted. Funcionou bem para mim. De qualquer forma, antes desta 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

Obviamente, a pergunta é sobre a partição da qual eles foram inicializados e a inicialização de um CD ao vivo requer a reinicialização da máquina. -1
wjandrea 21/05

5

Acabei de redimensionar uma partição raiz ext4 em um sistema ativo enquanto a raiz estava 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

Eu gostaria de fazer uma extensão da resposta de @ Søren Løvborg: estendendo a partição com uma partição swap presente.

Primeiro o layout do disco após estendê-lo:

$sudo parted /dev/sda 'unit s print' free
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 14336000s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start      End        Size       Type      File system     Flags
        63s        2047s      1985s                Free Space
 1      2048s      10485759s  10483712s  primary   ext4            boot
        10485760s  10487805s  2046s                Free Space
 2      10487806s  12580863s  2093058s   extended
 5      10487808s  12580863s  2093056s   logical   linux-swap(v1)
        12580864s  14335999s  1755136s             Free Space

Portanto, o sda1 precisa ser estendido com o espaço livre no final do disco, mas a partição swap está entre eles. É assim que você pode fazer:

Primeiro, precisamos desativar a troca. Verifique quanto é usado e se você pode desligá-lo.

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           992M         52M        464M        3.2M        475M        784M
Swap:          1.0G          0B        1.0G

troca não é usada aqui para que possamos desativá-la

$sudo swapoff /dev/sda5

Agora vamos mudar a tabela de partição:

$sudo fdisk /dev/sda

(nota: se a primeira partição iniciar no setor 63, em vez de 2048, você precisará adicionar a opção -c=dos)

Welcome to fdisk (util-linux 2.27.1).
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/sda: 6.9 GiB, 7340032000 bytes, 14336000 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: dos
Disk identifier: 0x9e11c6df

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sda1  *        2048 10485759 10483712    5G 83 Linux
/dev/sda2       10487806 12580863  2093058 1022M  5 Extended
/dev/sda5       10487808 12580863  2093056 1022M 82 Linux swap / Solaris

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

Partition 2 has been deleted.

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-14335999, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-14335999, default 14335999): 12242941

Created a new partition 1 of type 'Linux' and of size 5.9 GiB.

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (12242942-14335999, default 12242944):
Last sector, +sectors or +size{K,M,G,T,P} (12242944-14335999, default 14335999):

Created a new partition 2 of type 'Linux' and of size 1022 MiB.

Command (m for help): a
Partition number (1,2, default 2): 1

The bootable flag on partition 1 is enabled now.

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).

Nota: o tamanho de sda1 é a quantidade total de setores menos o tamanho do setor da sua partição de swap: 14335999-2093058 = 12242941

Como o fdisk menciona: o kernel ainda está usando a tabela de partições antiga, portanto, precisamos recarregá-lo.

$partprobe

Agora precisamos executar o resize2fs no sda1 (não esqueça disso!)

$resize2fs /dev/sda1
resize2fs 1.42.12 (29-Aug-2014)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 10
The filesystem on /dev/sda1 is now 38833617 (4k) blocks long.

Agora, as coisas ainda não acabaram. Como você provavelmente notou, o sda2 está particionado como tipo Linux (Ext4). Por alguma razão, no fdisk não há como escolher o tipo. Então nós temos que alternar usandocfdisk

$ sudo cfdisk

Escolha sda2 e altere o tipo para 82 Linux swap / Solarise certifique-se de escrevê-lo (digite yes para confirmar)

Agora podemos reativar a troca

$mkswap /dev/sda2
/dev/sda2
UUID=d58bf1cb-d27a-487d-b337-056767fd5ad6 none swap sw 0 0

E, finalmente, ative:

$swapon /dev/sda2

A única coisa que precisamos fazer é atualizar o fstab para montar a partição swap automaticamente após a inicialização

$sudo nano /etc/fstab

E mude o UUID da partição swap para a saída acima:

# swap was on /dev/sda5 during installation
UUID=d58bf1cb-d27a-487d-b337-056767fd5ad6 none            swap    sw              0       0

Agora está tudo bem e você pode reiniciar sem problemas.


como por alternando o tipo de partição swap, isso pode ser feito no fdisk comprar selecionando t, em seguida, 5 (partição 5), em seguida, 82 (tipo Linux swap / Solaris)
Oz Edri

a partição 2 não deve ser estendida? (e depois no fdisk devemos escolher e em vez de p) Além disso, os comandos mkswap e swapon não devem ser executados em / dev / sda5 em vez de sda2?
amigos estão dizendo sobre oz edri

1
Para o tipo de partição swap: Encontrei em outras instruções que você pode realmente selecionar o tipo no fdisk, mas por algum motivo não funcionou na minha versão. De qualquer forma, ele vai sempre trabalhar com cfdisk
wouter205

1
Para a partição swap: você pode usar uma partição estendida, mas precisará adicionar duas partições: uma estendida e uma lógica (consulte meu layout de partição inicial). No meu exemplo, termino com 2 partições principais: partição sda1 - ext4 - root e partição sda2 - swap. Portanto, os comandos mkswap& swaponprecisam ser executados no sda2. Cometi um erro no início do meu post: swapoffprecisa ser executado no sda5. Os comentários são sempre bem-vindos, foi difícil anotar.
wouter205

1
Quando a partição de swap é criptografada, é preciso primeiro parar o cryptdisks com cryptdisks_stop, atualizar o / etc / crypttab em vez do /etc/fstabe reiniciar o cryptdisks com cryptdisks_start.
Dmitri Chubarov

1

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 a rede desabilitada, e tirei um instantâneo de antemão, apenas por precaução, mas o instantâneo não era necessário, para que eu pudesse fazer isso via SSH e sem alterar os níveis de execução.

Determine 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

Opcionalmente, tire um instantâneo da VM para ter cuidado.

Redimensionar partição:

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

Redimensionar sistema de arquivos: resize2fs /dev/sda1

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


1

Siga esses passos.

  1. terminal aberto como superusuário su
  2. corre parted
  3. digite ppara ver as partições disponíveis
  4. identifique o número da sua partição raiz (ex: 'sda 3' significa número 3) e exclua uma partição adjacente usando rm PARTITION NUMBERpara criar espaço livre.
  5. Agora, aumente o tamanho da raiz digitando resizepart ROOT NUMBERe reinicie o sistema, se necessário
  6. sair parteddigitando exite no tipo de terminal partprobee pressione enter (isso pode ser feito mesmo após a reinicialização)
  7. finalmente, execute resize2fs /dev/sda PARTITION NUMBERe aproveite a partição raiz espaçosa.

0

Como afirmado anteriormente:

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

  • encolher uma partição raiz ativa precisa ser feita a partir de um dispositivo de inicialização externo (inicialização do sistema ao vivo cd / usb-stick), como se houvesse alguma falha, incompatibilidade. capaz de inicializar corretamente.

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.