2009/07/27


Formatos de arquivo e memórias flash

(Um artigo meio extenso e pouco elaborado sobre formatos de sistema de arquivo e memórias flash. Pode ter uma ou outra informação interessante que eu não soube explorar com a melhor habilidade narrativa possível!...)

Já se estabeleceu em nosso cotidiano o uso de memórias flash para armazenar arquivos. Pequenas e econômicas --- e caras --- elas estão em câmeras digitais, celulares, pendrives, palmtops, e mesmo netbooks. Dá até pra usar simplesmente como um disquetinho, se você tiver leitor de cartão em sua máquina.

Assim como disquetes, fitas e discos rígidos, a memória é antes de mais nada um simples "depósito de bits". Existe um mecanismo de endereçamento que permite a você ler e gravar dados com certas restrições. Mas ninguém lida com essa coisas direto, geralmente as pessoas querem usar são os serviços ofereceidos pelos sistemas operacionais. Os SOs criam arquivos com nome e data e permissões, apagam os arquivos, gerenciam o espaço livre no dispositivo, e ainda tomam algum cuidado pra ver se houve corrupção da memória, e lidam com esses erros.

Para fazer isso tudo é preciso antes decidir qual vai ser o sistema de arquivos utilizado na memória. Quando a gente formata uma partição está fazendo é isso, decidindo o formato, e eventualmente tomando as medidas necessárias pra inicializar essa memória, colocando lá algumas estruturas de dados iniciais pro SO trabalhar com aquele formato.

Diferentes formatos de sistema de arquivos possuem diferentes características, e podem também ser mais adaptados para mídias com diferentes restrições. Alguns vão ser melhores para arquivos maiores ou menores, por exemplo, ou mais ou menos velozes e mais ou menos seguros. As características também incluem limitações aos tamanhos de arquivos e da mídia, e ainda aos nomes dos arquivos (número e tipo de caracteres.)

Essa tabela na Wikipedia compara vários formatos diferentes. Entre eles existem alguns famosos, a começar pelo FAT, programado com contribuições do próprio Bill Gates e utilizado por produtos da Microsoft desde então, além de inúmeras outras empresas.

Um exemplo de como a formatação pode influenciar no espaço livre para armazenamento, veja essa outra tabela. Compare os discos de 90mm... Uma primeira curiosidade é que inicialmente a Apple utilizava controle de velocidade, permitindo um melhor aproveitamento da mídia magnética, ao contrário dos outros leitores de disquete que utilizavam velocidade angular constante. Mas isso é outra história...

Repare como que os disquetes de 90mm (3.5 polegadas) de alta densidade possuem tamanhos diferentes. O mais comum é 1440kB, mas o Amiga conseguia guardar 1760kB. No IBM-PC tb existia um macete pra conseguir 1680kB e 1720kB, que algumas empresas utilizavam pra distribuir seus programas e dificultar a cópia destes. Essa diferença de tamanho não é por causa de algo físico, como variação de velocidade de gravação, mas sim diferença na formatação dos discos. Um disco de 90mm não-formatado consegue guardar até uns 2000kB, dizem.

Discos flexíveis são geralmente tosquinhos, e ninguém espera uma formatação sofisticada neles. Se puder haver mais espaço e velocidade, ótimo... No caso de discos rígidos pode ser mais desejável uma formatação que permita mais segurança. Quando a gente faz RAID, por exemplo, está indo atrás de redundância e confiabilidade (e velocidade, às vezes), e não espaço de armazenamento. É um comprometimento.

A formatação FAT não oferece nada demais. Uma tabela centralizada localizada no início da partição anota a alocão de clusters de tamanho fixo para os diferentes arquivos. FAT possui alguns problemas conhecidos, em especial a fragmentação excessiva.

Existem muitos formatinhos simples --- ainda piores do que o FAT --- por aí, utilizados em aplicações específicas. Um exemplo é o iso9660, ou CDFS, utilizado em CDs de dados.

Um exemplo de formato mais moderno são os que fazem _jounaling_. Nestes formatos cada mudança aos arquivos é antes anotada em um diário. Se houver uma pane, a chance de você causar um erro sério ao seu sistema é bastante reduzida. Pode haver registro apenas de modificações aos meta-dados (nome de arquivos, etc), quanto dos próprios dados. O NTFS, por exemplo, é um formato que faz esse tipo de coisa. A principal diferença entre ext2 e ext3 também é o journaling.

Existe também uma família de formatos chamados log-structured que funcionam de forma bastante peculiar. Eles podem manter "vivas" versões mais antigas dos arquivos, que só vão se perdendo quando o espaço na memória acaba, e os dados antigos precisam dar lugar aos novos. Um formato baseado nesta idéia é o recente UDF, utilizado em DVDs e em discos óticos regraváveis (CD-RW). No mundo BSD também surgiu um tal LFS que segue a idéia. Existe ainda um conjuntos de formatos dessa família dedicados desenvolvidos especificamente para memórias flash: jffs2 e yaffs.

***

Agora chegamos ao assunto que na verdade me atraiu pra falar isso tudo. Comprei um cartão de memória (SD), e estou decidindo como vou formatá-lo. Eles vem geralmente formatados com FAT só porque as indústrias querem agradar os consumidores, permitindo a eles utilizar os cartões sem se preocupar com o assunto. E como a maioria das pessoas usa produtos da micros~1, eles formatam para eles. E o Windions suporta apenas o tal NTFS quando muito, e o arcaico FAT, recauchutado para permitir, por exemplo, nomes com mais de 8.3 caracteres...

Mas parece que pra usar NTFS tem que dar dinheiro pra microshort, e o formato tb nem é tão popular quanto o FAT, que acaba sendo então a escolha. Mas os problemas não terminam aí, porque a empresa de Redmond resolveu que vai capitalizar em cima do formato!

Como não tenho muita necessidade em ser compatível com windows (uma pequena partição FAT16 provavelmente vai atender minha necessidade de ter que copiar arquivos da máquina dos outros de vez em quando...), estou decidido a não utilizar o VFAT com que minha memória veio formatada. A pergunta agora é: qual seria o melhor formato pra escolher?

Os tais jffs2 e yaffs me parecerem a princípio ser a escolha ideal. Existe até um outro formato sendo desenvolvido pela Nokia, ubifs, também dedicado pra memórias flash. Só que aparentemente eles são direcionados apenas a memórias flash "internas", e não pra cartões... Cartões são desenvolvidos para se comportarem de maneira mais parecida com discos rígidos, e os formatos de escolha devem ser os que se usam neles. (Mas ainda estou confirmando a lógica disso.)

Uma das características que um jffs2 teria seria gastar a memória por igual ao longo do tempo. Acontece que memórias flash vão se degradando conforme você vai escrevendo em um certo ponto, então é bom fazer esse gasto espalhado por toda a memória, evitando ficar escrevendo sobre um mesmo local, modificando um mesmo arquivo, por exemplo.

Quando seu dispositivo é uma memória flash pura, o sistema operacional precisa vigiar esse tipo de coisa. Mas em um cartão de memória parece que existe um contrle interno que faz isso automaticamente, dispensando portanto o uso desses formatos de arquivo dedicados.

Não seria portanto indicado utilizar formatos como jffs2 em cartões SD. Eu li inclusive que o jffs2 pode ser bem mais lento do que, por exemplo, ext2, além de ser pior pra mídias muito grandes.

Outra característica de memória flash é que o problema da fragmentação não é tão terrível quanto em discos, já que não exist euma agulha que vai andando e lendo as coisas... Seria então um motivo a menos pra não utilizar FAT!

A escolha fica portanto entre ext2, ext3, fat, hfs+, udf, ntfs, reiserfs, lfs... E as considerações principais devem ser velocidade e leitura, eficiência de uso do espaço e segurança, considerando que o cenário é uma mídia removível de estado sólido, onde fragmentação nãodeve ser problema, e a questão de realziar um gasto homogênio da mídia também não seria problema porque o cartão já cuida disso sozinho.

Algo que podemos argumentar é que sistemas com journaling de dados vão fazer muito mais gravações do que os mais simples, e portanto vão gastar mais a memória. Mas talvez haja um ganho... Todos conhecem o problema de poder corromper o cartão se remover antes de tomar os cuidados necessários. Talvez o journaling ajude nisso.

Acho que vou fazer um teste, portanto. Criar umas 3 partições, fat ext3 e UDF e ver o que acontece ao longo do tempo!... Reporto daqui a um ano. :]

No comments: