Comportamento, ciência, tecnologia, direito, política, religião, cinema e televisão, alguma controvérsia, algum bom senso, e um pouquinho de besteira, para dar um gostinho...

7 de dez. de 2012

Linux (Gentoo) e dispositivos MTP (Android e outros)

Depois de tanto tempo sem escrever, o que vem lá?! Um post técnico! Isso mesmo.

Recentemente tive meu Samsung Galaxy S2 GT-I9100 roubado. Estou rastreando o ladrão pelo Cerberus e eventualmente a polícia vai achar ele, mas isso não vem ao caso. Estava na hora de investir em um novo dispositivo. Um preço acima de R$ 1.000,00 era proibitivo visto que daqui a um ano e alguns meses recebo um novo aparelho no resgate do plano empresarial. Depois de muita pesquisa optei por um Sony Xperia P (LT22i). Ótimo aparelho, de verdade, e um preço convidativo.

Enfim, quando ele chegou acabei novamente caindo no velho problema dos novos dispositivos Android no Linux. Como não tem opção (o aparelho não suporta UMS (USB Mass Storage) mais (o S2 ainda suportava, mas era forçado) e eu precisava acessar os arquivos, e via WiFi estava muito lento. Além disso meu tablet (GT-P3100) também não possui UMS. Enfim, precisava de uma solução.

O MTP (Media Transfer Protocol) é meio quebrado no Linux. Tive muitos problemas e nenhum programa conseguia acessar o dispositivo. Depois de muito pesquisar, acabei encontrando o JMTPFS. Um ótimo programa que compilou direitinho no meu Linux Gentoo.

Transferi o binário para a pasta /usr/bin, e testei. Funcionou direitinho, via linha de comando, ele encontrou meu aparelho e montou o sistema de arquivos.

Agora, é chato ir para linha de comando para acessar os arquivos, fora que, se você esquecer de desmontar o dispositivo quando remover, vai falhar a próxima montagem. Precisava de uma maneira mais decente de lidar com isso. Entra o UDEV.

Desde que aprendi a lidar com as regras do UDEV para montar dispositivos obscuros como placas de rede virtuais para usar no QEMU uns 5 anos atrás, sempre gostei dele. Regras são intuitivas e basta um pouco de paciência para se fazer algumas mágicas. No entanto, todos os tutoriais que encontrei eram velhos, faziam menção a ferramentas deprecadas como udevmonitor, udevtest, etc. Hoje em dia o udevadm faz tudo.

Algumas dicas:

udevadm monitor
Comando para monitorar os dispositivos adicionados e removidos do sistema, útil para achar o bendito node que você precisa, para então usar:

udevadm info -a -p

E lá vem todas as propriedades do dispositivo, loucura, tudo que você precisa saber sobre ele. Primeiramente usei o identificador do dispositivo, mas depois achei melhor usar um atributo mais genérico para que qualquer dispositivo MTP pudesse ser montado automaticamente.

As regras do UDEV são autoexplicativas... Em /etc/udev/rules.d/99-mtp.rules:

ACTION=="add", ENV{ID_MTP_DEVICE}=="1", RUN="/usr/local/sbin/mountmtp mtp%k"
ACTION=="remove", ENV{ID_MTP_DEVICE}=="1", RUN="/usr/local/sbin/umountmtp mtp%k"

Bem fácil, na ação adicionar, todo dispositivo com interface MTP vai automaticamente lançar o script mountmtp (não esqueça de chmod a+x no script, para torná-lo executável):


#!/bin/bash
sleep 10
mkdir -p /media/$1
jmtpfs -o allow_other /media/$1 |& logger -t jmtpfs

Inseri um sleep para que haja tempo do dispositivo lançar o conteúdo no protocolo, como meu sistema tem depuração acionada, isso demora alguns segundos. Poderia ser menos, mas para que arriscar...

Na remoção ele simplesmente desmonta o diretório:

 #!/bin/bash
umount -v /media/$1 |& logger -t jmtpfs
rmdir /media/$1

Testado com meu ST22i (Sony Xperia P) e com um Galaxy Nexus.

Nenhum comentário: