[Resolvido] GParted - badblock - mover partição

Iniciado por cristianoriva, 07 de Fevereiro de 2012, 18:34

tópico anterior - próximo tópico

cristianoriva

Estou tentando mover uma partição no Gparted, mas não consigo devido a existirem badblocks. Recebo a seguinte mensagem:

Error while reading block at sector <numero>

Pesquisando, descobri que uma solução para o problema podem ser esses dois comandos:

sudo badblocks -sv -b 512 <dispositivo>
sudo dd if=<dispositivo> of=/dev/null bs=512 count=1 skip=<setor>


<dispositivo> = /dev/sda (no meu caso);
<setor> = setores com badblock (saída do comando sudo "badblocks").

Apesar de ter encontrado a solução, depois de muito pesquisar ainda não consegui encontrar uma explicação para o comando "dd".

sudo dd if=<dispositivo> of=/dev/null bs=512 count=1 skip=<setor>

Se o comando "dd" copia dados em vez de mover (de "if" para "of"), e se ele está jogando esses dados para null (of=/dev/null), como pode ele estar marcando os badblocks no HD?

Colar o comando no terminal é fácil. Mas não consegui entender a lógica por trás.

irtigor

Ele não está "marcando". Tá lendo um disco (if=<dispositivo>), escrevendo seu conteúdo (of=/dev/null -- dispositivo "nada"), pulando algumas partes (skip=<setor>). No contexto, tá sendo usado como teste, pra ter certeza que não sobrou nenhum setor ruim (fora da lista).

Obs: As páginas de manual sempre são uteis: man dd e man badblocks.

cristianoriva

#2
Não entendi a sua explicação, irtigor.

CitarEle não está "marcando". Tá lendo um disco (if=<dispositivo>), escrevendo seu conteúdo (of=/dev/null -- dispositivo "nada"), pulando algumas partes (skip=<setor>). No contexto, tá sendo usado como teste, pra ter certeza que não sobrou nenhum setor ruim (fora da lista).

Acontece que com bs=512 e count=1 ele está lendo somente um setor: aquele com defeito. Além disso a indicação é rodar o comando várias vezes (uma para cada bad block retornado pelo comando sudo badblocks). Se ele verifica o disco inteiro, menos os setores em skip, por que executar o comando várias vezes?

Permanece a minha dúvida de por que esses dois comandos são tão recomendados em tantos fóruns e sites.

http://askubuntu.com/questions/21101/how-do-i-fix-the-gparted-message-error-while-reading-block-at-sector-xxx

Se interessar abrir o link, a informação está na resposta 1 (marcada com um V de correto em verde).

irtigor

O bs especifica a quantidade de bytes de cada leitura/escrita e o count delimita a quantidade de blocos copiados da entrada. Simplificando o meu comentário anterior: você tá lendo o disco, mas a escrita é feita no nada.
O badblocks por outro lado, usado junto com o e2fsck, pode adicionar setores ruins no bad block inode. O que, basicamente, é uma lista que indica as partes ruins, pro sistema pular. Entretanto, a página do manual, diz claramente que nesse caso é aconselhável usar o "-c" do e2fsck, no lugar de usar o badblocks diretamente.

cristianoriva

Muito obrigado, irtigor.

Já usei esse "e2fsck -c", mas nem ele resolveu meu problema. Agora estou tentando com o smartmontools.

O fato é que o Gparted reclama de um setor específico quando vou mover a partição (409010215) e nenhum programa de diagnóstico classifica esse setor como um bad block. Sendo assim, não consigo dizer ao Gparted para ignorar esse setor.

O estranho é que, usando o comando "dd if=/dev/sda of=/dev/null", uma série de setores ruins dão erro na leitura/escrita (I/O). Mas nesse setor específico (409010215) tudo funciona bem.

Vou em busca de um modo de mandar o Gparted ignorar esse setor ou de marcá-lo como bad block manualmente. Depois que encontrar, posto aqui para compartilhar com o pessoal.

irtigor

Se você indicou ele no skip, esse é o motivo, ele não foi lido.
Se são muitos badblocks, o melhor é copiar tudo e dispensar esse hd.

cristianoriva

De fato a solução definitiva será trocar o HD: há bastantes bad blocks.

Agora, aproveitando a sua boa vontade e para encerrar esse bloco:

sudo dd if=/dev/sda of=/dev/null bs=512 count=1 skip=409010215

Se bs=512 bytes e count=1, então ele vai ler apenas 1 setor do HD. Que setor ele vai ler? A MBR?

Nesse caso, não faria diferença nenhuma o comando ter o "skip" ou não. Acontece que com skip=409010215 não ocorre erro nenhum. Mas com skip=400867080, eu obtenho erro de I/O sempre.

Isso não acontece por acaso, pois já executei várias vezes cada comando e o resultado é sempre o mesmo.

Obrigado.

irtigor

O primeiro depois do skip. Tradução livre do que está no manual:
skip=blocos pula X blocos de tamanho ibs do começo do que foi indicado como entrada.