terça-feira, 9 de fevereiro de 2010

Redimensionando partições ext3 - Diminuindo uma partição

Para o redimensionamento de uma partição ext3, deve-se adotar 2 procedimentos básicos, depois de desfragmentá-la, se este for o caso:

1) redimensionar o sistema de arquivo: Para isto, utiliza-se o comando resize2fs.
2) redimensionar a partição fisicamente: Para isto, utiliza-se o comando fdisk.

Quando nós redimensionamos o sistema de arquivos é como dar um aviso ao kernel que os arquivos da partição podem ser encontrados entre o cilindro xxx do disco ao cilindro yyy, e a partição, quando as coisas estão funcionando, vai do cilindro xxx ao cilindro yyy. Entretanto, pode ser que não haja correspondência entre o que informa o sistema de arquivo ao kernel, e o tamanho físico da partição mesmo.

Assim, quando queremos diminuir o tamanho de uma partição, devemos, primeiro, diminuir o tamanho do sistema de arquivo com resize2fs, para depois diminuir seu tamanho físico com fdisk. Desde 2002 que esse software suporta o redimensionamento não só de partições ext2, mas também de ext3, portanto não é necessário tirar o journaling da partição.
No caso de querermos expandir o tamanho de uma partição, precisamos fazer o caminho inverso, desde que haja espaço livre começando quando termina originalmente o a partição que queremos expandir: aumentamos seu tamanho fisico para depois redimensionar o seu sistema de arquivo.

Bem, vamos aos passos:

No caso, eu queria diminuir o tamanho da minha partição /home de 50GB para 10GB.
Se você vai fazer isto com a partição raiz do seu sistema, ou a partição que contém outros executáveis importantes do sistema operacional, é necessário reiniciar o sistema e utilizar um disco/CD/DVD de recuperação, ou uma distribuição live-CD, pois é necessário executar os procedimentos com a partição com a qual queremos trabalhar desmontada.

Primeira parte: Checando informações sobre o disco e a partição, e redimensionando o Sistema de arquivos

- Checando informações:
fdisk -l /dev/sda --> Este comando dá informações sobre todas as partições do disco, tais como o cilindro inicial e final da partição, e número de blocos que ocupa. Lembrando que /dev/sda é apenas o exemplo utilizado, e o dispositivo que será utilizado dependo de como está configurado o seu HD, e de qual tecnologia ele utiliza (para HDs IDE, utilizamos /dev/hd(letra), e para primeiro hd, a letra a. Para HDs SCSI ou SATA, utilizamos /dev/sd(letra), e para o segundo hd, utilizamos a letra b. Utilizariamos também a letra a, no caso de ser o primeiro hd, que é o caso do exemplo.
A informação primordial, neste caso, é a posição inicial da partição. Isto, porque na parte 2, teremos de apagá-la, e para que não haja perda de dados, devemos nos certificar de que a "nova" partição deve começar no mesmo cilindro da "velha".
No meu caso, eu queria informações da partição /dev/sda2, que no meu caso, normalmente é montada em /home. LEMBRE-SE QUE TODOS OS PROCEDIMENTOS DEVEM SER FEITOS COM A PARTIÇÃO DESMONTADA.

- Talvez seja necessário checar a partição com:
e2fsck -f /dev/sda2 -->substitua /dev/sda2 pela partição que desejar/precisar checar.
-Redimensionando o sistema de arquivos, finalmente:
resize2fs /dev/sda2 10G
O comando resize2fs possui a seguinte sintaxe: resize2fs [partição] [tamamho] --> onde tamanho pode ser dado em S (setores de 512 bytes), K, M e G, em que as três últimas maiúsculas representam, respectivamente, kilobytes, megabytes e gigabytes.
Ele, depois, vai retornar o número de blocos que a nova partição deverá ocupar. Mas atenção, ele informa isso para o Kernel, mas não fez nenhuma modificação física, como, aliás, discutimos acima. É importante mencionar que o número de blocos informado pode estar ligeiramente errado, devido a um bug conhecido e mencionado no próprio manual do comando (man resize2fs). O que fazer em relação a isso, veremos na segunda parte.

Segunda Parte: Redimensionando a partição

Para redimensionar a partição, o procedimento é tão simples quanto perigoso: Devemos apagar a partição que queremos redimensionar e criá-la de novo! :-D
Se o procedimento for feito corretamente, não haverá nenhuma perda de dados. Entretando, devido ao risco, é extremamente aconselhável fazer um backup dos dados mais importantes da partição, senão de toda ela. Eu estava muito "com o cú na mão", então fiz 2 backups!
fdisk /dev/sda --> Para iniciar operações de particionamento do disco.
Resposta do comando:
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
-Devemos, agora apagar a partição dois:
Command (m for help): d
Partition number (1-5): 2
Como eu cometi o erro de ter criado esta partição como primária, outrora (Poderia ter criado apenas uma partição primária, que devem ser no máximo 4, e deixado a partição em questão como estendida), devo recriá-la como primária (na verdade, tive medo de fazer diferente, mas como eu também posso criar partições Linux principais como partição extendida, eu não me importei).
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
p
Partition number (1-4): 2
Agora, ele perguntará em que cilindro que começa a partição. mantenha a resposta padrão, que deve ser identica à obtida com fdisk -l /dev/sda . Se não for, digite o dado obtido anteriormente, caso contrário, haverá perda de dados.

Agora que informamos o fdisk onde que a nossa partição começa, não sabemos onde ela termina. Felizmente, podemos dizer o tamanho da nossa partição, em MB. Porém, dizer que ela terá 10240MB (10GB) acarretará em erros mais para frente, porque, como mencionado anteriormente, o resize2fs tem um bug no cálculo do número de blocos (que são de 4KB), e dar imediatamente o tamanho que nós queremos, fará com que o sistema de arquivos e o tamanho físico continuem diferentes, podendo haver perda de dados (O e2fsck não conseguirá avaliar a partição por causa disso, e você pode ter problemas até para reiniciar o sistema).
A solução para este problema é o seguinte: Pegar o número de blocos retornado pelo resize2fs, multiplicar por 4k (como a resposta do comando já é em blocos de 4k, basta multiplicar por 4, mesmo), e depois multiplicar por 1.05, para dar uma margem de uns 5% para aquele número, pois é prudente que o tamanho físico seja maior que o tamanho do sistema de arquivos, e não o contrário. É quando acontece o contrário que a partição começa a dar problemas.

-O número resultante do cálculo deve ser colocado como +[númeroK] quando o fdisk solicitar:
Last cylinder or +size or +sizeM or +sizeK (xxx-yyy, default yyy ): +númeroK --> onde xxx-yyy é o intervalo, em cilindros, do número do cilindro que termina a partição. yyy, é o limite final do disco. + é a opção para declarar o tamanho da partição, em vez do cilindro final, e deixar a tarefa de descobrí-lo para o fdisk, número, é o tamanho em KiloBytes da Partição, e K é a opção especificando que o tamanho será mesmo dado em Kilobytes.
-Agora, devemos gravar na tabela de partições.
Command (m for help): w
The partition table has been altered!
-Resposta do comando:
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.
Syncing disks.

É preciso, agora, reiniciar o sistema (ou não).

Com a partição redimencionada desmontada, vamos à terceira e última parte:

3) Checagem do sitesma, e re-redimensionamento:

Com o sistema reiniciado para que a nova tabela de partições seja reconhecida, digite:

e2fsck -f /dev/sda2 --> (com a partição desmontada e ,novamente, substitua a partição utilizada no exemplo pela que você quer redimensionar efetivamente)

E depois o comando:

resize2fs /dev/sda2

Agora, não tem mais o tamanho da partição, porque, com a nossa preucaução, o tamanho informado pelo sistema de arquivos é menor do que o tamanho físico da partição, e queremos apenas que o sistema de arquivos seja redimensionado para o tamanho máximo da partição física.

Referências:

http://usefulfor.com/nothing/2007/12/14/howto-resize-an-ext3-partition-without-losing-data/

http://www.howtoforge.com/linux_resizing_ext3_partitions

Manual do resize2fs (man resize2fs)

2 comentários:

  1. Parabéns pelo seu blog, fiz aqui este procedimento e funcionou perfeitamente, Obrigado.

    ResponderExcluir
    Respostas
    1. Obrigado.
      Fico feliz que esta informação tenha sido útil.
      Pena não conseguir atualizar o blog... :-(

      Excluir