[FUG-BR] [1/2 OFF] Erros não detectados em sistemas de arquivos

Patrick Tracanelli eksffa em freebsdbrasil.com.br
Sex Nov 4 13:00:15 BRST 2005


Giovanni P. Tirloni wrote:
> Olá,
> 
>   Estava lendo a página manual do tune2fs do Linux (calma!) e uma coisa 
> me deixou meio intrigado. Nela a opção -c que define o número máximo de 
> mountagens que o filesystem pode receber antes de sofrer um fsck forçado.
> 
>   A justificativa para isso é que problemas com cabos, memoria, discos e 
> bugs no kernel poderiam corromper o sistema de arquivos sem que 
> necessáriamente ele fosse marcado como sujo (dirty). Forçar um fsck 
> depois de um certo número de montagens ajudaria a corrigir isso (se não 
> fosse fatal).
> 
>   Primeira questão: o que acontece com uma máquina que tem um uptime de 
> uns 2 anos e onde os sistemas de arquivos foram montados apenas umas 3-4 
>   vezes nos ultimos 3 anos? Com certeza essa opção não ajuda muito. Por 
> dedução eu teria que rebootar meus servidores periodicamente para o fsck 
> pegar algum erro escondido que por acaso aparecesse.
> 
>   Não quero me prolongar muito mas verifiquei que o tunefs do FreeBSD 
> não tem essa opção. Talvez porque julguem desnecessária ? É comum esses 
> pequenos erros serem introduzidos por acaso devido aos motivos 
> mencionados (cabo, memoria, cpu, bugs) sem que seja detectado ?
> 
>   Pessoalmente nunca tive esse tipo de problema (até onde eu sei, já que 
> são erros não-detectados) mas vai lá saber.. Algum guru em FS'es para 
> acalmar a mente pensativa? :)
> 
> Um abraço,
> 

Tirloni,

Como com UFS voce pode montar um FS dirty e depois limpa-lo, mesmo
montado, com COW (Copy On Write) e CL (Clean Live File System), acredito
que o background FSCK resolva isso.

Se voce forca fsck em foreground, com -F (mesmo ele podendo rodar em bg)
se o sistema estiver em multi-user e' feito um snapshot logico, e entao
o fsck e feito nesse snapshot e as correcoes sincronizadas, com COW ou 
CL. Isso so' em  multiuser.

O detalhe e que nenhuma operacao COW ou CL e' feita enquanto os inodes 
dos arquivos estao sendo acessados. Se sao muitos inodes o bgfsck ou 
fsck -F mantem a modificacao no snap pendente, e efetivam no FS assim 
que o inode e liberado. Ou o FS locka o acesso a esse inode e o efetiva, 
se so falta essas pendencias pro fsck sair. Ai existe uma questao que 
pode ser dramatica, em discos cheios. Quando voce faz snap os inodes 
"fotografados" sao congelados. As modificacoes no mesmo inode e' alocada 
com uma marcacao logica, e nao no FS. Se a quantidade de userdata 
modificada for muito grande ai sao gravadas nos proximos inodes, e feita 
referencia logica a esses inodes, em contrate com os fisicos (no FS). A 
questao e que com o disco cheio podem faltar inodes, e os dados que por 
ventura sejam apagados onde existe o snapshot nao serao apagados 
efetivamente ate que o snap seja destruido. Entao existe um risco 
teorico, em particoes em plena atividade (Live) e cheias, de que a 
efetivacao de uma correcao destrua userdata ou metadata alocado *apos* o 
snapshot. Esse risco e amenizado e sempre que chega-se a esse ponto o 
metodo COW e preferido ao inves do CL (mesmo que o CL represente melhor 
performance) e o COW passa usar espaco da SWAP. Agora nao lembro se o 
espaco da SWAP e usado pras operacoes logicas do snapshot ou as do FS.

Tem um doc do PHK sobre Copy On Write que ajuda a esclarecer isso. Eu li 
ele faz tempo e esqueci uma pa dos detalhes =P

Mas entao, na pratica, a equipe por tras da "manutencao programada" pode 
tentar diminuir o numero de operacoes de escrita no FS (por exemplo, 
desliga o FTP, ou suspende a fila de delivery local de e-mail, ou 
suspende INSERTS e UPDATES no banco...) e passar fsck em bg (que 
*tambem* faz snapshot, mas nao sei quando nem sob que circunstancias e 
dada essa decisao... acho que o doc do McKusick na USENIX me responderia 
hehehe) ou em foreground com o FS montado. Dessa forma nao e necessario 
qualquer reboot, umount do FS, e ainda evita riscos nas operacoes de W 
(apenas se espaco disponivel em disco for um alarmante).

Outra opcao essa manual!:

	- mount -o snapshot na particao que voce quer
	- desmonta o FS
	- monta o snapshot no ponto de montagem do FS
		- (agora o mount point em questao acessao snap)
	- passa FSCK na device desmontada

Assim nao precisa rebootar. Nunca teste isso! E uma opcao teorica hehe. 
Pra melhorar, com GEOM_LABEL e possivel dar-se labels distintos ao mesmo 
device e ai monta-los simultaneamente. Ou seja o mesmo dispositivo 
fisico montado em pontos diferentes, e com nome de devices diferentes. 
Quando isso acontece, existe "lock" de todo inode que esteja em uso em 1 
mount-point, e se operacoes paralelas no mesmo inode forem feitas, essa 
requsicao e atrasada ate o que o inode seja liberado. Entao, na teoria, 
da pra passar FSCK no dispositivo enquanto ele fica montado no label. 
Seria uma opcao à abordagem anterior, mas sem SNAPSHOT nessa (e 
consequentemente com opcao de W).

Mas o mais facil e contar com o fsck com -B ou -F mesmo! hehuahua, as 
outras tem que ser bem testadas antes ;-)
	




-- 
Patrick Tracanelli

FreeBSD Brasil LTDA.
(31) 3281-9633 / 3281-3547
316601 em sip.freebsdbrasil.com.br
http://www.freebsdbrasil.com.br
"Long live Hanin Elias, Kim Deal!"



_______________________________________________
Freebsd mailing list
Freebsd em fug.com.br
http://mail.fug.com.br/mailman/listinfo/freebsd_fug.com.br




Mais detalhes sobre a lista de discussão freebsd