1 \documentclass{article
}
2 \usepackage[portuguese
]{babel
}
3 \usepackage[utf8
]{inputenc}
4 \usepackage{indentfirst
}
11 \newcommand{\code}[1]{{\tt #1}}
16 \code{fsck.sofs09
}%\\\bigskip
17 %Programa para teste de consistência e correcção de erros de um sistema de
20 \author{Cristóvão Cruz
}
27 Este projecto visa desenvolver um programa que detecte e, quando possível,
28 corriga erros num sistema de ficheiros SOFS09.
30 \section{O sistema de ficheiros
}
31 O sistema de ficheiros SOFS09 é constituido por várias zonas que contêm
32 informação dedicada à gestão do espaço em disco e uma zona de dados, todas elas
35 Para gerir o espaço em disco existem as seguintes zonas:
37 \item Superbloco: informação acerca da localização de todas as outras zonas;
38 \item Tabela de clusters livres (FCT): tabela com os endereços de todos os
39 \emph{clusters
} livres. O seu tamanho tem que ser suficiente para armazenar
40 tantos endereços como os
\emph{clusters
} da zona de dados;
41 \item Tabela de associação
\emph{clusters
} --- nó-i (CIUT): indica qual o
42 nó-i que está a utilizar cada
\emph{cluster
} da zona de dados. O seu tamanho
44 \item Tabela de nós-i (IT): tabela onde estão localizados todos os nós-i do
45 sistema de ficheiros. O seu tamanho é definido pelo utilizador aquando da
46 criação do sistema de ficheiros;
49 A zona de dados ocupa todo o espaço restante e está dividida em
\emph{clusters
},
50 que são a unidade mínima de espaço que pode ser alocada neste sistema de
53 \section{A estrutura do programa
}
55 O programa faz todos os testes que se encontrem no array testes, cujo conteúdo é
56 o endereço das várias funções que implementam os testes. Estas funções devolvem
57 um valor do tipo
\code{testresult
\_t}, cuja definição se segue:
59 typedef enum
{corrupt, weird, nice
} testresult_t;
62 Se o resultado de uma função for
\code{corrupt
}, a não ser que possa ser
63 corrigido e o utilizador o peça explicitamente, o sistema de ficheiros é
64 considerado corrupto e não são realizados mais testes. Se o resultado for
65 \code{weird
}, o utilizador é notificado com uma mensagem e o teste continua.
66 \code{nice
} indica que está tudo nos conformes.
\textbf{De momento ainda não se encontra
67 implementada a funcionalidade de correcção do sistema de ficheiros.
}
69 O acesso ao superbloco é feito a partir da primitiva
\code{fech
\_superblock} que
70 coloca no argumento um endereço de memória onde se encontra armazenado o
71 superbloco. Esta função não monitoriza alterações, assumindo que a informação é
72 apenas para ser lida do superbloco e nunca escrita. Quando for necessário
73 escrever informação no superbloco (para corrigir o sistema de ficheiros), será
74 necessário alterar esta rotina.
76 void fetch_superblock(SOSuperBlock **sb);
79 Existem ainda várias tabelas. A
\code{ictable
} serve para armazenar informação
80 acerca do estado de utilização dos nós-i. A
\code{cctable
} serve para armazenar
81 informação acerca da utilização dos
\emph{clusters
} de dados. A
\code{irtable
}
82 serve para armazenar o
\code{refcount
} real de cada nó-i. Todas as tabelas são
83 acedidas a partir de primitivas internas e nunca directamente. Estas primitivas
84 tratam de alocar espaço para as tabelas, inicializar o seu conteúdo a valores
85 adequados e libertar as tabelas no final do programa. A primitiva
\code{print
},
86 disponível para a
\code{cctable
} e
\code{ictable
} apresenta as tabelas de forma
87 a que o utilizador consiga perceber o estado do sistema de ficheiros. Os valores
88 armazenados nas tabelas são do tipo
\code{ic
\_t} para a
\code{ictable
},
89 \code{cc
\_t} para a
\code{cctable
} e
\code{uint32
\_t} para a
\code{irtable
}.
90 Inicialmente, todas as posições das tabelas
\code{cctable
} e
\code{ictable
} têm
91 o valor
\code{bah
}. A
\code{irtable
} tem
\code{0}.
93 typedef enum
{idle, busy, bah
} ic_t;
94 typedef enum
{idle, busy, bah
} cc_t;
96 void ictable_set(uint32_t index, ic_t value);
97 void ictable_get(uint32_t index, ic_t *value);
98 void ictable_print(void);
100 void cctable_set(uint32_t index, cc_t value);
101 void cctable_get(uint32_t index, cc_t *value);
102 void cctable_print(void);
104 void irtable_inc(uint32_t index);
105 void irtable_get(uint32_t index, uint32_t *value);
108 \section{O Superbloco
}
109 O primeiro passo da verificação de consistência do sistema de ficheiros é
110 verificar se o superbloco está em condições. Só tendo um superbloco em condições
111 poderemos passar a testes mais profundos. Alguns dos erros encontrados aqui têm
112 salvação, mas a maior parte não, dado que são dados acertados aquando da
113 formatação e uma inconsistência nestes revela um formatador defeituoso.
115 Todos os nomes de variáveis aqui usados estão documentados no código fonte do
118 São implementados os seguintes testes para analisar o superbloco:
120 \item \code{test
\_sbmagic}: verifica se estamos a lidar com um sistema de
121 ficheiros do tipo SOFS09 olhando para o número "mágico".
123 \item \code{corrupt
}: o número mágico não está correcto.
124 \item Solução: não tem.
126 \item \code{test
\_sbname}: verifica se o nome do disco é uma
\emph{string
}
127 válida, ou seja, se está devidamente terminada.
129 \item \code{corrupt
}: o nome não está terminado.
130 \item Solução: não tem.
132 \item \code{test
\_sbzones}: verifica se as várias zonas do sistema de
133 ficheiros se encontram contíguas, se cabem no disco ou se são pequenas
136 \item \code{corrupt
}: as zonas sobrepoem-se, excedem o tamanho do disco
137 ou são pequenas demais.
138 \item \code{weird
}: as zonas não estão contíguas.
139 \item Solução: não tem.
141 \item \code{test
\_sbfctablesize}
142 \item \code{test
\_sbciutablesize}
143 \item \code{test
\_sbitotal}: estes três testes são semelhantes e verificam
144 se os tamanhos das várias zonas são grandes o suficiente para um bom
145 funcionamento do sistema de ficheiros.
147 \item \code{corrupt
}: pelo menos uma das zonas não é grande o
149 \item \code{weird
}: as zonas são maiores do que o necessário.
150 \item Solução: não tem.
156 Os nós-i podem estar livres ou conter informação relativa a um ficheiro, um
157 \emph{link
} ou uma pasta.
160 \item \code{test
\_infree}: verifica se
\code{ifree
} corresponde ao número
161 de nós-i que estão livres, percorrendo a lista de nós-i livres. Esta função
162 preenche parte da
\code{ictable
}.
164 \item \code{corrupt
}:
\code{ifree
} está incorrecto, algum nó-i da lista
165 não está marcado como livre ou a lista de nós-i livres fecha-se sobre si
167 \item Solução: No primeiro caso, alterar o valor de
\code{ifree
} para
168 concordar com a quantidade de nós-i que estão na lista biligada. No
169 segundo caso, marcar o nó-i como livre. No último caso, não sei.
171 \item \code{test
\_inused}: percorrer todas as entradas de directório e
172 contar o número de vezes que cada nó-i é referenciado. Comparar depois com o
173 valor de
\code{refcount
} de cada nó-i.
175 \item \code{corrupt
}: se forem encontradas discrepâncias.
176 \item Solução: corrigir o
\code{refcount
} dos nós-i. Se estes não forem
177 referenciados por nenhuma entrada de directório, libertar o nó-i e os
178 \emph{clusters
} detidos por ele.
180 \item \code{test
\_inlost}: depois de corridos os testes
\code{infree
} e
181 \code{inused
} estamos em condições de saber se há nós-i perdidos recorrendo
184 \item \code{corrupt
}: há nós-i perdidos.
185 \item Solução: adiciona-los à IT.
187 \item \code{teste
\_ininfo}: verifica se a informação de cada nó-i é
190 \item \code{corrupt
}:
\code{refcount
} é zero mas o nó-i não está
192 \item \code{weird
}: permissões manhosas (
007)...
193 \item Solução: a estas horas já não sei é nada!!!
197 \section{Os Clusters
}
199 Um cluster pode estar a ser utilizado por um ficheiro ou estar livre.
202 \item \code{test
\_clusterfree}: verifica se
\code{dzone
\_free}
203 corresponde ao número de posições ocupadas na FCT mais os
\code{cache
\_cnt}
206 \item \code{corrupt
}: não corresponde
207 \item Solução: alterar
\code{dzone
\_free} para corresponder ao número de
208 posições ocupadas na FCT mais os
\code{cache
\_cnt} das
\emph{caches
}.
210 \item \code{test
\_clusterused}: analisa onde estão referenciados os
211 clusters percorrendo todos os nós-i em utilização e comparar essas
212 referências com a CIUT.
214 \item \code{corrupt
}: um
\emph{cluster
} está associado a mais do que um
215 nó-i, está referenciado mais do que uma vez na FCT ou está
216 simultaneamente referenciado na FCT e associado a um ou mais nós-i. Pode
217 também acontecer quando um
\emph{cluster
} tem uma entrada na CIUT
218 diferente do nó-i a que está realmente associado.
219 \item Solução: se um
\emph{cluster
} estiver associado a mais do que um
220 nó-i, alocar tantos
\emph{clusters
} quantos os nós-i a que eles estão
221 associados menos um, e colocar neles o conteúdo do nó-i "existente". Se
222 o
\emph{cluster
} estiver simultaneamente na FCT removê-lo de lá. Se
223 estiver várias vezes referênciado na FCT, removê-lo tantas vezes quantas
226 \item \code{test
\_clusterlost}: depois de analisada a FCT e
\emph{caches
} e
227 analisar quais os
\emph{clusters
} que estão a ser utilizados, estamos em
228 condições de dizer se existem
\emph{clusters
} perdidos olhando para a
231 \item \code{corrupt
}: existem
\emph{clusters
} perdidos.
232 \item Solução: adicionar os
\emph{clusters
} perdidos à tabela de
233 \emph{clusters
} livres.
237 \section{As Entradas de Directório
}
239 Uma entrada de directório detem o nome e o índice do nó-i respectivo.
242 \item \code{test
\_deindex}: verificar se o índice do nó-i apontado é válido;
244 \item \code{corrupt
}: o índice é maior que máximo permitido;
245 \item Solução: não tem;