Created: 2009-10-23 16:36 Updated: 2009-10-23 16:36

O software ntfsresize, que é parte do pacote ntfsprogs no Debian, é uma ferramenta muito útil para redimensionamento de partições NTFS.

Para exemplificar o seu uso, vou usar como exemplo um notebook que recebi com Windows XP instalado, usando uma única partição (parece que esta prática é padrão), no qual era preciso manter a instalação do Windows XP e instalar o Linux.

Uma das opções era reparticionar o disco rígido, reinstalar o Windows XP e, finalmente, instalar o Linux 9ou outro sistema operacional). Esta opção foi descartada inicialmente, porque reinstalar o Windows XP, mais as aplicações necessárias, atualizar todo o sistema e ajustar as preferências do usuário seria muito trabalhoso.

A segunda alternativa seria redimensionar a partição NTFS sem ter que reinstalar o Windows XP. Haveria uma economia de tempo considerável, mesmo sabendo que seria necessário efetuar uma cópia de segurança dos dados do usuário, para o caso de ocorrer algum problema irrecuperável. Porém, esta ópia de segurança também teria que ser executada na primeira opção.

Atenção: faça uma cópia dos dados do computador ANTES de tentar redimensionar a partição, pois, se algum erro ocorrer durante o processo, TODOS os dados do disco rígido serão perdidos.

Primeiro, inicializei o computador usando um Live CD com Ubuntu 8.04 que, por sinal, já possui o pacote nftsprogs instalado.

Todos os comandos apresentados a seguir foram executados como root.

O primeiro passo é verificar a tabela de partições do disco. No notebook usado como exemplo, o disco rígido possuía uma interface SATA:

root@ubuntu:/media/ntfsresize# fdisk -l /dev/sda
Disk /dev/sda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x4dc5fddf

   Device Boot  Start     End    Blocks Id  System
/dev/sda1           1      11     88326 de  Dell Utility
/dev/sda2   *      12   19457 156199995  7  HPFS/NTFS

Observe que o disco possui duas partições: a primeira contém as ferramentas de disgnóstico da Dell e a segunda contém o Windows XP.

Vejamos se é possível reduzir o tamanho da partição NTFS:

# ntfsresize --info /dev/sda2
ntfsresize v2.0.0 (libntfs 10:0:0)
Device name        : /dev/sda2
NTFS volume version: 3.1
Cluster size       : 4096 bytes
Current volume size: 159948792320 bytes (159949 MB)
Current device size: 159948794880 bytes (159949 MB)
Checking filesystem consistency ...
100.00 percent completed
Accounting clusters ...
Space in use       : 13068 MB (8.2%)
Collecting resizing constraints ...
You might resize at 13067141120 bytes or 13068 MB
(freeing 146881 MB).
Please make a test run using both the -n and -s
options before real resizing!

A penúltima linha indica que é possível reduzir o tamanho da partição para aproximadamente 13GB. Porém, o ntfsresize indica o tamanho mínimo, isto é, se reduzirmos a partição para este tamanho (13GB), não vamos poder instalar mais nada no Windows, e não é isso que queremos. Vamos reduzir o tamanho da partição, mas não para o seu tamanho mínimo possível.

Devemos realizar um teste de redimensionamento da partição de forma a verificar se o tamanho desejado da partição é possível. Em nosso exemplo, o tamanho desejado para a partição NTFS é de 20GB:

# ntfsresize --no-action --size 20000M /dev/sda2
ntfsresize v2.0.0 (libntfs 10:0:0)
Device name        : /dev/sda2
NTFS volume version: 3.1
Cluster size       : 4096 bytes
Current volume size: 159948792320 bytes (159949 MB)
Current device size: 159948794880 bytes (159949 MB)
New volume size    : 19999994368 bytes (20000 MB)
Checking filesystem consistency ...
100.00 percent completed
Accounting clusters ...
Space in use       : 13068 MB (8.2%)
Collecting resizing constraints ...
Needed relocations : 37 (1 MB)
Schedule chkdsk for NTFS consistency check at Windows boot time ...
Resetting $LogFile ... (this might take a while)
Relocating needed data ...
100.00 percent completed
Updating $BadClust file ...
Updating $Bitmap file ...
Updating Boot record ...
The read-only test run ended successfully.

Como nenhum erro foi detectado, podemos partir para o redimensionamento:

# ntfsresize --size 20000M /dev/sda2
ntfsresize v2.0.0 (libntfs 10:0:0)
Device name        : /dev/sda2
NTFS volume version: 3.1
Cluster size       : 4096 bytes
Current volume size: 159948792320 bytes (159949 MB)
Current device size: 159948794880 bytes (159949 MB)
New volume size    : 19999994368 bytes (20000 MB)
Checking filesystem consistency ...
100.00 percent completed
Accounting clusters ...
Space in use       : 13068 MB (8.2%)
Collecting resizing constraints ...
Needed relocations : 37 (1 MB)
WARNING: Every sanity check passed and only the dangerous
operations left.
Make sure that important data has been backed up! Power
outage or computer
crash may result major data loss!
Are you sure you want to proceed (y/[n])? y
Schedule chkdsk for NTFS consistency check at Windows
boot time ...
Resetting $LogFile ...
(this might take a while)
Relocating needed data ...
100.00 percent completed
Updating $BadClust file ...
Updating $Bitmap file ...
Updating Boot record ...
Syncing device ...
Successfully resized NTFS on device '/dev/sda2'.
You can go on to shrink the device for example with
Linux fdisk.
IMPORTANT: When recreating the partition, make sure that you
  1)  create it at the same disk sector (use sector as the unit!)
  2)  create it with the same partition type (usually 7, HPFS/NTFS)
  3)  do not make it smaller than the new NTFS filesystem size
  4)  set the bootable flag for the partition if it existed before
Otherwise you won't be able to access NTFS or can't boot
from the disk!
If you make a mistake and don't have a partition table
backup then you

Uma vez redimensionada a partição, verifique a sua integridade:

# ntfsresize --info --force /dev/sda2
ntfsresize v2.0.0 (libntfs 10:0:0)
Device name        : /dev/sda2
NTFS volume version: 3.1
Cluster size       : 4096 bytes
Current volume size: 19999994368 bytes (20000 MB)
Current device size: 159948794880 bytes (159949 MB)
Checking filesystem consistency ...
100.00 percent completed
Accounting clusters ...
Space in use       : 13063 MB (65.3%)
Collecting resizing constraints ...
You might resize at 13062873088 bytes or 13063 MB
(freeing 6937 MB).
Please make a test run using both the -n and -s
options before real resizing!

Observe que a verificação indica que o tamanho do volume NTFS foi redimensionado para 20GB, porém, o tamanho do dispositivo, isto é, o tamanho da partição ainda é de 159GB. Isto ocorre porque o ntfsresize se preocupa apenas com o tamanho do volume NTFS, isto é, ele só faz os ajustes na camada do sistema de arquivos, e não na tabela de partição do disco rígido. O que precisamos fazer agora é redimensionar fisicamente a partição.

O primeiro passo é fazer uma cópia de segurança da tabela de partições do disco rígido e do registro mestre de inicialização (MBR - Master Boot Record). É boa prática realizar estas cópias de segurança em uma unidade física, como por exemplo, um pendrive, disquete ou outro disco rígido. Vou assumir que o diretório /media/ntfsresize é um volume externo qualquer (no meu caso, um pendrive).

Primeiro, a cópia da tabela de particionamento do disco rígido:

# sfdisk -d /dev/sda >sda.partitiontable

Agora, a cópia do MBR:

# dd if=/dev/sda of=sda.mbr bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000424589 s, 1.2 MB/s

Só para confirmar que os arquivos foram criados:

# ls -l
total 56
-rwxr-xr-x 1 root root   512 2009-10-22 20:46 sda.mbr
-rwxr-xr-x 1 root root   259 2009-10-22 20:45 sda.partitiontable

Agora vamos redimensionar a partição, usando o fdisk, mas antes, alguns cuidados importantes:

Vamos lá. Primeiro, vamos dar uma olhada na tabela de partição:

# fdisk /dev/sda
The number of cylinders for this disk is set to 19457.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): p

Disk /dev/sda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x4dc5fddf
   Device Boot  Start     End      Blocks   Id  System
/dev/sda1           1      11       88326   de  Dell Utility
/dev/sda2   *      12   19457   156199995    7  HPFS/NTFS

Agora, vamos apagar a partição 2 (anote o número do bloco inicial (12, no nosso exemplo):

Command (m for help): d
Partition number (1-4): 2

Vamos ver se a partição foi apagada:

Command (m for help): p
Disk /dev/sda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x4dc5fddf

   Device Boot  Start     End      Blocks   Id  System
/dev/sda1           1      11       88326   de  Dell Utility

Agora, vamos criar uma nova partição, iniciando no mesmo bloco da partição original (12, no nosso exemplo), e com tamanho de 20140MB (lembre-se de adicionar 140MB ao tamanho especificado no ntfsresize):

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (12-19457, default 12): 12
Last cylinder or +size or +sizeM or +sizeK (12-19457,
default 19457): +20140M

Vejamos como ficou:

Command (m for help): p
Disk /dev/sda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x4dc5fddf

   Device Boot  Start     End      Blocks   Id  System
/dev/sda1           1      11       88326   de  Dell Utility
/dev/sda2          12    2461    19679625   83  Linux

Agora, vamos alterar o tipo da partição e ativar a flag de inicialização:

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 7
Changed system type of partition 2 to 7 (HPFS/NTFS)

Command (m for help): a
Partition number (1-4): 1

Vamos conferir se tudo está correto:

Command (m for help): p

Disk /dev/sda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x4dc5fddf

   Device Boot  Start     End      Blocks   Id  System
/dev/sda1   *       1      11       88326   de  Dell Utility
/dev/sda2          12    2461    19679625    7  HPFS/NTFS

Como está tudo correto, precisamos gravar as alterações no disco rígido, pois tudo o que fizemos até agora só aconteceu em memória RAM:

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

Calling ioctl() to re-read partition table.
Syncing disks.

Observe que o fdisk é finalizado logo após a gravação da tabela de particionamento do disco.

Vamos verificar novamente a partição NTFS:

# ntfsresize --info --force /dev/sda2
ntfsresize v2.0.0 (libntfs 10:0:0)
Device name        : /dev/sda2
NTFS volume version: 3.1
Cluster size       : 4096 bytes
Current volume size: 19999994368 bytes (20000 MB)
Current device size: 20151936000 bytes (20152 MB)
Checking filesystem consistency ...
100.00 percent completed
Accounting clusters ...
Space in use       : 13063 MB (65.3%)
Collecting resizing constraints ...
You might resize at 13062873088 bytes or 13063 MB
(freeing 6937 MB).
Please make a test run using both the -n and -s
options before real resizing!

Observe que agora, o volume NTFS é de 20000MB e o tamanho do dispositivo é de 20152MB.

O próximo passo é reiniciar o computador e deixar o Windows verificar o volume NTFS.

É isso.

Marião