Recuperando um sistema de arquivos ext4 com diário corrompido

9

Eu tenho um disco rígido que parece ter desenvolvido algum tipo de problema de hardware no diário. Isso impede que a unidade seja carregada. A execução de mount -r -t ext4 /dev/sda5 /mnt/rootresultados no seguinte kernel spew:

[ 1420.671055] ata1.00: exception Emask 0x0 SAct 0x1000000 SErr 0x0 action 0x0
[ 1420.673862] ata1.00: irq_stat 0x40000008
[ 1420.676600] ata1.00: failed command: READ FPDMA QUEUED
[ 1420.679326] ata1.00: cmd 60/40:c0:a8:9d:0a/00:00:08:00:00/40 tag 24 ncq 32768 in
[ 1420.679326]          res 41/40:40:e1:9d:0a/00:00:08:00:00/00 Emask 0x409 (media error) <F>
[ 1420.685014] ata1.00: status: { DRDY ERR }
[ 1420.687858] ata1.00: error: { UNC }
[ 1420.761064] ata1.00: configured for UDMA/133
[ 1420.763863] sd 0:0:0:0: >[sda] Unhandled sense code
[ 1420.766653] sd 0:0:0:0: >[sda]  
[ 1420.769364] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[ 1420.772104] sd 0:0:0:0: >[sda]  
[ 1420.774780] Sense Key : Medium Error [current] [descriptor]
[ 1420.777491] Descriptor sense data with sense descriptors (in hex):
[ 1420.780249]         72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00 
[ 1420.783175]         08 0a 9d e1 
[ 1420.785972] sd 0:0:0:0: >[sda]  
[ 1420.788730] Add. Sense: Unrecovered read error - auto reallocate failed
[ 1420.791545] sd 0:0:0:0: >[sda] CDB: 
[ 1420.794331] Read(10): 28 00 08 0a 9d a8 00 00 40 00
[ 1420.797242] end_request: I/O error, dev sda, sector 134913505
[ 1420.800072] ata1: EH complete
[ 1420.800077] JBD2: Failed to read block at offset 2748
[ 1420.812529] JBD2: recovery failed
[ 1420.815275] EXT4-fs (sda5): error loading journal

Eu mal entendo o que isso significa, mas com certeza parece um problema de hardware que impede o carregamento do diário. Existe alguma maneira de contornar isso? O diário, por exemplo, pode ser realocado para um deslocamento diferente enquanto deixa o resto da unidade intacta? Não tenho intenção de continuar usando a unidade; Eu só quero montá-lo para que eu possa copiar alguns arquivos cruciais.

JSB ձոգչ
fonte
Duas coisas: desconecte e reconecte os cabos. Se pode até se livrar temporariamente do problema de hardware. Se isso acontecer, obtenha novos cabos. Caso contrário, tente também o (s) disco (s) em outro computador com cabos diferentes.
0xC0000022L
Você tentou fscko sistema de arquivos?
psusi
Hoje tive um problema semelhante em que de alguma forma consegui corromper o diário ao desbloquear minha partição ext4 criptografada. Eu só conseguia montar como somente leitura. Consegui corrigi-lo executando a rotina 'Check' na partição do GParted. A rotina 'Verificar' encontrou os problemas com o diário e os corrigiu automaticamente.
Navnav

Respostas:

8

Para montá-lo somente leitura, sem repetir o diário para que você possa acessar seus arquivos (você provavelmente perderá algumas alterações que ainda não foram confirmadas no fs normal):

mount -o ro,noload ...

Ronald
fonte
7

Dê uma olhada na saída de smartctl -a /dev/sda. Se não houver um problema de cabo, o disco pode estar morrendo. Se você não possui um backup recente, tente copiar o conteúdo do dispositivo de bloco (sem montagem) usando dd_rescue ou dd com as respectivas opções.

Depois disso, você pode tentar hdparm --write-sector(sempre engraçado essas opções "MUITO PERIGOSAS" ...).

Outra opção é criar um dispositivo DM que ignora os setores defeituosos. Isso não recupera o conteúdo, é claro. Você deve converter o deslocamento sda (134913505) em um deslocamento sda5 (encontre o número do primeiro setor de sda5 e subtraia-o). Vamos supor que o deslocamento sda5 seja 12345. Você cria um dispositivo de bloco cujo setor 12345 não está mapeado para sda5, mas em outro lugar (por exemplo, dispositivo de loop). A definição do dispositivo (para dmsetup create) fica assim:

0 12345 linear /dev/sda5 0
12345 1 linear /dev/loop0 0
12346 99987653 /dev/sda5 12345

# format:
# logical_start_sector num_sectors linear destination_device start_sector

Você não terá tanta sorte que existe apenas um setor defeituoso. Você pode mapear quantas quiser (resultando no dispositivo DM fornecendo zeros para esses setores, mas sendo graváveis), mas calcular as compensações no loop0 pode se tornar divertido. Outra opção seria usar um dispositivo virtual do mesmo tamanho para remapear e usar o thin provisioning ou uma captura instantânea (com tamanho de bloco pequeno, 1 setor, por exemplo) de um dispositivo de destino zero.

Editar 1

O dispositivo de loop não deve apontar para um arquivo no mesmo disco (sda), é claro.

Hauke ​​Laging
fonte
Muito bom ponto. --write-sectorestá longe de ser "perigoso". De fato, essa é realmente a opção ideal a ser usada sempre que determinados setores únicos corrompidos o impedirem de obter uma imagem contínua do setor bruto ( ddseria resgatada com o "erro de E / S do dispositivo"; alguns discos rígidos exigirão até o ciclo de energia da máquina ( !) para ser reconhecido pelo sistema operacional novamente). No entanto, você deve saber sobre scripts de shell se desejar usar --write-sectorpara intervalos de setor .
Syntaxerror 4/12/14
0

Você pode inicializar no modo de recuperação, no qual o FS será montado como somente leitura, e copiar suas coisas.

Schaiba
fonte
Estou montando somente leitura. Corrigi a linha de comando mostrada acima para tornar isso mais claro.
JSB #
E você pode acessar a unidade?
schaiba
Não. Tentar montar o RO da unidade (ou em R / W, não faz diferença) resulta no erro mostrado acima.
JSB #
Em seguida, a sugestão com a troca de cabo pode ser útil. E em relação à sua pergunta, o diário não pode ser movido da maneira que você deseja.
schaiba