Si parte da una usb avviabile con Linux... una qualsiasi va bene.
Anzitutto spaventato dal fatto che il comando dd non dia un indicazione di avanzamento ho usato un suo "derivato": dcfldd. Ho quindi fatto in modo di avere l'hard disk in questione già bello e vuoto, poi ho dato il comando
~ $ sudo apt-get install dcfldd
~ $ sudo dcfldd if=/dev/urandom of=/dev/sda bs=512
considerato che sda era L'UNICO hard disk. OCCHIO che se fate questa cosa da un sistema Linux funzionante o da live su un pc che ha già un suo HD, se mettete /dev/sda distruggete quello, quindi OCCHIO!
Vabene, è partito...e mi da come indicazione di avanzamento il blocco in cui sta scrivendo ed il corrispondente in MB.
Ad un certo punto però mi ha restituito un errore:
7425256 written. dcfldd:: Input/output error
evidentemente l'HD ha un problema in qualche settore. Dopo varie ricerche ho trovato che posso usare l'opzione seek=n che fa in modo di saltare i primi n blocchi e proseguire da lì in poi. Tentando di usare come n il numerello derivante dall'errore, continuava a ripetere lo stesso messaggio, quindi sono andato avanti finchè non ho trovato il primo blocco da cui è riuscito a ripartire:7428512, esattamente 256 settori dopo. Pertanto con il comando
~ $ sudo dcfldd if=/dev/urandom of=/dev/sda bs=512 seek=7428512
è ripartito ed ha terminato la scrittura fino a che non ha dato il messaggio "no space left in device".
La cosa strana è che non ho mai avuto problemi con l'hard disk... boh!
Comunque ho cercato un pò come fare per riallocare i settori daneggiati usado alcuni settori liberi che vengono messi in più nei dischi apposta per questo. Per prima cosa ho controllato che non ci fossero settori già riallocati, quindi se ce ne sono di disponibili:
sudo smartctl -a /dev/sda |grep -i reallocated
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
5 Reallocated_Sector_Ct 0x0033 200 200 140 Pre-fail Always - 0
196 Reallocated_Event_Count 0x0032 200 200 000 Old_age Always - 0
questo ci dice che non ci sono dei settori che sono stati utilizzati per essere riallocati (gli zeri nel'ultima colonna - raw_value). Nel caso si stia utilizzando una distribuzione che non ha smartctl occorrerà installare smartmontools.
Il programma che permette di poter eseguire la riallocazione è hdparm. Questo programma è infatti in grado di leggere e scrivere un singolo settore del disco. I moderni dischi sono fatti in modo che un settore si riallochi da solo quando una operazione di scrittura su di esso fallisce. Invece se fallisce una operazione di lettura si ha solo un errore di I/O. Pertanto si può provare a forzare una riallocazione eseguendo un comando di scrittura sul settore danneggiato, proprio con hdparm.
Per sicurezza, controlliamo che il settore sia effettivamente danneggiato:
~$ sudo hdparm --read-sector 74528256 /dev/sda
/dev/sda: Input/output error
dovendone controlalre 256 uno scriptino può essere utile. Creo un file con il seguente testo
#!/bin/bash
sector=74528256
while [ $sector -le 74528512 ]; do
sudo hdparm --read-sector $sector /dev/sda |grep succeded > /dev/null
status=$?
echo $sector $status
let sector=sector+1
done
gli do i permessi di esecuzione e lo eseguo
~ $ sudo chmod +X script
~ $ ./script
In pratica eseguo il comando per tutti i settori che credo danneggiati e scrivo a video il settore controllato con il corrispondente status, ovvero 1 se ho avuto successo, 0 altrimenti così posso vedere chi mi da il problema. Se effettivamente ottengo un errore in uno o più di quei settori allora procedo con lo script (analogo) per la riallocazione
#!/bin/bash
sector=74528256
while [ $sector -le 74528512 ]; do
sudo hdparm --write-sector $sector --yes-i-know-what-i-am-doing /dev/sda
echo $sector written
let sector=sector+1
done
a questo punto provando di nuovo il comando
~ $ sudo dcfldd if=/dev/urandom of=/dev/sda bs=512 seek=7428256
non ho più l'errore e va avanti tranquillo, nonostante, e devo ancora capire il perchè, non risultino settori riallocati se eseguo di nuovo il controllo
~ $ sudo smartctl -a /dev/sda |grep -i reallocated
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
5 Reallocated_Sector_Ct 0x0033 200 200 140 Pre-fail Always - 0
196 Reallocated_Event_Count 0x0032 200 200 000 Old_age Always - 0
mah! comunque il disco è in salute e bello cancellato e queso mi basta. Tanto per verificare l'avvenuto ripristino ho anche provato a riazzerarlo partendo dal principio
~ $ sudo dcfldd if=/dev/zero of=/dev/sda bs=512
ed è filato tutto liscio.