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

199

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 ao espaço alocado para a partição raiz sem ter que desligar o servidor?

    
por BonboBingo 30.01.2011 / 18:23

10 respostas

175

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.

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

É assim que eu faço: Use fdisk para primeiro deletar a partição (a idéia é que os dados no disco serão preservados), então cuidadosamente recrie-a 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, é essencial que a nova partição comece 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. ; -)

Etapa 2. Como fdisk te lembra, 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ção recarregada, é uma simples questão 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
    
por Søren Løvborg 06.04.2012 / 16:23
109

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

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
    
por CodeAddict 02.03.2012 / 11:50
23

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.

    
por STRML 18.07.2017 / 15:26
8

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

O

GParted basicamente faz todos os passos - apenas com base em uma GUI liderada.

    
por leatherjacket 30.09.2012 / 13:34
8

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

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

TLDR; esta solução implica pivot_root to tmpfs , então você pode umount seguramente sua partição root viver e mexer com ela. Quando terminar, você voltará a pivot_root em 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 de resize2fs não poder reduzir ext4 partições.

Eu pessoalmente usei isso, e ele funciona muito bem no sistema debian também, então ele 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 que se você quiser aumentar sua partição, um simples resize2fs será suficiente, conforme indicado em vários lugares e em outras respostas aqui.

    
por vaab 01.02.2016 / 03:08
5

Acabamos de redimensionar uma partição raiz do 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]# 
    
por CDR 04.12.2012 / 23:40
1

Eu fiz isso com sucesso sem umount , pivot_root , ou 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 de tudo a partir de um console virtual com rede desativada e tirei um instantâneo por precaução, 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.

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 do SSH):

runlevel     # remember the original runlevel
init 2

Opcionalmente, tome 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 (tive um problema de data / ntp posteriormente).

    
por Roger Dueck 14.07.2017 / 02:09
0

Como afirmado anteriormente:

  • A expansão ao vivo de um sistema raiz é possível (sem dificuldades, já que a seção de inicialização não deve ser movida)

  • A redução de uma partição raiz ao vivo precisa ser feita a partir do dispositivo de inicialização externo (boot do sistema live cd / usb-stick), como se houvesse alguma falha, incompatibilidade .. o que for ... reiniciado e, eventualmente, não será capaz de inicializar corretamente.

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

    
por ascervera 10.01.2014 / 22:58
0

Siga estes passos.

  1. abra o terminal como superusuário su
  2. executar parted
  3. digite p para ver as partições disponíveis
  4. identifique seu número de partição raiz (ex: 'sda 3' significa número 3) e exclua uma partição adjacente usando rm PARTITION NUMBER para criar espaço livre.
  5. agora, aumente o tamanho da raiz digitando resizepart ROOT NUMBER e reinicialize o sistema, se necessário
  6. saia do parted digitando exit e no terminal digite partprobe e pressione enter (isso pode ser feito mesmo após a reinicialização)
  7. finalmente, execute resize2fs /dev/sda PARTITION NUMBER e aproveite a partição raiz espaçosa.
por Gurunadha Reddy 13.09.2017 / 22:22
0

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

Primeiro, o layout do disco depois de 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 isso:

Primeiro, precisamos desativar o swap. Verifique quanto é usado e se você pode desativá-lo.

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

swap não é usado aqui para que possamos desativá-lo

$sudo swapoff /dev/sda2

Agora vamos mudar a tabela de partições:

$sudo fdisk /dev/sda

(nota: se acontecer de você ter a primeira partição começando no setor 63 em vez de 2048, você precisa 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): 122                                                                  42941

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 swap: 14335999-2093058 = 12242941

Como fdisk menciona: o kernel ainda está usando a tabela de partição antiga, então precisamos recarregá-la.

$partprobe

Agora precisamos executar resize2fs em 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 é particionado como tipo Linux (Ext4). Por algum motivo, não há como o fdisk escolher o tipo. Então temos que alternar usando cfdisk

$ sudo cfdisk

Escolha sda2 e mude o tipo para 82 Linux swap / Solaris e certifique-se de escrevê-lo (digite sim 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, ligue-o:

$swapon /dev/sda2

A única coisa que precisamos fazer é atualizar o fstab para montar a partição swap automaticamente ao inicializar

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

    
por wouter205 07.09.2018 / 08:58