Η εντολή dd
αποτελεί μια βασική εντολή που την βρίσκεις σε κάθε διανομή. Η εντολή αυτή σε low level επίπεδο (δηλαδή σε επίπεδο τομών και τροχιάς) μεταφέρει δεδομένα.
Few φωνίεντα about δίσκους
Σε απλά λόγια σκευτείτε τον δίσκο σαν μια πίτσα. Όταν κόβεις την πίτσα διαμετρικά σκέψου ότι κάνεις τους κάνεις έναν τομέα (sector) στον δίσκο σου.
Αν κόψουμε όμως την πίτσα μας σε ομόκεντρους κύκλους κάνουμε τροχιές σαν και τις τροχιές ενός κλασικού δίσκου βινυλίου.
Τώρα φανταστείτε ότι κόψαμε την πίτσα μας και σε sector αλλά και διαμετρικά σε τομείς.
Κάπως έτσι είναι ο κλασικός δίσκος:
Τι κάνει το dd;
Φανταστείτε τώρα ότι η μία πίτσα είναι πάνω σε 2 ταψιά κομμένη όπως η παραπάνω και το dd είναι να μεταφέρει την πίτσα κομμάτι - κομμάτι από το 1 ταψί στο άλλο. Αν τα κομμάτια είναι περισσότερα θα μεταφέρει περισσότερα κομμάτια αν είναι λιγότερα θα μεταφέρει λιγότερα.
Αν τώρα το πάμε σε δίσκους το dd μεταφέρει τυφλά από τον 1 δίσκο στο άλλο τα εκάστοτε κομμάτια, άρα αν ένας δίσκος είναι μεγαλύτερος χάνεις την χωριτικότητα. Όμως στιον αντιποδα μεταφέρεις δεδομένα ταχύτερα.
Ακόμα αν δεν είσαι προσεκτικός στην μεταφορά χάνεις δεδομένα πχ φανταστείτε πως και τα 2 ταψιά έχουν πίτσες αλλά η μια είναι η απλή και η άλλη είναι η special. Αν μεταφέρεις ένα κομμάτι απο την απλή στην special μαγικά χάνεις ένα κομμάτι special.
Αν σκευτείς ότι στην special pizza έχεις αποθηκευμένη όλη την σειρά macross που την απέκτησες με τόσο κόπο και ιδρώτα στο Kazaa με dial up connection πριν από κάτι χρόνια δεν θες να το χάσεις.
To τελετουργικό
Προσωπικά για να κάνω mitigate όποια κακώς κείμενα του dd σκεύτηκα ένα τελετουργικό.
Κατ αρχάς ανοίγω ένα screen
session:
screen
Μετά αφαιρώ όλους τους εξωτερικούς δίσκους και κρατώ τους απαραίτητους και τον μοναδικό που θέλω να αρχίσω την μεταφορά.
Με την χρήση της εντολής
fdisk -l
Βλέπω τις διαφορές. Και είναι πριν να τοποθετήσετε δίσκο να κάνετε ένα fdisk -l
και ένα μετά την τοποθέτηση. Πλέον μπορείτε να συγκρίνετε τις διαφορές στην έξοδο της εντολής.
Όταν εντοπίσω τον δίσκο ορίζω την τιμή σε μια μεταβλητή (ναι το bash υποστηρίζει μεταβλητές) πχ. ο εξωτερικός μου δίσκος είναι ο /dev/sdh
INDISK=/dev/sdh
Πλέον μπορώ να βάλω και τον δεύτερο μου δίσκο και με fdisk -l
να δω την αλλαγή μπορείτε να τον βάλετε - βγάλετε (με το σωστό unmount) για να βλέπετε διαφορές στο fdisk. Υποθέτω πως ο δίσκος είναι ο /dev/sdf
. Αυτόν τον δίσκο τον ορίζω σε μια άλλη μεταβλητή:
OUTDISK=/dev/sdf
Μετά για να βεβαιωθώ εκτυπώνω και τις 2 μεταβλητές:
echo $INDISK" >>>> "$OUTDISK
Και τρέχω τo dd
:
dd -if=$INDISK -of=$OUTDISK
Mετά πατάς ctrl
+a
+d
Αν ο δίσκος είναι μεγαλύτερος sto OUTDISK
από αυτόν που είναι στο INDISK
, ΠΡΙΝ τρέξεις την εντολή dd
ανοίγεις gparted και στον δίσκο που όρισες στο $OUTDISK
κάνεις ένα partition όσο είναι ο δίσκος. Μετά μπορείς να επεκτείνεις ένα partition.
Σκεπτικό behind it
H ιδέα είναι να κάνω βήματα αργά - αργά και να ορίζω βήματα μου μικραίνουν τα σφάλματα απο την λάθος τέλεση του dd
. Mε το screen
αποφεύγω interruptions από την διακοπή αν καταλάθος κλείσω το τερματικό. Και αυτό γιατί μπορεί μια μεταφορά να πάρει έως και 4h για 500G και οι 2 sata δίσκοι μαγνητικοί.
Ακόμα συνδέω τους δίσκους 1-1 ώστε αν και οι 2 δίσκοι είναι ίδους vendor ίδιας χωρητικότητας να μπορώ να τους ξεχωρίζω. Υπάρχουν ιστορίες με data loss από λάθος χρήση dd λόγο ότι ;ντάλλαξαν τιμές από την παράμετρο if
με την παράμετρο of
. Οι ιστορίες χειρότερες από το λαβύρινθο του vi.
Ελπίζω να είναι χρήσιμο.