For a short ENGLISH version (very very short) scroll to bottom of the article.
Attenzione: prima di tutto questa non è una procedura standard, è solo il resoconto di come IO abbia risolto questo problema sul MIO MacBook – non mi dilungo in spiegazioni sui comandi e concetti dei sistemi unix-like, se capite quello che c’è scritto bene, altrimenti lasciate un commento e proverò a darvi chiarimenti, oppure rivolgetevi a qualcuno con conoscenze adeguate. È fondamentale capire che non mi assumo alcuna responsabilità se provando questa procedura perdete tutti i dati, vi si rompe il mac, o simili – fatelo a vostro rischio e pericolo.
Ieri sera il MAC si era freezato – il motivo è presto detto: tempo fa mi è scivolato (una ventina di centimetri) mentre il drive stava scrivendo, immagino che si sia rovinato parzialmente il disco, o il filesystem. Il giorno dopo riavviando il sistema andava lentissimo e il comando “sudo dmesg” segnalava diversi “Disk I/O error”. Questo errore in realtà segnala sia problemi hardware (per i quali il drive va sostituito) sia problemi software – ad esempio inconsistenze nel filesystem. Il mio era il secondo caso (è per questo che non sono sicurissimo che il drive si sia danneggiato, potrebbe aver “rimappato” i settori danneggiati su quelli di riserva) – ed ho risolto avviando il mac in modalità singolo utente (bisogna premere cmd+s all’accensione) e lanciando il comando “fsck -fy”, che in teoria è prassi standard per risolvere certi problemi (e in linea di massima non necessita di un backup) – ma il problema che mi si era presentato stamattina era ben diverso, e non risolvibile in questo modo.
Il comando fsck, sta per “filesystem check” ed è in grado di riparare i danni al filesystem, o comunque di renderlo funzionante (al costo di perdere alcuni dati) – per questo consiglio un backup di tutto ciò che è leggibile, e possibilmente anche dell’intera immagine del disco, prima di procedere. Per fare un backup basta inserire un drive esterno (usb), montarlo, e copiarci dentro tutti i dati.
Nel dettaglio, prima di inserire il drive esterno, lanciate questo comando e guardate l’output.
# ls /dev/disk*
/dev/disk0 /dev/disk0s1 /dev/disk0s2
Ora inseriamo il drive e lanciamo di nuovo il comando
# ls /dev/disk*
/dev/disk0 /dev/disk0s1 /dev/disk0s2 /dev/disk1 /dev/disk1s1
Ecco, in questo esempio il drive esterno ha preso il nome di “disk1″ e la sua unica partizione (nel mio caso NTFS) si chiama “disk1s1″. A questo punto, dobbiamo creare una cartella dove “montare” il drive, e fare il mount. Ri-montiamo il root in modalità read-write, con il comando “mount -uw /”, creiamo il mountpoint “mkdir /mnt” e finalmente facciamo il mount (nel caso di ntfs, di avere il supporto ntfs-3g, e del drive disk1 con unica partizione) : “mount -t ntfs-3g /dev/disk1s1 /mnt”.
A questo punto potreste avere qualche warning, o errore di timeout (io ho avuto quest’ultimo) ma facendo “ls /mnt/” possiamo controllare che il drive sia montato – vedendo se il terminale ci elenca i contenuti. A questo punto ho creato un archivio “tar” contenente tutta la mia directory utente, con il comando
tar -cvf /mnt/backup.tar /Users/qualsiasi
Dove sostituirete il vostro username al mio, ovviamente. Se uno volesse proprio essere sicuro, potrebbe anche farsi una copia byte per byte del drive sul mac, con
dd if=/dev/disk0s2 of=/mnt/mac_hd.img
Vi invito a leggere la manpage di dd per conoscere le opzioni aggiuntive da dare (bs count etc…) – Ma soprattutto fate attenzione che il file “mac_hd.img” non esista già sul vostro drive (verrà sovrascritto senza chiedere conferma).
Attenzione: dev’essere vostra cura fare il backup di tutti i file necessari, nel mio caso mi importava solo della directory utente, ma voi potreste avere file importanti anche in altri punti del filesystem. Io per i dati più importanti uso anche un servizio esterno, gratuito, e multipiattaforma (OSX, Linux, Windows, Android..) che è Dropbox, questo è il mio “referral link”.
Completati questi passaggi possiamo tentare questo comando, che è un po’ l’ultimo tentativo prima di dover formattare tutto (o addirittura cambiare drive) e ripristinare i propri dati dal backup.
Riavviamo di nuovo in “single user” (con cmd+s all’accensione) e lanciamo questo comando:
# fsck_hfs -pfry /dev/disk0s2
Ricordatevi che il risultato potrebbe portarvi in qualunque situazione, da un mac completamente funzionante (come quello dal quale sto scrivendo quest’articolo) ad un limbo con il drive vuoto – potrebbe perdervi tutti i dati non backuppati, e per sfregio potrebbe anche autodistruggere il macbook. A vostro rischio e pericolo, divertente il fatto che le opzioni contengano proprio “fry” a ribadire la pericolosità. Se siete fortunati, dopo un bel po’ di lavoro vi dirà che il filesystem è ok. Se siete sfortunati come lo sono stato (parzialmente) io, vi dirà che dopo tre tentativi non è riuscito a correggere l’errore. In questo caso lanciate il comando “fsck -fy” una o due volte, finchè non vi dice che è tutto ok. Se continua a darvi errore – mi sa che dovete buttare il drive e/o formattarlo e reinstallare tutto. Almeno ci abbiamo provato.
Attenzione: prima di tutto questa non è una procedura standard, è solo il resoconto di come IO abbia risolto questo problema sul MIO MacBook – non mi dilungo in spiegazioni sui comandi e concetti dei sistemi unix-like, se capite quello che c’è scritto bene, altrimenti lasciate un commento e proverò a darvi chiarimenti. È fondamentale capire che non mi assumo alcuna responsabilità se provando questa procedura perdete tutti i dati, vi si rompe il mac, o simili – fatelo a vostro rischio e pericolo.
Warning: this is NOT a standard procedure – it’s the way I have fixed MY macbook – i’m not here to explain unix-like commands and concepts, I you understand what’s written good – if not you could leave a comment or ask someone who knows. I’m not taking any responsibility over any damage this procedure could cause to your mac, ranging from data loss to global termonuclear war (and all things in between).
This morning I had a “Disk I/O Error” in the dmesg, and I tried the standard procedure of booting single user and running fsck, but i got an “Invalid node structure” error. So I did a backup on a USB external drive of my user folder. To do this backup i ran (at command line) “ls /dev/disk*” before and after connecting the drive – so I could identify what was his name in the system. In the examples above you could see my drive was “disk1s1″ (this means disk one – partition one, my usb drive has only one partition). I had to make root filesystem writeable, with “mount -uw /” and to create a mountpoint “mkdir /mnt” – after this I mounted the drive with “mount -t ntfs-3g /dev/disk1s1 /mnt” (pay attention, this is for a NTFS drive on a MAC with macfuse+ntfs-3g installed, your setup may be different).
After mounting the drive, I did a “tar -cvf /mnt/backup.tar /Users/my_user” to backup all my stuff. If I had enough space (and enough time) I could have done a “dd if=/dev/disk0s2 /mnt/disk.img” (check on the drive if disk.img already exists, this command doesn’t ask for confirmations to overwrite).
Warning: backup ALL you need. I kept all my files in my user directory, but it’s up to you to see where your data is and backup it properly. For important files I use an external service available on OSX, Linux, Windows and Android, Dropbox: this is my referral link.
After this i did a (be careful, this command will likely loose some data, or ALL data, on the disk) “fsck_hfc -pfry /dev/disk0s2″ and waited to finish (takes long time). It reported it cannot fix the drive in 3 attempts, so I ran “fsck -fy” after that (i needed to run two times) to finally read on the screen that the filesystem was successfully fixed. If yours keeps saying it’s not fixed chances are that you’re gonna have to change the hard drive, or at least need to do a full format and reinstallation. At least we tried.