O diretório corrompido do ZFS, mas o zpool não detecta nada errado

2

Um diretório no meu servidor FreeBSD 10.2 de alguma forma ficou irremediavelmente corrompido (o ZFS não deveria evitar isso?)

ls ou qualquer outro comando contra ele faz com que a sessão atual fique congelada no nível do kernel (mesmo o SIGKILL não faz nada).

OscrubdoZFSnãoencontraproblemas.

#zpoolstatuszrootpool:zrootstate:ONLINEscan:scrubrepaired0in0h17mwith0errorsonSunDec1818:25:042016config:NAMESTATEREADWRITECKSUMzrootONLINE000gpt/zfs0ONLINE000errors:Noknowndataerrors

smartctldizqueestátudobemcomodisco.

SMARTAttributesDataStructurerevisionnumber:16VendorSpecificSMARTAttributeswithThresholds:ID#ATTRIBUTE_NAMEFLAGVALUEWORSTTHRESHTYPEUPDATEDWHEN_FAILEDRAW_VALUE1Raw_Read_Error_Rate0x000b100100016Pre-failAlways-02Throughput_Performance0x0005137137054Pre-failOffline-893Spin_Up_Time0x0007128128024Pre-failAlways-314(Average277)4Start_Stop_Count0x0012100100000Old_ageAlways-785Reallocated_Sector_Ct0x0033100100005Pre-failAlways-07Seek_Error_Rate0x000b100100067Pre-failAlways-08Seek_Time_Performance0x0005142142020Pre-failOffline-299Power_On_Hours0x0012097097000Old_ageAlways-2468110Spin_Retry_Count0x0013100100060Pre-failAlways-012Power_Cycle_Count0x0032100100000Old_ageAlways-78192Power-Off_Retract_Count0x0032100100000Old_ageAlways-306193Load_Cycle_Count0x0012100100000Old_ageAlways-306194Temperature_Celsius0x0002171171000Old_ageAlways-35(Min/Max20/46)196Reallocated_Event_Count0x0032100100000Old_ageAlways-0197Current_Pending_Sector0x0022100100000Old_ageAlways-0198Offline_Uncorrectable0x0008100100000Old_ageOffline-0199UDMA_CRC_Error_Count0x000a200200000Old_ageAlways-0

Mesmozdbnãoencontranadaerrado.

#zdb-czrootTraversingallblockstoverifymetadatachecksumsandverifynothingleaked...loadingspacemapforvdev0of1,metaslab44of116...12.2Gcompleted(60MB/s)estimatedtimeremaining:0hr00min00secNoleaks(blocksummatchesspacemapsexactly)bpcount:956750gangedcount:0bplogical:43512090624avg:45479bpphysical:11620376064avg:12145compression:3.74bpallocated:13143715840avg:13737compression:3.31bpdeduped:0ref>1:0deduplication:1.00SPAallocated:13143715840used:1.32%additional,non-pointerbpsoftype0:123043Dittoedblocksonsamevdev:62618

Odiretórionãocontémnenhumdadoimportante,entãoeuficariabemsepudessedeletá-loechegaraoestado"limpo".

Uma solução que vem à mente é criar um novo pool do ZFS, copiar todos os dados saudáveis e excluir o antigo. Mas isso parece muito perigoso. E se o sistema trava e meu servidor cai?

Você consegue pensar em uma maneira de me livrar do diretório corrompido sem muita interrupção?

    
por panta82 18.12.2016 / 14:04

1 resposta

3

A directory on my FreeBSD 10.2 server somehow got hopelessly corrupted (wasn't ZFS supposed to prevent that?)

O ZFS só detecta erros dos discos, não da memória (o ECC é responsável aqui) ou de seus aplicativos (porque não sabe se você deseja gravar lixo em seus arquivos ou não).

Além disso, com apenas um único disco vdev fazendo backup de seu pool, mesmo se forem encontrados erros, eles não poderão ser reparados. Adicione um segundo disco para ativar isso, caso contrário, você teria que excluir os arquivos afetados e restaurá-los a partir do backup.

One solution that comes to mind is to create a new ZFS pool, copy all the healthy data over, then delete the old one. But that feels very dangerous. What if system hangs and my server goes down?

Em seguida, o seu servidor provavelmente será desativado, reiniciado e continuará sem erros, mostrará os mesmos erros ou obterá alguns novos erros. Ninguém realmente sabe, por isso aconselho a focar em como remover o erro permanentemente:

Faça backup dos seus dados (como você já deveria ter feito, porque mesmo o ZFS pode matar seus dados com erros ou erros), reinicialize o servidor, verifique os logs em busca de algo suspeito. Faça isso em um momento em que você pode pagar o tempo de inatividade. Se você não puder pagar o tempo de inatividade, você deve ter pelo menos outra máquina que possa assumir o controle, então pense nas suas necessidades e estratégia. Se você encontrar algo parecido com um bug, tente reproduzi-lo em uma segunda máquina (use zfs send/recv para copiar o conjunto).

Can you think of a way I can get rid of the corrupted directory without too much disruption?

Use zfs send para copiar o sistema de arquivos ZFS que contém esse diretório (pior caso: o sistema de arquivos raiz também conhecido como todo o conjunto; melhor caso: apenas este diretório) e zfs recv canalizado (ou canalizado por ssh ou netcat ) para copiar um instantâneo atual para outra máquina ou mídia de backup, exclua o diretório na máquina antiga como faria normalmente e preencha-o novamente a partir de um backup válido ou de seus aplicativos (ou seja, reinstale na maioria dos casos) .

Se algo der errado ou você quiser investigar mais tarde, terá o instantâneo copiado que contém todos os dados, instantâneos e metadados desse momento.

    
por 21.12.2016 / 10:33