Neste artigo apresento o UltraDefrag, um defragmentador de partições NTFS para GNU/Linux.
[ Hits: 1.241 ]
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]:
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]
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 aqui
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 aqui
Caso o link direto não funcione, você pode obter o arquivo de patch aqui
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:
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:
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.
[Voltar]