Como depurar esse erro de FS em um dispositivo flash?

6

Eu tenho acesso ao console para um dispositivo Linux incorporado. Este dispositivo tem uma parte da memória flash que é particionada como um sistema de arquivos FAT.

Sua execução linux-2.6.31.

No entanto, estou vendo esses erros no console atualmente e o sistema de arquivos FAT se torna somente leitura.

111109:154925 FAT: Filesystem error (dev loop0)
111109:154925 fat_get_cluster: invalid cluster chain (i_pos 0)
111109:154925 FAT: Filesystem error (dev loop0)
111109:154925 fat_get_cluster: invalid cluster chain (i_pos 0)

Eu não consigo entender por que isso aconteceu? Qual é a causa raiz? E qual é a correção? Gostaria de receber respostas que possam me indicar como investigar a possível causa raiz desse problema no dispositivo.

    
por abc 16.11.2011 / 23:41

3 respostas

6

O que realmente aconteceu em um nível de bits e bytes é que 4 bytes (ou mais) da tabela de alocação de arquivos foram sobrescritos com 0x00 bytes.

Vou explicar resumidamente como funciona a tabela de alocação de arquivos. Pode ser visto como um array cujos valores são índices desse mesmo array. Portanto, se soubermos que o primeiro número de cluster de um arquivo é i , o próximo número de cluster será fat[i] e o próximo depois será fat[fat[i]] , e assim por diante. (Isso é um pouco simplificado). Para sinalizar que o final da cadeia é alcançado, um valor EOC especial é usado em vez de um número de cluster válido.

Para ler um arquivo FAT do disco, você precisa dos números de cluster onde o arquivo está armazenado, em ordem. A entrada de diretório fornece o primeiro número de cluster ( i ). O resto pode ser encontrado seguindo a corrente fat[i] , fat[fat[i]] etc. até que o valor EOC seja encontrado. Então, é um cálculo simples para obter a posição em disco de cada cluster dos números do cluster, ler cada cluster na memória e concatená-los.

O erro fat_get_cluster: invalid cluster chain ocorre quando o valor 0x00000000 é encontrado seguindo tal cadeia. Isso não deveria acontecer. Deve ser um novo número de cluster válido ou o valor EOC. Não é mais possível ler o arquivo quando isso acontece, pois não há como acompanhar a cadeia ainda mais. (O valor 0x00000000 é usado para marcar um cluster como livre. O cluster 0 nunca é usado para armazenar dados, portanto não há ambigüidade)

Seu caso pode ser um caso especial, já que i_pos é dado como 0. Quando recebi esta mensagem, era um número grande. Fonte do kernel diz:

    loff_t i_pos;           /* on-disk position of directory entry or 0 */

Portanto, i_pos não é um número de cluster, mas uma posição no disco. O que significa quando é zero, eu não sei.

EDIT: Quanto ao que pode ter causado isso, só posso especular, mas aqui estão algumas possibilidades:

  1. Um erro de driver FAT.
  2. Raios cósmicos .
  3. Um vírus ou outro software malicioso .
  4. Talvez se dois programas / pilotos estivessem escrevendo e lendo para o mesmo FAT simultaneamente por algum motivo, eles poderiam atropelar um ao outro. Não sei se é possível.
  5. Desligue-o no momento errado. As unidades flash precisam zerar um bloco antes de gravar alterações, portanto, teoricamente, um desligamento logo após o apagamento causaria esse resultado. No entanto, existem failsafes para evitar isso na maioria das unidades.
  6. Erro do usuário ou sabotagem (por exemplo, dd if=/dev/zero of=/dev/sda1 bs=512 count=1 seek=32 - não tente fazer isso em casa!)

Os drivers do sistema de arquivos FAT na verdade mantêm duas tabelas FAT atualizadas para redundância, enquanto a segunda está logo após a primeira . Verificar se eles são idênticos pode dar pistas do que pode ter acontecido. Se eles diferissem apenas no valor que quebra a cadeia de clusters, eu acho que a manipulação direta de alguma forma é mais provável, já que pelo menos 1 e 3 devem fazer o trabalho "adequadamente".

Parece-me provável, porém, que a maioria dos drivers modernos manteria toda a tabela FAT na RAM e escreveria as partes que retornam às duas cópias na unidade. Assim, mesmo se houvesse uma diferença, ela poderia ter sido rápida e silenciosamente "consertada" durante o uso normal. Note que este é apenas um palpite.

No final, é muito difícil saber com alguma certeza sem maiores informações sobre as circunstâncias, e mesmo assim é provável que haja adivinhações. Circunstâncias ideais seriam se você pudesse recriar de forma confiável o problema. Então, eu compararia as tabelas FAT "antes" e "depois" (e os cabeçalhos FAT) para ver exatamente o que havia sido alterado e o que, procurando por sugestões na localização e no conteúdo das alterações.

    
por 25.07.2012 / 10:21
5

Seu FAT32 foi corrompido por algum motivo. Meu pendrive muitas vezes acaba com um FS corrompido porque atualmente estou depurando um problema de host USB em uma plataforma ARM. Depois dos meus testes, eu envio os seguintes comandos da minha máquina desktop (Ubuntu 11.04):

$ sudo fsck.msdos -aw /dev/sdb1

Ref: link

    
por 13.07.2012 / 15:55
1

Os erros que você está recebendo cadeia de cluster inválida e erro do sistema de arquivos mostram claramente que é um erro no sistema de arquivos.

A entrada da Wikipedia no FAT diz:

A partition is divided up into identically sized clusters, small blocks of contiguous space. Cluster sizes vary depending on the type of FAT file system being used and the size of the partition, typically cluster sizes lie somewhere between 2 kB and 32 kB. Each file may occupy one or more of these clusters depending on its size; thus, a file is represented by a chain of these clusters (referred to as a singly linked list). However these clusters are not necessarily stored adjacent to one another on the disk's surface but are often instead fragmented throughout the Data Region.

The File Allocation Table (FAT) is a list of entries that map to each cluster on the partition. Each entry records one of five things:

  • the cluster number of the next cluster in a chain
  • a special end of clusterchain (EOC) entry that indicates the end of a chain
  • a special entry to mark a bad cluster
  • a zero to note that the cluster is unused

Este link diz que alguém resolveu problema semelhante com cartão de memória usando fsck.

    
por 18.11.2011 / 06:57