Desfragmentando partições NTFS no Linux

Neste artigo apresento o UltraDefrag, um defragmentador de partições NTFS para GNU/Linux.

[ Hits: 3.690 ]

Por: Eduardo Mozart de Oliveira em 10/12/2017 | Blog: http://www.eduardomozartdeoliveira.wordpress.com/


Introdução



Durante a manutenção de um notebook de cliente, após realizar a manutenção preventiva (exclusão de arquivos temporários, atualização de programas), decidi realizar a desfragmentação de disco. Apesar do Windows acompanhar um desfragmentador de disco nativo, uso o Auslogic Disk Defrag que, apesar de não ser Open Source, é gratuito para uso doméstico e comercial. Durante a desfragmentação, o programa realizou uma análise no meu disco rígido externo (que uso para manutenção e backup) e constatou alta fragmentação de disco. Como precisava finalizar o chamado, realizei a desfragmentação apenas no disco do cliente, porém, decidi realizar a desfragmentação em meu próprio computador, que possui o Deepin 15.5 Beta (baseado no Debian "Sid" x86_64).

Mas, afinal, o que é fragmentação? A fragmentação ocorre quando um arquivo não é salvo de forma contínua no disco. "Como assim?" A imagem abaixo demonstra um disco rígido fragmentado [2]:

Figura 1: Fragmentação de arquivos (FAT)
Fonte: Make Tech Easier, 2015.

Note que, um mesmo arquivo, ocupa diversos setores do disco, não sendo salvos de forma contínua. Isto é extremamente comum no Windows, devido a forma como o sistema de arquivos aloca os arquivos. [2]

O sistema de arquivos EXT aloca arquivos de uma maneira mais inteligente. Ao invés de salvar cada arquivo próximos uns dos outros no disco, ele mantém uma quantidade de espaço livre entre eles. Quando um arquivo é editado e precisa crescer, há espaço para que ele cresça. [3]

Figura 2: Alocação de arquivos (Linux)
Fonte: Make Tech Easier, 2015.

Sejamos justos: O NTFS possui uma lógica similar (de manter uma certa quantidade de espaço livre após o arquivo) [2], porém, se ocorrer fragmentação no sistema de arquivos EXT, ele tentará mover os arquivos próximos para reduzir a fragmentação em uso normal, sem a necessidade de um utilitário de desfragmentação. [3]

A fragmentação pode ocorrer no Linux, principalmente em partições que possuem mais de 80% de espaço ocupado. [3] Se você possui problemas com fragmentação no Linux, provavelmente você precisa obter um disco maior.

Apesar de não acompanhar um desfragmentador nativo, é possível instalar o pacote ''e2fsprogs'' através do apt-get (Debian), que adiciona o utilitário ''e4defrag'' ao sistema. [3]

Infelizmente, para desfragmentar partições NTFS no Linux, não há soluções prontas.

Há um truque para alcançar a desfragmentação NTFS no Linux. Você precisará de um segundo HDD ou pelo menos 51% de espaço (se não estiver usando compressão - leia abaixo). [4]

O truque é usar ferramentas para "clonar" a partição. O fsarchive "clona" uma partição NTFS, mas ao restaurar, ele não restaura os arquivos onde eles estavam, salvando os arquivos sem fragmentação. [4]

Porém, há um aviso importante a aqueles que pensam que o NTFS pode ser desfragmentado no Linux simplesmente copiando arquivos [4]:

Alguns arquivos/diretórios possuem um atributo especial ativo, chamado Compressão. [4]
Toda vez que o Linux (cp, fsarchiver etc) escreve um arquivo/diretório em um sistema de arquivos NTFS, ele o escreve sem compressão NTFS, independente da compressão de arquivos/diretórios estar habilitada ou não. [4]

Então, você pode encontrar-se em uma situação que, ao restaurar com fsarchive (ou cp etc) você preencherá a partição e não terá espaço suficiente. [4]

Alguns tipos de dados podem alcançar uma taxa de compressão NTFS de 3, então você pode possuir uma partição de X GB e a soma destes arquivos ser cerca de 3*X em tamanho. [4]

Porém, pesquisando na Internet, pude encontrar um //port// do UltraDefrag (um desfragmentador Open Source para Windows) para Linux, que usa a biblioteca NTFS-3G (disponível para diversos sistemas operacionais, como Linux, FreeBSD, Mac OS X, Solaris etc) para desfragmentar e otimizar partições NTFS. [5] Atualmente, há uma versão de testes (Beta) apenas para console. [6]

Use o UltraDefrag por sua própria conta e risco. Tenha em mente que o UltraDefrag para Linux é beta (em testes).

Eu testei em meu disco rígido USB externo, e ele parece fazer um bom trabalho em sistemas de arquivos NTFS. Não tive corrupção de dados até agora.

Mas: recomendo FORTEMENTE que você não use-o em uma partição Windows e em sua partição de boot. Ele poderá quebrar a inicialização do Windows. Não por corromper os arquivos, mas por que o NTFS requer que alguns arquivos estejam em determinados setores - especialmente se a partição é usada para iniciar o Windows. Desfragmentadores para Linux podem não se importar com arquivos de sistema, por que para o Linux são apenas arquivos comuns. [5]

O "UltraDefrag for Linux" pode ser baixado de: http://jp-andre.pagesperso-orange.fr/advanced-ntfs-3g.html

Ele é nomeado "ultradefrag-5.0.0AB.7.zip".

Eu encontrei alguns problemas ao tentar compilar o UltraDefrag do código-fonte. O arquivo README.linux (localizado no diretório ultradefrag-5.0.0AB.7/src) possui algumas instruções para compilação, testes e a sintaxe de linha de comandos do UltraDefrag. Há algumas informações importantes que precisam ser lidas ANTES de iniciar a compilação:

"Não há atualmente nenhum script "configure" para adaptar o arquivo Makefile para seu ambiente. Você precisará adaptá-lo, apesar do arquivo "Makefile" provido servir para a maioria dos casos, após adaptar as localizações dos arquivos de cabeçalho e objetos compartilhados da libntfs-3g."

De acordo com a documentação, pode ser necessário adaptar o arquivo Makefile para que ele possa encontrar as bibliotecas necessárias do NTFS-3G no sistema e possa realizar a compilação do UltraDefrag. As variáveis que o README refere-se são as variáveis LIB1 e LIB2 (linha 26 e 27 do arquivo ultradefrag-5.0.0AB.7/src/Makefile).

Após editar as variáveis, criei um diff das alterações, criando um arquivo de patch que altera os arquivos ultradefrag-5.0.0AB.7/src/Makefile e ultradefrag-5.0.0AB.7/src/wincalls/ntfs-3g.c para que eles possam ser compilados no Debian "Sid".

Você pode encontrar o arquivo de patch no SourceForge: https://sourceforge.net/p/ultradefrag/discussion/709673/thread/380cf1e6/07fe/attachment/udefrag.patch

Caso o link direto não funcione, você pode obter o arquivo de patch em: https://sourceforge.net/p/ultradefrag/discussion/709673/thread/380cf1e6/?limit=25

Aqui está o procedimento completo:

sudo apt-get update
$ sudo apt-get upgrade install ntfs-3g-dev libncurses5-dev libncursesw5-dev gcc-multilib
$ wget http://jp-andre.pagesperso-orange.fr/ultradefrag-5.0.0AB.7.zip
$ unzip ultradefrag-5.0.0AB.7.zip
$ wget https://sourceforge.net/p/ultradefrag/discussion/709673/thread/380cf1e6/07fe/attachment/udefrag.patch
$ patch -p 0 -i udefrag.patch
$ cd ultradefrag-5.0.0AB.7/src
$ make
$ sudo cp udefrag /usr/local/bin


Nas duas primeiras linhas, atualizamos a lista de pacotes de repositórios e baixamos as dependências de compilação do UltraDefrag. Em um segundo momento, baixamos o código-fonte do UltraDefrag e o extraímos. Depois, baixamos o arquivo de patch, adaptando o código para compilação no Deepin (Debian "Sid") e o aplicamos. Em seguida, compilamos o código-fonte e copiamos o arquivo binário "udefrag" para /usr/local/bin, para que possamos executá-lo sem informar o caminho completo do binário (digitando apenas "udefrag" no Terminal).

Talvez o arquivo de patch não seja o ideal para seu ambiente ou falhe durante a aplicação. Não tem problema, podemos realizar as adaptações na mão, para que o UltraDefrag possa ser compilado em qualquer sistema que possui as bibliotecas necessárias (e não apenas no Debian "Sid").

Primeiro, você precisa se certificar que seu sistema possui todas as dependências necessárias. No Debian "Sid", elas são instaláveis através do apt-get, porém, o nome das dependências necessárias podem mudar de acordo com sua distribuição.

Para editar o arquivo ultradefrag-5.0.0AB.7/src/Makefile, você pode usar qualquer editor de sua preferência (como o Nano ou vi no Terminal ou o Gedit na interface gráfica). No Nano, pressionando "CTRL + W" é possível localizar texto em arquivos. O Gedit possui funcionalidade similar ao pressionar "CTRL + F".

nano Makefile

A primeira coisa que você precisará alterar no arquivo ultradefrag-5.0.0AB.7/src/Makefile é o caminho das bibliotecas. Aparentemente, o Makefile do "UltraDefrag for Linux" foi adaptado para ser compilado no Red Hat por possuir, na linha 18 (LIB2), o caminho "/usr/lib/gcc/x86_64-redhat-linux/4.6.0". Você precisará adaptar este caminho para a localização do gcc de acordo com seu sistema. Para descobrirmos o diretório do gcc, use os seguintes comandos:

cd /usr/lib/gcc
$ ls

aotcompile.py classfile.py i686-linux-gnu x86_64-linux-gnu

Note que a saída do comando informou dois diretórios: "i686-linux-gnu" e "x86_64-linux-gnu". Caso tenha dúvida da arquitetura do seu sistema, use o comando:

uname -m
x86_64

Agora, juntando as peças do quebra-cabeça, temos o caminho: "/usr/lib/gcc/x86_64-linux-gnu". Porém, esta informação, por si só, não é suficiente. Precisamos descobrir a versão do GCC disponível no sistema, que no arquivo Makefile original é "4.6.0".

A comunidade Arch adaptou o Makefile para obter automaticamente a versão do GCC do sistema. [8] Abaixo da linha 20 (GCC), adicione a variável GCC_VERSION:

GCC_VERSION=$(shell expr `$(GCC) -dumpversion`)

Você pode executar o comando no Terminal para certificar-se que o comando retornará a saída correta:

echo shell expr `gcc -dumpversion`
shell expr 6.4.0

Caso o comando falhe, você pode realizar o mesmo procedimento utilizado anteriormente para descobrir o nome do diretório "/usr/lib/gcc/x86_64-linux-gnu" para descobrir a versão do GCC:

cd /usr/lib/gcc/x86_64-linux-gnu/
$ ls

4.8  4.8.5  4.9  4.9.4  5  5.4.1  6  6.4.0  7  7.1.0

Após alterar o caminho das bibliotecas, recebia a seguinte mensagem de erro:

cd wincalls; make wincalls.a
make[1]: Entering directory /home/myuser/Desktop/ultradefrag-5.0.0AB.7/src/wincalls' gcc -DLXGC=1 -O2 -I/usr/include/ntfs-3g -I/usr/include -I../include -I../dll/zenwinx -c ntfs-3g.c ntfs-3g.c: In function 'ntfs_open': ntfs-3g.c:147:27: error: 'MS_RDONLY' undeclared (first use in this function) vol = ntfs_mount(device,MS_RDONLY); ^ ntfs-3g.c:147:27: note: each undeclared identifier is reported only once for each function it appears in make[1]: *** [ntfs-3g.o] Error 1 make[1]: Leaving directory/home/myuser/Desktop/ultradefrag-5.0.0AB.7/src/wincalls'
make: *** [wincalls.a] Error 2

Este erro ocorre devido a variável "MS_RDONLY" não estar declarada. [8] O patch corrige este erro automaticamente. Mas podemos editar o arquivo ultradefrag-5.0.0AB.7/src/wincalls/ntfs-3g.c manualmente e adicionar, na linha 34 (acima de stdio.h), a linha:

#include <linux/fs.h>

Agora, ao tentar compilar o UltraDefrag, recebia as seguintes mensagens de erro:

ld: cannot find /usr/lib64/crt1.o: Arquivo ou diretório não encontrado
ld: cannot find /usr/lib64/crti.o: Arquivo ou diretório não encontrado
ld: cannot find /usr/lib/gcc/x86_64-linux-gnu/4.9.4/crtbegin.o: Arquivo ou diretório não encontrado
ld: cannot find /lib64/libntfs-3g.so.*.0.0: Arquivo ou diretório não encontrado
ld: cannot find -lgcc
Makefile:65: recipe for target 'udefrag' failed

Antes de partir desesperadamente tentando encontrar a origem da mensagem de erro on-line, podemos procurar os arquivos do sistema para nos certificarmos que os arquivos, de fato, estão ausentes em nosso sistema. Para isso, use o comando:

find /usr/ |grep crti.o
/usr/libx32/crti.o
/usr/lib/x86_64-linux-gnu/crti.o
/usr/lib32/crti.o


Para fins de performance, realizei a busca apenas em /usr/, mas é possível realizar a busca em todo sistema, substituindo "/usr/" por "/". Note que a saída do comando retornou 3 arquivos que possuem este nome em /usr. Comparando os caminhos retornados com a saída do comando "make", notamos que o compilador está buscando a dependência no local errado. Ao invés de procurá-la em "/usr/lib/x86_64-linux-gnu/", ele está procurando-a em "/usr/lib64/crti.o".
Ao encontrar a referência ao arquivo "crti.o", atualizei o caminho da dependência de $(LIB1) para o caminho completo do arquivo (/usr/lib/x86_64-linux-gnu/). Realizei procedimento similar com as outras dependências que não foram encontradas.

Em relação ao erro de arquivo não encontrado "/lib64/libntfs-3g.so.*.0.0", usei o comando "find" procurando por "libntfs-3g.so":

find /usr |grep libntfs-3g.so
/usr/lib/x86_64-linux-gnu/libntfs-3g.so

O Makefile usa a variável NTFSLIB (linha 28) para referenciar a biblioteca "libntfs-3g.so". Editei o conteúdo da variável para corresponder a biblioteca existente no sistema (/usr/lib/x86_64-linux-gnu/libntfs-3g.so) conforme a imagem abaixo:
Para complementar: há alguns anos, escrevi um artigo no Viva o Linux com instruções de compilação no CentOS (apesar do artigo referir-se ao pkg-config, é possível aplicar a mesma lógica para encontrar as dependências), que possuem instruções parecidas com as disponibilizadas no artigo que você está lendo agora, porém, com maiores detalhes e instruções voltadas ao CentOS: Como resolver problemas com o pkg-config [Artigo]

Agora, o UltraDefrag deve compilar normalmente, e você poderá usar o comando "cp" para copiar o binário "udefrag" para /usr/local/bin.

Você pode exibir a sintaxe do udefrag executando o comando sem argumentos no Terminal:
Basicamente, para iniciar a desfragmentação, a partição NTFS precisa estar desmontada. No Deepin, você pode desmontar a unidade através do explorador de arquivos ou no ícone disponível na barra de tarefas. Você também pode desmontar a unidade através do Terminal:

sudo fdisk -l
$ umount /dev/sdd1


O primeiro comando lista os discos disponíveis, e o segundo comando desmonta a partição.

Agora, para executar o UltraDefrag, execute o comando:

sudo ultradefrag /dev/sdd1

Você pode usar o comando "sudo fdisk -l" para descobrir o nome da partição (no caso, "sdd1").
A desfragmentação começará. Em um HDD de 1 TB, a primeira desfragmentação levou 3 horas.

Conclusão

Apesar da extensão do artigo, a edição manual dos arquivos é necessária apenas se você encontrar erros durante a compilação e o patch não seja o suficiente.

O UltraDefrag possui outros recursos interessantes, atuando não apenas como desfragmentador, mas também como otimizador.

No início do disco rígido, as trilhas externas possuem maior taxa de transferências que trilhas internas. Alocar arquivos acessados frequentemente em trilhas externas aumenta a performance. [1] Além do UltraDefrag, o Auslogic Disk Defrag e MyDefrag para Windows também possuem esta funcionalidade. Porém, esta otimização pode ser demorada e não é realizada automaticamente, sendo necessário executá-la explicitamente no UltraDefrag:

sudo udefrag -o /dev/sdd1

Outro comando que o "UltraDefrag for Linux" possui e que é, no mínimo, interessante, é a exibição de um mapa do estado dos setores, exibindo setores em uso, fragmentados etc. similar ao disponibilizado pela interface gráfica do UltraDefrag para Windows:

sudo udefrag /dev/sdd1 -m

Referências

1. The Ultimate Defragger - LaRud's Place. Larud.net. 2012. Disponível em: <http://www.larud.net/subtext/archive/2007/02/07/28.aspx> Acesso em: 22 de novembro de 2017.

2. How to Defragment Linux Systems. Make Tech Easier. 2015. Disponível em: <https://www.maketecheasier.com/defragment-linux/> Acesso em: 22 de novembro de 2017.

3. Why Linux Doesn't Need Defragmenting. How-To Geek. 2016. Disponível em: <https://www.howtogeek.com/115229/htg-explains-why-linux-doesnt-need-defragmenting/> Acesso em: 22 de novembro de 2017.

4. Defragging NTFS Partitions from Linux. Ask Ubuntu. Disponível em: <https://askubuntu.com/questions/59007/defragging-ntfs-partitions-from-linux> Acesso em: 22 de novembro de 2017.

5. Defragment a NTFS partition from LINUX. Arch Linux Forums. Disponível em: <https://bbs.archlinux.org/viewtopic.php?id=125529> Acesso em: 22 de novembro de 2017.

6. Advanced NTFS-3G Features. Jean-Pierre André. 2017. Disponível em: <http://jp-andre.pagesperso-orange.fr/advanced-ntfs-3g.html> Acesso em: 22 de novembro de 2017.

7. Error compiling ultradefrag on Linux (Ubuntu). UltraDefrag (SourceForge). Disponível em: <https://sourceforge.net/p/ultradefrag/discussion/709673/thread/380cf1e6/?limit=25> Acesso em: 22 de novembro de 2017.

8. udefrag.patch. aur.git. Disponível em: <https://aur.archlinux.org/cgit/aur.git/tree/udefrag.patch?h=udefrag> Acesso em: 22 de novembro de 2017.

   

Páginas do artigo
   1. Introdução
Outros artigos deste autor

Como resolver problemas com o pkg-config

Instalação e Configuração do Zabbix 3 e Agentes (Linux/Windows)

Adicionando um atalho na área de trabalho a um compartilhamento de rede no Ubuntu

Solução para Ubuntu sem som

Leitura recomendada

Guia Openbox

Rancher - Painel para Docker

Como utilizar o Kurumin dentro de uma única partição Windows

Gnome-shell no Ubuntu em um clique

Introdução ao Void Linux

  
Comentários
[1] Comentário enviado por clodoaldops em 10/12/2017 - 06:48h

Muito bom saber de uma ferramenta Linux para desfragmentar NTFS
Mas como para recuperar um carro GM devo usar peças GM e não da Fiat
Por ora considero mais sensato usar Windows para mexer com NTFS
Belo artigo
Parabéns

[2] Comentário enviado por Ryuk em 18/12/2017 - 19:42h

Interessante!
Mas, ainda parece meio arriscado fazer isso pelo Linux. Já usei certa vez um script "ntfs-desfragmentador" que baixei não lembro de onde, e acabou corrompendo alguns arquivos. Na dúvida, prefiro usar uma VM do rWindows para desfragmentar o meu HD externo.

[3] Comentário enviado por meianoite em 14/01/2018 - 13:45h

# cd /opt/ultradefrag/src

# make
cd console; make console.a
make[1]: Entering directory '/opt/ultradefrag/src/console'
make[1]: 'console.a' is up to date.
make[1]: Leaving directory '/opt/ultradefrag/src/console'
cd dll/udefrag; make udefrag.a
make[1]: Entering directory '/opt/ultradefrag/src/dll/udefrag'
make[1]: 'udefrag.a' is up to date.
make[1]: Leaving directory '/opt/ultradefrag/src/dll/udefrag'
cd dll/zenwinx; make zenwinx.a
make[1]: Entering directory '/opt/ultradefrag/src/dll/zenwinx'
make[1]: 'zenwinx.a' is up to date.
make[1]: Leaving directory '/opt/ultradefrag/src/dll/zenwinx'
cd wincalls; make wincalls.a
make[1]: Entering directory '/opt/ultradefrag/src/wincalls'
gcc -DLXGC=1 -O2 -I/usr/include/ntfs-3g -I/usr/include -I../include -I../dll/zenwinx -c ntfs-3g.c
In file included from /usr/include/ntfs-3g/inode.h:35:0,
from /usr/include/ntfs-3g/attrib.h:33,
from ntfs-3g.c:42:
/usr/include/ntfs-3g/ntfstime.h: In function ‘ntfs_current_time’:
/usr/include/ntfs-3g/ntfstime.h:125:15: warning: implicit declaration of function ‘time’ [-Wimplicit-function-declaration]
now.tv_sec = time((time_t*)NULL);
^
ntfs-3g.c: In function ‘ntfs_open’:
ntfs-3g.c:147:27: error: ‘MS_RDONLY’ undeclared (first use in this function)
vol = ntfs_mount(device,MS_RDONLY);
^
ntfs-3g.c:147:27: note: each undeclared identifier is reported only once for each function it appears in
Makefile:42: recipe for target 'ntfs-3g.o' failed
make[1]: *** [ntfs-3g.o] Error 1
make[1]: Leaving directory '/opt/ultradefrag/src/wincalls'
Makefile:56: recipe for target 'wincalls.a' failed
make: *** [wincalls.a] Error 2


# ls udefrag
ls: não é possível acessar 'udefrag': Arquivo ou diretório não encontrado




Compilando
=========

Para usar o UltraDefrag no Linux, primeiro você precisa ter o ntfs-3g instalado
e você precisa ter os cabeçalhos libntfs-3g de um desenvolvimento correspondente
versão.

Atualmente, não existe um script "configurado" para criar Makefile adaptado para
seu ambiente. Você pode ter que criar seus próprios "Makefiles", embora o
O Makefile padrão fornecido na maioria dos casos, após a adaptação do
locais dos arquivos de cabeçalho e objeto compartilhado do libntfs-3g. Verifique também
se o arquivo de cabeçalho "compilador.h" possui definições apropriadas para o seu
computador e compilador.

Atualmente apenas configurações para X86-32, X86-64, M68k, Sparc e PowerPC
foram testados no Linux e uma configuração para Windows no modo de 32 bits
também foi testado. Makefiles específicos para o teste acima mencionado
As configurações também podem ser uma base boa para derivar o seu próprio.

[4] Comentário enviado por removido em 30/01/2018 - 19:05h

Salve mano

Quem usa windows merece a morte

[5] Comentário enviado por jaysponsored em 31/01/2018 - 10:02h


[4] Comentário enviado por zezinhojiujitsu em 30/01/2018 - 19:05h

Salve mano

Quem usa windows merece a morte


Também não devemos partir para extremismos XD Desde o Windows XP SP2, o Windows vem se demonstrando um sistema estável para funções do dia a dia. Tanto Windows quanto Linux tem suas vantagens e desvantagens. Gosto do Windows por que nenhuma interface gráfica para Linux superou a facilidade de uso da interface gráfica do XP/7: ela é simples e direta ao ponto. O Windows 10 deixou a desejar neste quesito (pra mim) como Power User. A interface que mais me agradou foi o Deepin, mas ainda tem recursos pequenos que fazem falta no dia a dia enquanto usava a distribuição, como Ctrl + Z para restaurar arquivos que você recém deletou da lixeira, ;) Acabei voltando para Windows devido à necessidade de um programa específico indisponível para Linux, e a facilidade de uso do Windows é imensa. Mas sinto falta do apt-get, principalmente ao montar um ambiente de desenvolvimento no Windows XD


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor HostGator.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Viva o Android

Tópicos

Top 10 do mês

Scripts