s i s t e m a o p e r a c i o n a l m a g n u x l i n u x | ~/ · documentação · suporte · sobre |
Página seguinte
Página anterior
Índice
606. Recuperando os blocos de dadosEsta parte pode ser tanto mais fácil quanto mais difícil. Depende se o arquivo que se está tentando recuperar tenha ou não mais de 12 blocos de tamanho.
606.1 Arquivos curtosSe o arquivo não tinha mais que 12 blocos de tamanho, então os números dos blocos de todos os seus dados estão armazenados no inode: pode-se lê-los diretamente da saída
Este arquivo tem seis blocos (veja o campo BLOCKS). Uma vez que ele é menor que o limite de 12, usaremos
Naturalmente que isto também pode ser feito com
Tanto com
Claro que é possível que um ou mais dos blocos que compunham o arquivo tenham sido sobrescritos. Se isso aconteceu, então você está sem sorte pois o bloco se foi para sempre (mas só pense se você tivesse desmontado mais cedo!).
606.2 Arquivos maioresOs problemas crescem quando o arquivo tem mais de 12 blocos de dados. Vale a pena saber um pouco sobre a estruturação do sistema de arquivos UNIX. Os dados do arquivo são armazenados em unidades chamadas 'blocos'. Estes blocos podem ser numerados seqüencialmente. Um arquivo também tem um 'inode', que é o lugar onde são guardadas informações como quem é o proprietário, quais as permissões, e qual o tipo do arquivo. Como os blocos, os inodes são numerados seqüencialmente, embora tenham uma seqüência diferente. Uma entrada de diretório consiste do nome do arquivo e um número de inode. Mas com este estado de coisas, é ainda impossível para o kernel encontrar os dados correspondentes a uma entrada de diretório. Por isso o inode também armazena o local dos blocos de dados, como se segue:
Leia novamente: sei que é complexo, mas também é importante. Agora, a implementação do kernel atual (certamente para todas as versões acima de 2.0.30) infelizmente zera todos os blocos indiretos (e os blocos duplamente indiretos, e assim por diante) quando apaga um arquivo. Assim se seu arquivo for maior que 12 blocos, não se tem garantia de poder encontrar até mesmo os números de todos os blocos que se precisa, isso sem mencionar os seus conteúdos. O único método que eu pude encontrar até aqui é presumir que o arquivo não foi fragmentado: se foi, temos problemas. Supondo que o arquivo não foi fragmentado, há vários planos de blocos de dados de acordo com quantos blocos de dados o arquivo usou:
Claro, mesmo se estes números de blocos de dados presumidos estiverem corretos, não há garantia de que seus dados estejam intactos. Além disso, quanto mais longo for arquivo, menor a chance de que tenha sido escrito no sistema de arquivos sem a fragmentação apreciável (exceto em circunstâncias especiais). Note que presumo do começo ao fim que o tamanho de bloco é de 1024 bytes, por ser este o valor padrão. Caso os blocos sejam maiores, alguns dos números acima mudarão. Especificamente: uma vez que cada número de bloco tem 4 bytes de comprimento, um tamanho de bloco/4 é o valor do número de blocos que podem ser armazenados em cada bloco indireto. Assim todas as vezes que o número 256 aparecer na discussão acima, substitua-o pelo tamanho de bloco/4. Os limites de 'números de blocos necessários' também terão que ser mudados. Vamos dar uma olhada num exemplo de recuperação de um arquivo mais longo.
Parece haver um chance razoável de que este arquivo não seja fragmentado: certamente os primeiros 12 blocos listados no inode (que são todos blocos de dados) são adjacentes. Portanto podemos começar salvando aqueles blocos.
Agora, o próximo bloco listado no inode, o 8326, é um bloco indireto que podemos ignorar. Mas confiamos que ele será seguido por 256 blocos de dados (dos números 8327 até 8582).
O bloco final listado no inode é 8583. Note que vamos bem em termos do arquivo ser adjacente: os últimos dados que escrevemos foram do bloco número 8582, que é 8327 + 255. Este bloco 8583 é duplamente indireto, o qual pode ser ignorado. É seguido por até 256 repetições de um bloco indireto (que é ignorado) seguido por 256 blocos de dados. Usando a aritmética rapidamente, nós emitimos os seguintes comandos. Note que pulamos o bloco duplamente indireto número 8583, e o bloco indireto 8584 imediatamente (esperamos) a seguir, e começamos no bloco 8585 para dados.
Somando, nós vemos que até aqui escrevemos 12 + (7 * 256) blocos, o que são 1804. O resultado do `stat' para o inode nos deu um 'contador de blocos' de 3616; infelizmente estes blocos tem 512 bytes de comprimento (como uma ressaca do UNIX), assim nós realmente queremos 3616/2 = 1808 blocos de 1024 bytes. Isto significa que precisamos só de mais quatro blocos. O último bloco de dados escrito foi o número 10125. Como estivemos fazendo até aqui, omitimos um bloco indireto (número 10126) e podemos escrever então aqueles últimos quatro blocos.
Agora, com um pouco de sorte, todo o arquivo foi recuperado com sucesso. Ufa!!
Página seguinte Página anterior Índice |