Τι είναι to dd; - Τελετουργικό τελέσεως dd

Η εντολή 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.

Ελπίζω να είναι χρήσιμο.

7 «Μου αρέσει»

Ωραίος οδηγός, κάπου θα φανεί χρήσιμος.

Αλλά νομίζω θα πρέπει να αρχίσουμε να αποβάλουμε την ιδέα της πίτσας για τα αποθηκευτικά μέσα. Εδώ και δεν ξέρω και εγώ πόσα χρόνια έχουμε LBA (logical block addressing) στα συμβατικά μέσα αποθήκευσης. Η ιδέα ενός ξενοδοχείου με αριθμημένα δωμάτια είναι κοντύτερα στην πραγματικότητα.

Και λέω συμβατικά μέσα γιατί τεχνολογίες όπως το Optane και τα transactional memories είναι επι των πυλών

Άρα θα μας δώσεις alternate παράδειγμα Asfodelus-sensei ;

Αλλά η πλήρης περιγραφή του μέλλοντος ανήκει στην Ε.Φ. Όλη η αρχιτεκτονική των λειτουργικών συστημάτων βασίζετε στην ιδέα του εξωτερικού μέσου αποθήκευσης, το οποίο είναι ένα block device και που είναι χαμηλά στην ιεραρχία της μνήμης και έχει κάποιο σημαντικό lattency. Αυτό είναι τόσο βαθιά χωμένο στην αρχιτεκτονική που δύσκολα μπορείς να το δεις ή να φανταστείς κάτι διαφορετικό.

Σήμερα το Optane είναι εξωφρενικά ακριβό. Όπως ήταν τα SSD αλλά σύντομα δε θα είναι. Μάλλον, θα έχω κάτι σαν το Optane σε μεγάλες ποσότητες σε ένα προσεχές μέλλον και το SSD θα πάρει τη θέση που έχει σήμερα το HDD. Δε θα εξαφανιστούν, όπως δεν έχει εξαφανιστεί σήμερα η μαγνητική ταινία.

Δείτε ακόμα

1 «Μου αρέσει»

Μόνο αν το δούμε απο σκοπία του επαγγελματία:

  1. Αν είναι one-off job το να βάλεις script παίρνει χρόνο
  2. ddi ίσως να έχει έξτρα εξαρτήσεις άρα αν θες μινιμαλίστικά πράγματα ίσως και να μην κάνει.

@pc_magas η dd δεν εχει απολυτως τιποτα απο εξτρα εξαρτησεις. ειναι οτι πιο γυμνο υπαρχει. και υπαρχει σε ολες τις διανομες… ΟΛΕΣ ΟΜΩΣ!

dd -if=$INDISK -of=$OUTDISK

@Asfodelus αυτο εδω αποπανω, χρειαζεται τις παυλες? εχουν καποιο σκοπο? εγω την εντολη αυτη την τρεχω σχεδον καθε 20 μερες με μηνα, που παιρνω backup ολοκληρου σκληρου με κλωνοποιηση, και την τρεχω χωρις τις παυλες στα if/of. για την ακριβεια την τρεχω ετσι:

dd if=/dev/sda | dd of=/mnt/sdb/OSclone

εχω προσεξει οτι με το « | » (pipe) αναμεσα στα if/of κανει λιγοτερο χρονο να ολοκληρωθει η κλωνοποιηση. και ναι οντως διαβασες sda. κανω κλωνοποιηση του σκληρου του ιδιου του λειτουργικου, την ωρα που τρεχει

ΑΛΛΑ για να το κανεις σε ενεργο λειτουργικο, πρεπει να εχεις διανομη που δεν εχει αυτοματισμους (αυτοματα updates, cron jobs, κλπ), να κλεισεις το swap (αν εχεις) και να ξερεις πολυ καλα τι κανεις, αλλλιως θα σε φαει τη γατα

στο debian το εχω κανει απειρες φορες και ποτε δεν εχει χασει τιποτα. απλα μετα σηκωνω τον κλωνο στον εξομοιωτη, βεβαιωνομαι οτι μπουταρει σωστα και τον αφηνω στην ακρη. στο LMDE ακομα δεν το εχω επιχειρησει

Είναι γραμμένο σε Rust. Από αυτο μπορείς να συνάγεις είναι πως είναι δύσκολο να έχει εξαρτήσεις. Αλλά δεν είναι εκεί το θέμα. Το μυστικό είναι να έχεις στην κατοχή σου γνώση για την ύπαρξή πολλών εργαλείων και να επιλέγεις κάθε φορά το καταλληλότερο. Το ddi είναι πολύ καλό να γίνει ένα alias για την πρόσθετη ασφάλεια που παρέχει. Το απλό dd έχει τη θέση του σε αυτοματισμούς, τα εργαλεία τύπου etcher για να εγκαθιστάς διανομές, έκτος αν η διανομή έχει το δικό της εργαλείο πχ το rpi-imager θα κάνει ρυθμίσεις που κανένα από τα παραπάνω δεν μπορεί να κάνει.

Άλλες φορές είναι εξυπνότερο απλά να χρησιμοποιήσεις ατό που ξέρεις καλύτερα. Αλλά η γνώση των εναλλακτικών και σε αυτή την περίπτωση είναι χρήσιμη.