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{fetch
\_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. Para alocar e
83 descartar as tabelas existem as primitivas
\code{create
} e
\code{delete
}. Todas
84 as tabelas são acedidas a partir de primitivas internas e nunca directamente. A
85 primitiva
\code{print
}, disponível para a
\code{cctable
} e
\code{itable
} (sim,
86 itable), apresenta as tabelas de forma a que o utilizador consiga perceber o
87 estado do sistema de ficheiros. Os valores armazenados nas tabelas são do tipo
88 \code{ic
\_t} para a
\code{ictable
},
\code{cc
\_t} para a
\code{cctable
} e
89 \code{uint32
\_t} para a
\code{irtable
}. Inicialmente, todas as posições das
90 tabelas
\code{cctable
} e
\code{ictable
} têm o valor
\code{bah
}. A
\code{irtable
}
93 typedef enum
{idle, busy, bah
} ic_t;
94 typedef enum
{idle, busy, bah
} cc_t;
96 void ictable_create(void);
97 void ictable_free(void);
98 void ictable_set(uint32_t index, ic_t value);
99 void ictable_get(uint32_t index, ic_t *value);
101 void cctable_create(void);
102 void cctable_free(void);
103 void cctable_set(uint32_t index, cc_t value);
104 void cctable_get(uint32_t index, cc_t *value);
105 void cctable_print(void);
107 void irtable_create(void);
108 void irtable_free(void);
109 void irtable_inc(uint32_t index);
110 void irtable_get(uint32_t index, uint32_t *value);
112 void itable_print(void);
115 \section{O Superbloco
}
116 O primeiro passo da verificação de consistência do sistema de ficheiros é
117 verificar se o superbloco está em condições. Só tendo um superbloco em condições
118 poderemos passar a testes mais profundos. Alguns dos erros encontrados aqui têm
119 salvação, mas a maior parte não, dado que são dados acertados aquando da
120 formatação e uma inconsistência nestes revela um formatador defeituoso.
122 Todos os nomes de variáveis aqui usados estão documentados no código fonte do
125 São implementados os seguintes testes para analisar o superbloco:
127 \item \code{test
\_sbmagic}: verifica se estamos a lidar com um sistema de
128 ficheiros do tipo SOFS09 olhando para o número "mágico".
130 \item \code{corrupt
}: o número mágico não está correcto.
131 \item Solução: não tem.
133 \item \code{test
\_sbname}: verifica se o nome do disco é uma
\emph{string
}
134 válida, ou seja, se está devidamente terminada.
136 \item \code{corrupt
}: o nome não está terminado.
137 \item Solução: não tem.
139 \item \code{test
\_sbzones}: verifica se as várias zonas do sistema de
140 ficheiros se encontram contíguas, se cabem no disco ou se são pequenas
143 \item \code{corrupt
}: as zonas sobrepoem-se, excedem o tamanho do disco
144 ou são pequenas demais.
145 \item \code{weird
}: as zonas não estão contíguas.
146 \item Solução: não tem.
148 \item \code{test
\_sbfctablesize}
149 \item \code{test
\_sbciutablesize}
150 \item \code{test
\_sbitotal}: estes três testes são semelhantes e verificam
151 se os tamanhos das várias zonas são grandes o suficiente para um bom
152 funcionamento do sistema de ficheiros.
154 \item \code{corrupt
}: pelo menos uma das zonas não é grande o
156 \item \code{weird
}: as zonas são maiores do que o necessário.
157 \item Solução: não tem.
163 Os nós-i podem estar livres ou conter informação relativa a um ficheiro, um
164 \emph{link
} ou uma pasta.
167 \item \code{test
\_infree}: verifica se
\code{ifree
} corresponde ao número
168 de nós-i que estão livres, percorrendo a lista de nós-i livres. Esta função
169 preenche parte da
\code{ictable
}.
171 \item \code{corrupt
}:
\code{ifree
} está incorrecto, algum nó-i da lista
172 não está marcado como livre ou a lista de nós-i livres fecha-se sobre si
174 \item Solução: No primeiro caso, alterar o valor de
\code{ifree
} para
175 concordar com a quantidade de nós-i que estão na lista biligada. No
176 segundo caso, marcar o nó-i como livre. No último caso, não sei.
178 \item \code{test
\_inused}: percorrer todas as entradas de directório e
179 contar o número de vezes que cada nó-i é referenciado. Comparar depois com o
180 valor de
\code{refcount
} de cada nó-i.
182 \item \code{corrupt
}: se forem encontradas discrepâncias.
183 \item Solução: corrigir o
\code{refcount
} dos nós-i. Se estes não forem
184 referenciados por nenhuma entrada de directório, libertar o nó-i e os
185 \emph{clusters
} detidos por ele.
187 \item \code{test
\_inlost}: depois de corridos os testes
\code{infree
} e
188 \code{inused
} estamos em condições de saber se há nós-i perdidos recorrendo
191 \item \code{corrupt
}: há nós-i perdidos.
192 \item Solução: adiciona-los à IT.
194 \item \code{teste
\_ininfo}: verifica se a informação de cada nó-i é
197 \item \code{corrupt
}:
\code{refcount
} é zero mas o nó-i não está
199 \item \code{weird
}: permissões manhosas (
007)...
200 \item Solução: a estas horas já não sei é nada!!!
204 \section{Os Clusters
}
206 Um cluster pode estar a ser utilizado por um ficheiro ou estar livre.
209 \item \code{test
\_clusterfree}: verifica se
\code{dzone
\_free}
210 corresponde ao número de posições ocupadas na FCT mais os
\code{cache
\_cnt}
213 \item \code{corrupt
}: não corresponde
214 \item Solução: alterar
\code{dzone
\_free} para corresponder ao número de
215 posições ocupadas na FCT mais os
\code{cache
\_cnt} das
\emph{caches
}.
217 \item \code{test
\_clusterused}: analisa onde estão referenciados os
218 clusters percorrendo todos os nós-i em utilização e comparar essas
219 referências com a CIUT.
221 \item \code{corrupt
}: um
\emph{cluster
} está associado a mais do que um
222 nó-i, está referenciado mais do que uma vez na FCT ou está
223 simultaneamente referenciado na FCT e associado a um ou mais nós-i. Pode
224 também acontecer quando um
\emph{cluster
} tem uma entrada na CIUT
225 diferente do nó-i a que está realmente associado.
226 \item Solução: se um
\emph{cluster
} estiver associado a mais do que um
227 nó-i, alocar tantos
\emph{clusters
} quantos os nós-i a que eles estão
228 associados menos um, e colocar neles o conteúdo do nó-i "existente". Se
229 o
\emph{cluster
} estiver simultaneamente na FCT removê-lo de lá. Se
230 estiver várias vezes referênciado na FCT, removê-lo tantas vezes quantas
233 \item \code{test
\_clusterlost}: depois de analisada a FCT e
\emph{caches
} e
234 analisar quais os
\emph{clusters
} que estão a ser utilizados, estamos em
235 condições de dizer se existem
\emph{clusters
} perdidos olhando para a
238 \item \code{corrupt
}: existem
\emph{clusters
} perdidos.
239 \item Solução: adicionar os
\emph{clusters
} perdidos à tabela de
240 \emph{clusters
} livres.