Atualizando o NTFS-3g compilando o código fonte

Introdução

Devido a sua grande utilidade, o ntfs-3g é um driver extensivamente utilizado. A versão fornecida com o atual release estável do Debian leva o número de 1.516. A versão prevista para o Lenny, atual testing e futuro release, é a 1.1004, no entanto que a última versão veiculada pelos desenvolvedores, a saber, 1.1120, pode ser encontrada no Debian apenas no crônicamente unstable Sid.
Instalar o ntfs-3g via apt-get a partir do Debian Sid requer a atualização do pacote libc6, o que pela sua vez significa praticamente reinstalar o sistema inteiro do mesmo Debian Sid, o que pode não ser uma prática recomendável em termos de custo/benefício.

No presente guia descreve-se como instalar o ntfs-3g compilando diretamente a partir dos fontes, o que tem a vantagem de gerar binários compatibles com as livrarias já instaladas no sistema.

Para os testes decritos no presente guia foi usada a versão 4.1 do gcc, isto é Gnu C Compiler. É possível que alguma versão mais antiga também funcione, mas nenhuma verficacão foi feita nesse sentido.

Você pode checar qual é versão do gcc instalada no seu sistema usando:

$ gcc –version | head -1

A versão 4.1 do gcc faz parte do repositório do Etch, atual estável do Debian, e portanto pode ser instalada através do apt-get sem maiores
dificuldades:

# apt-get update
# apt-get install gcc-4.1 g++-4.1

Obtendo o FUSE

O funcionamento do nfts-3g é baseado no FUSE (Filesystem em USErspace). O FUSE é um projeto razoavelmente bem documentado, pelo que vamos a omitir os detalhes, focando apenas na parte prática.

O FUSE deve ser obtido em primeiro lugar, pois faz parte das dependências de compilação do ntfs-3g. Caso contrário, quando tentar compilar o ntfs-3g, ao rodar o configure você vai obter uma mensagem de erro como a seguinte:

configure: error: FUSE >= 2.6.0 was not found. Either it’s not fully
installed (e.g. fuse, fuse-utils, libfuse, libfuse2, libfuse-dev, etc
packages) or files from an old version are still present. See FUSE at
http://fuse.sf.net/

Observe-se que resulta necessária uma versão do fuse maior o igual que 2.6.0 e além disso você vai precisar do “time completo” do fuse, integrado básicamente pelos pacotes libfuse2, fuse-utils, libfuse-dev e fuse-source.

No atual estável do Debian, a versão existente é a 2.5.3, no entanto que o pacote fuse-source apenas pode ser encontrado no Ubuntu. Felizmente, todas essas questões podem ser resolvidas de uma vez só, compilando o fuse completo a partir dos fontes:

$ wget http://ufpr.dl.sourceforge.net/sourceforge/fuse/fuse-2.7.1.tar.gz
$ tar -xzvf fuse-2.7.1.tar.gz
$ cd fuse-2.7.1
$ ./configure –exec-prefix=/ –prefix=/usr/share –disable-rpath –includedir=/usr/include
$ make

Tendo instalado conjunto básico de ferramentas de compilação e bibliotecas, não resulta necessário mais nada. Além disso, a compilação é relativamente rápida, menos de um minuto em um Pentium 4 com 512 MB de RAM.

As opções no configure são opcionais e, exceto a primeira, servem para gerar um pacote binário com uma formatação mais parecida com o padrão do Debian (vide abaixo) que, pela sua vez, encuadra-se nos linhamentos do Filesystem Hierarquical Standard (FHS).

Se a primeira opção –exec-prefix=/ no configure for omitida, ao tentar compilar o ntfs-3g mais tarde você pode vir a obter uma mensagem de advertência como essa:

****************************************************************************
* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING *
* The FUSE user space binaries were NOT installed with root directory *
* executable prefix. This means that automounting NTFS volumes during boot *
* could fail. This can be fixed the below way by reinstalling FUSE using *
* the right ‘configure’ option during FUSE compilation: *
* ./configure –exec-prefix=/ *
* make && sudo make install *
* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING *
****************************************************************************
You can type now ‘make’ to build ntfs-3g.

Observe-se, contudo, que isso não impede a compilação do ntfs-3g. Mas, sempre resulta melhor prevenir agora do que consertar depois 🙂

Uma outra mensagem do configure que tal vez valha a pena considerar, principalmente se o seu kernel for muito antigo, poderia ser a
seguinte:

NOTE: Detected that FUSE is already present in the kernel, so
NOTE: building of kernel module is disabled. To force building
NOTE: of kernel module use the ‘–enable-kernel-module’ option.

Finalmente, uma vez compilado o fuse, você pode instalar os binários usando, com privilégios administrativos, o comando:

# make install

Alternativamente, se você tiver instalado no seu sistema um pacote denominado checkinstall, como é o caso do Kurumin 7, o comando acima pode ser inteiramente substituido por:

# checkinstall –dpkgflags=–force-overwrite -D

Isso vai gerar um pacote binário do Debian, por causa da opção -D, que será instalado, ipso facto, através de uma ferramenta de gerenciamento de pacotes do Debian denominada dpkg, desde que checkinstall estiver configurado ad hoc, como também é caso no Kurumin 7 por default, sobrescrevendo os arquivos duplicados, por causa da
opção do –dpkgflags. Se o checkinstall não estiver configurado para instalar diretamente ou se a versão instalada não suportar a opção –dpkgflags, o pacote será gerado de qualquer maneira, mas não instalado. O checkinstall sempre notifica esses fatos no terminal. Em tal caso, instale o pacote através do comando:

# dpkg –force-overwrite fuse_2.7.1-1_i386.deb

A vantagem de usar o checkinstall, consiste em que você pode, por exemplo, salvar o arquivo .deb gerado para instalar em outros micros diretamente através do dpkg, como acima descrito.

Existem vários detalhes a serem observados pelo fato de estar fazendo uma instalação “direta” e não através de um pacote binário do Debian, por exemplo. Alguns desses detalhes podem ser omitidos se você já tem instalada alguma versão anterior do fuse, mas sempre é bom conferir. Observe-se por exemplo o seguinte script postinst fornecido
com o pacote fuse-utils_2.7.1-1_i386.deb do Debian sid:

if [ -x “$(command -v MAKEDEV)” ]; then
echo “creating fuse device node…”
cd /dev; MAKEDEV fuse
fi

test -f /etc/default/fuse-utils && rm -f /etc/default/fuse-utils;

echo “creating fuse group…”
getent group fuse >/dev/null || addgroup –system fuse

if [ -x /sbin/udevcontrol ];
then /sbin/udevcontrol reload_rules || true;
else
chgrp fuse /dev/fuse
fi

if ! dpkg-statoverride –list /bin/fusermount >/dev/null; then
chown root:fuse /bin/fusermount
chmod 4754 /bin/fusermount
fi

chown root:fuse /etc/fuse.conf
chmod 0640 /etc/fuse.conf

Além disso, o fuse deve ser configurado como um serviço do sistema:

if [ -x “/etc/init.d/fuse” ]; then
update-rc.d fuse start 34 S . stop 41 0 6 . >/dev/null
if [ -x “`which invoke-rc.d 2>/dev/null`” ]; then
invoke-rc.d fuse start || exit $?
else
/etc/init.d/fuse start || exit $?
fi
fi

Observe-se que para ficar disponível o fuse deve ser iniciado como um serviço do sistema: /etc/init.d/fuse start

Finalmente, as bibliotecas do sistema são atualizadas:

# ldconfig

Tudo isso seria feito automaticamente ao instalar o pacote. No sistema testado o fuse 2.5.3 do etch estava instalado e não foi necessário fazer todo isso, mas pode ter sido apenas uma questão de sorte.

Para confirmar se o fuse foi iniciado corretamente, você pode conferir a saida do comando mount. No exemplo abaixo, repare na última linha:

/dev/hda2 on / type reiserfs (rw,noatime,notail)
usbfs on /proc/bus/usb type usbfs (rw)
/dev/hda4 on /home type reiserfs (rw,notail)
/dev/pts on /dev/pts type devpts (rw,mode=0622)
tmpfs on /dev type tmpfs (rw,size=10M,mode=0755)
/dev/sda1 on /mnt/sda1 type reiserfs (rw)
fusectl on /sys/fs/fuse/connections type fusectl (rw)

Compilando o NTFS-3g

Com o time completo do fuse já em campo, é a vez do ntfs-3g. Se fosse instalado a partir do repositório do Debian, além do pacote ntfs-3g propriamente dito, seria necessário instalar em primeiro lugar um pacote contendo bibliotecas básicas, com nome parecido com libntfs-3gXX, onde XX é um número que pode variar de acordo com a versão do ntfs-3g a ser instalada.

Porém, como antes com o fuse, no presente caso o ntfs-3g pode compilado completo a partir dos fontes:

$ wget http://www.ntfs-3g.org/ntfs-3g-1.1120.tgz
$ tar -xzvf ntfs-3g-1.1120.tgz
$ cd ntfs-3g-1.1120
$ ./configure –prefix=/usr/share –disable-rpath –includedir=/usr/include –mandir=/usr/share/man
$ make

A compilação também é rápida, aproximadamente um minuto com a mesma configuração de hardware citada anteriormente, e aplicam-se as mesmas observações com relação às opções do configure.

Resta apenas instalar os binários criados durante a compilação, o que pode ser feito da mesma maneria que no caso do FUSE, explicado acima.

Contudo, se você for usar o checkinstall existe uma resalva. Por algum motivo, ao construir o pacote binário do Debian, o checkinstall empacotou também dentro dele o arquivo /usr/bin/gcc. Por causa disso, ao tentar instalar o pacote obtem-se naturalmente a seguinte mensagem de erro do dpkg:

dpkg: erro processando ntfs-3g_1.1120-1_i386.deb (–install):
tentando sobrescrever `/usr/bin/gcc’, que também está no pacote gcc

A inclusão do gcc trata-se neste caso provavelmente de um engano, devido tal vez a algum problema no installwatch, que é o programa subsidiário usado pelo checkinstall para monitorar a criação de novos arquivos durante a compilação.

Qualquera seja o caso, resulta absolutamente desnecessário incluir o compilador C do GNU no pacote. Por uma questão de sorte, o /usr/bin/gcc não é um verdadeiro arquivo mas apenas um link simbólico (pelo menos no sistema testado) apontando para o verdadeiro executável, o gcc-4.1. Portanto, se você não se importa muito com detalhes, o pacote pode ser instalado de qualquer jeito, como antes:

# dpkg –force-overwrite -i ntfs-3g_1.1120-1_i386.deb

Caso contrário, se você planeja ficar instalando o pacote criado várias vezes, por exemplo, e quer evitar ficar incluindo sempre a opção –force-overwrite no dpkg, o link indesejado pode ser extraido “manualmente” antes de instalar o pacote:

# dpkg -x ntfs-3g_1.1120-1_i386.deb ntfs-3g
# dpkg -e ntfs-3g_1.1120-1_i386.deb ntfs-3g/DEBIAN
# rm ntfs-3g/usr/bin/gcc
# rmdir ntfs-3g/usr/bin
# dpkg -b ntfs-3g ntfs-3g_1.1120-1_i386.deb
# dpkg -i ntfs-3g_1.1120-1_i386.deb

Montando partições NTFS diretamente pelo terminal.

O NTFS-3g é um projeto muito bem documentado:

http://www.ntfs-3g.org

com FAQ’s que podem ser consultadas diretamente a partir da sua página na Internet:

http://www.ntfs-3g.org/support.html#questions

Por exemplo, estas são algumas questões retiradas do link acima que tal vez sejam de interesse geral:

Why does Wine crash?
Why are Firefox saved files empty?
Why does Firefox duplicate file extensions?

Além dessas questões (e suas respostas 😉 ficamos sabendo também que resulta possível, entre outras coisas, usar partições swap, ou inclusive até inicializar um sistema GNU/Linux, a partir de imagens instaladas diretamete em uma partição NTFS, desde que o kernel do Linux usado seja relativamente recente (>= 2.6.20). Não vamos entrar
em detalhes no presente guia.

Supondo que a partição NTFS alvo seja aquela identificada pelo sistema como o dispositivo de bloco /dev/hda1, o comando básico para monta-la na pasta /mnt/hda1 usando o driver ntfs-3g seria o seguinte:

# mount -t ntfs-3g /dev/hda1 /mnt/hda1

A primeira vez que tentei fazer isso obteve a seguinte mensagem de erro:

$LogFile indicates unclean shutdown (0, 1)
Failed to mount ‘/dev/hda1’: Operação não suportada
Mount is denied because NTFS is marked to be in use. Choose one action:

Choice 1: If you have Windows then disconnect the external devices by
clicking on the ‘Safely Remove Hardware’ icon in the Windows
taskbar then shutdown Windows cleanly.

Choice 2: If you don’t have Windows then you can use the ‘force’ option for
your own responsibility. For example type on the command line:

mount -t ntfs-3g /dev/hda1 /mnt/hda1 -o force

Or add the option to the relevant row in the /etc/fstab file:

/dev/hda1 /mnt/hda1 ntfs-3g defaults,force 0 0

Provavelmente a mensagem foi devida ao fato do sistema não ter sido desligado corretamente, em algum ponto distante no passado remoto:

$LogFile indicates unclean shutdown (0, 1)

mas nada posso afirmar com certeza, pois careço de quaisquer dados para maiores esclarecimentos.

Como a própria mensagem diz, a opção “force” consegue resolver o problema sem maiores dificuldades, obviamente “sobre minha própria responsabilidade”.

Desta vez, a partição pode ser montada, de fato. Nessas circunstâncias, vai aparecer um outro tipo de advertência reveladora:

$LogFile indicates unclean shutdown (0, 1)
WARNING: Forced mount, reset $LogFile.
WARNING: Deficient Linux kernel detected. Some driver features are
not available (swap file on NTFS, boot from NTFS by LILO), and
unmount is not safe unless it’s made sure the ntfs-3g process
naturally terminates after calling ‘umount’. If you wish this
message to disappear then you should upgrade to at least kernel
version 2.6.20, or request help from your distribution to fix
the kernel problem. The below web page has more information:
http://ntfs-3g.org/support.html#fuse26

Ou seja, mais um motivo para torcer por um futuro release do Kurumin (8?) com um kernel atualizado.

A partir dai, você pode montar e desmontar a partição NTFS como qualquer uma, através da linha de comando, mas sempre com privilégios administrativos. A opção force foi necessária apenas na primeira vez.

Como a prórpia mensagem de erro acima diz, você pode acrescentar uma linha relativa à partição NTFS no arquivo /etc/fstab:

/dev/hda1 /mnt/hda1 ntfs-3g defaults,force 0 0

Contudo, a documentação do ntfs-3g faz questão de esclarecer que uma tal linha deve constar sempre *no final* do arquivo /etc/fstab. Lembre-se também que, com já foi dito, a opção “force” foi necessária apenas na primeira vez e pode ser omitida.

Se você quer dispensar a montagem via linha de comando, não deixe de consultar a segunda parte deste guia, que trata de um aplicativo gráfico para automatizar a montagem de partições NTFS.

Download dos pacotes binários

Seguindo o processo acima descrito, foram gerados dois pacotes binários do Debian, que podem ser usados em carater *experimental* a partir dos seguintes links:

Fuse:
http://www.uspleste.usp.br/auil/kurumix/pool/main/f/fuse/fuse_2.7.1-1kurumix1_i386.deb

Ntfs-3g:
http://www.uspleste.usp.br/auil/kurumix/pool/main/n/ntfs-3g/ntfs-3g_1.1120-1kurumix1_i386.deb

Nenhum desses pacotes transgride a Debian Policy para pacotes binários, mas eles conseguem ganhar alguns Warning’s do lintian, caso você se importe com detalhes.

Além disso, lembre-se que os programas são distribuidos de acordo com a GNU General Public License (GPL) mas as bibliotecas caem sob a GNU Lesser Public License (LGLP).

Sobre o Autor

Redes Sociais:

Deixe seu comentário

X