27 fevereiro, 2007

Gravando arquivos em um flashdrive

nota: eu prefiro usar o termo "flashdrive" no lugar de "pendrive".

No Windows, notadamente no XP, quando você copia um arquivo para um flashdrive, ele é gravado imediatamente. Em quase 100% dos casos se você puxar o flashdrive logo após o indicador de progresso sumir (embora isso não seja recomendável é o que eu geralmente faço), o arquivo vai estar seguramente lá. Em anos, só uma vez isso não deu certo e os útimos megabytes de uma gravação de 5GB não tinham sido gravados ainda.

No OpenSuse, quando você copia o arquivo para o flashdrive ele apenas "parece" estar lá. O arquivo só é gravado mesmo no momento em que você fizer o procedimento de remoção do flashdrive!

Não existe nenhuma indicação visual de que o arquivo apenas está "programado" para ser gravado. O ícone do arquivo que não existe é igualzinho ao dos arquivos que estão mesmo lá.

Eu experimentei puxar o flashdrive 5 minutos depois de ter mandado copiar o arquivo e após a entrada da proteção de tela. O arquivo não estava lá.

No KDE, o procedimento de remoção é ir em "My Computer", dê um right-click sobre o flashdrive e peça "safely remove"

No GNOME, basta um right-click sobre o ícone do flashdrive que é colocado automaticamente no desktop e pedir "unmount".

4 comentários:

  1. Isso é por que o Linux, como outros sistemas projetado servidores ou workstation, tem algo chamado "disk block cache". O sistema usa parte da memória RAM livre como cache dos dados acessados mais recentemente no disco. No Linux esse buffer é transparente para o usuário, seu tamanho é reajustado dinâmicamente para liberar espaço para qualquer aplicativo que precise de mais RAM, etc.

    Por outro lado, isso pode ser inconveniente pra mídia removível. Já que o sistema não garante, a menos que você peça explicitamente* à ele, que os dados sejam gravados imediatamente na mídia, os dados podem ficar bastante tempo o DBC antes de ser gravado de fato. Por isso existe o conceito de "montar" e "desmontar" partições.

    No Windows existe algo similar, mas não é muito usado em partições FAT, então os dados são escritos quase instantaneamente. Não sei exatamente como o Linux e outros sistemas lidam com cada tipo de partição, geralmente as partições com journaling tem um limite de tempo pros dados do cache serem sincronizados com o disco, pra evitar perda de dados. Mas FAT não tem journaling e eu realmente nunca parei pra ver como é implementado no Linux.

    * No Linux tem uma opção de "escrita síncrona" nas APIs de I/O, mas creio que nenhum aplicativo gráfico expõe essa opção para o usuário. Creio que algumas aplicações CLI tenham switches pra habilitar isso e fazer os dados serem copiados imediatamente.

    ResponderExcluir
  2. Guilherme,

    No Windows existe mesmo um cache, mas ele é despejado na mídia muito rápido. Quando esse descarregamento falha dá a mensagem (pelo menos no XP em português) "falha na gravação atrasada". Mas como é um processo muito rápido as únicas vezes em que vi essa mensagem foi quando o HDD estava com algum tipo de problema.

    Como na maior parte do tempo eu vou querer usar a GUI, eu gostaria que fosse possível determinar que o "disk block cache" seja esvaziado imediatamente ou que pelo menos a GUI mostrasse um ícone diferenciado na mídia indicando que o arquivo ainda não está fisicamente lá.

    Porém se eu entendi corretamente o que você me explicou, a alternativa do ícone não é possível, porque a GUI (provávelmente - não tenho conhecimento em Linux para afirmar) não tem como saber quando o cache é despejado na mídia destino.

    Eu estava esperando que outra distro tivesse um comportamento diferente, mas pelo jeito vou precisar me acostumar com isso.

    ResponderExcluir
  3. Exato, a interface gráfica, bem como qualquer programa comum, não tem como saber se algo está no cache ou no disco. Talvez tenha alguma API que eu não conheço pra isso, mas nunca ouvi falar de nada do tipo. Tem 2 maneiras tradicionais de se garantir que os caches estão sincronizados com o conteúdo nas mídias, uma é usando gravação direta, que foi o que eu disse antes, e a outra é chamar a syscall sync() ou o comando sync, que só "retorna" (termina de executar) quando termina de sincronizar os dados.

    Talvez você queira criar um atalho num lugar bem acessível pro comando sync e/ou pra desmontar o pendrive. Deve facilitar a sua vida. :P

    ps: o sync aparentemente "faz nada", pois não dá nenhuma mensagem. é assim mesmo, ele não deve dizer nada, a única coisa que ele faz é esperar os dados serem enviados pras mídias e terminar.

    ResponderExcluir
  4. Só para constar, hoje em dia no Linux é muito fácil habilitar a gravação síncrona dos dados. No Kubuntu, por exemplo, é só clicar com o botão direito sobre o ícone do dispositivo e procurar a aba "Montagem" e marcar a opção "Síncrono". Dê OK e pronto, acabou-se o problema da gravação lenta.

    ResponderExcluir