Προς το περιεχόμενο

Backup σε επανεγγράψιμο DVD / Blu-Ray


imitheos

Προτεινόμενες αναρτήσεις

Δεν ήθελα να ανοίξω ολόκληρο νήμα μόνο για ένα tip αλλά δεν ξέρω που αλλού να το γράψω. Σκέφτηκα να το γράψω στο νήμα του system tar μια και έχει σχέση με backup αλλά είναι εντελώς άσχετο με το πρόγραμμα του tritona και με το tar. Στο νήμα της κονσόλας υπάρχουν πολλά tips αλλά και πάλι δεν έχει καμμία σχέση με bash και shells.

 

Όπως γίνεται σε αυτές τις περιπτώσεις, ακολουθεί 5 καντάρια κατεβατό με περιγραφή του προβλήματος και μία γραμμή που είναι η λύση :). Τα έβαλα σε spoilers ώστε όποιος έχει το ίδιο πρόβλημα να πάει κατευθείαν στη λύση χωρίς να διαβάζει το βιβλίο μου.

 

[intro]

 

 

Εκτός από το κλασικό full backup σε σκληρό, χρησιμοποιώ και οπτικά μέσα μίας εγγραφής όπως dvd+r, bd-r. Υπάρχουν όμως δεδομένα που δεν με βολεύει να χρησιμοποιήσω dvd+r γιατί πχ μπορεί ένα μέρος τους να αλλάζει συχνά οπότε να πρέπει να καίω συνέχεια νέα δισκάκια και να περιμένω να γραφούν nGB όταν άλλαξαν μόλις kMB.

 

Για τέτοια δεδομένα, βολεύει πολύ το backup σε επανεγγράψιμους οπτικούς δίσκους. Κάτι που δεν είναι ευρέως γνωστό και δεν πολύ-χρησιμοποιείται είναι ότι τα BD-RE, DVD+RW (και τα DVD-RW αλλά υπό συνθήκες οπότε δεν βολεύουν άσε που έχουν σκατά ποιότητα) είναι random-writable. Ενώ τα DVD-RAM λανσάρονται ως random-writable, στα υπόλοιπα δεν το αναφέρει κανείς.

 

Δηλαδή μπορείς να γράψεις σε οποιοδήποτε τομέα τους όπως ακριβώς γίνεται στις δισκέτες, σκληρούς δίσκους, κτλ. Έτσι μπορείς να κάνεις mkfs οποιοδήποτε filesystem (αν και τα extX, XFS, κτλ βάζουν πολύ φόρτο στο δισκάκι και καλό είναι να χρησιμοποιείται το UDF που έχει φτιαχτεί για αυτή τη δουλειά), να το κάνεις mount και να γράψεις ό,τι θέλεις σαν να είναι κανονικός σκληρός.

 

Επειδή η ταχύτητα δεν είναι τόσο μεγάλη όσο όταν γράφεις συνεχόμενους τομείς με το cdrecord, αυτό που έκανα εγώ ήταν την πρώτη φορά να δημιουργώ με την truncate ένα αρχείο με το μέγεθος του οπτικού δίσκου, να το κάνω luksFormat ώστε το backup να είναι κρυπτογραφημένο, και μετά mkudffs, mount -o loop, αντιγραφή δεδομένων, και τέλος εγγραφή με το cdrecord.

 

Από εκεί και πέρα, το έκανα όποτε ήθελα mount και έκανα rsync τις αλλαγές που δεν με πείραζε να γραφούν και λίγο πιο αργά γιατί δεν ήταν πολλές.

 

 

 

[Πρόβλημα]

 

 

Όταν λοιπόν πήρα ένα blu-ray writer, το πρώτο πράγμα που έκανα ήταν να αγοράσω επανεγγράψιμους δίσκους bd-re για να κάνω το ίδιο πράγμα. Το μόνο κακό φυσικά με το DVD+RW ήταν ότι πολλές φορές δεν έφταναν τα 4GB οπότε τώρα με 25GB ποιος στη χάρη μου.

 

Έλα που όμως δεν έπαιζε με τίποτα. Το cdrecord και λοιπά προγράμματα έγγραφαν κανονικά αλλά όταν έκανα mount, πάντα γινόταν read-only mount. Δοκίμασα ένα κάρο ιστορίες και δεν έπαιζε τίποτα.

 

Γενικά δεν υπάρχουν πολλά άρθρα για blu-ray στο google και ειδικά για επανεγγράψιμους δίσκους αλλά όλα τα άρθρα που έβρισκα έλεγαν ότι το κάνεις mount και γράφεις. Μάλιστα πολλοί οδηγοί έλεγαν τι παιδεύεσαι με cdrecord και δεν κάνεις κατευθείαν dd.

 

Δοκίμασα και την λύση του packet writing που πρότειναν κάποιοι οδηγοί μήπως και φταίει αυτό αν και ποτέ δεν το χρησιμοποίησα σε DVD+RW και πάντα έπαιζε τζάμι. Τίποτα και πάλι. Σκέφτηκα ότι κάτι φταίει με την συσκευή μου ή το firmware και δεν υποστηρίζει random εγγραφή (αν και ήξερα ότι το πρότυπο ορίζει υποχρεωτική την υποστήριξη random εγγραφών). Δεν είχα και DVD+RW γμτ να δοκιμάσω αν παίζει με εκείνο.

 

Παράτησα για ένα διάστημα το ψάξιμο γιατί διάβασα ότι στον 4.2 πυρήνα έσπασε ένα ioctl και πολλά πράγματα (όπως το να γράφεις σαν χρήστης) δεν έπαιζαν σωστά οπότε σκέφτηκα αυτό θα φταίει.

 

Με τα πολλά λοιπόν και επειδή το dd έβγαζε μήνυμα "Μόνο-αναγνώσιμο σύστημα αρχείων", έψαξα να δω στον πυρήνα που στο καλό υπάρχει το μήνυμα λάθους EROFS. Όπως ήταν αναμενόμενο, υπάρχει σε όλα τα filesystems και στους οδηγούς ata / scsi. Άνοιξα λοιπόν το αρχείο drivers/cdrom/cdrom.c που διέπει τους οπτικούς δίσκους ανεξάρτητα αν το bus είναι ata ή scsi για να δω τι στο καλό γίνεται.

 

Στην συνάρτηση cdrom_open υπάρχει ο παρακάτω κώδικας:

		if (mode & FMODE_WRITE) {
			ret = -EROFS;
			if (cdrom_open_write(cdi))
				goto err_release;
			ret = 0;
		}
Δηλαδή θέτει τιμή EROFS στην ret για παν ενδεχόμενο και μετά καλεί την συνάρτηση cdrom_open_write. Αν επιτύχει η συνάρτηση και ανοίξει σωστά για εγγραφή, τότε θέτει στην ret τιμή 0.

 

Οπότε έπρεπε να δω τι κάνει η συνάρτηση cdrom_open_write. Επειδή ο οδηγός cdrom εκτελείται για όλους τους οπτικούς δίσκους, η συνάρτηση αυτή ελέγχει πολλές περιπτώσεις όπως μαγνητο-οπτικά, dvd-ram, κτλ. Το τμήμα που τρέχει στη δική μου περίπτωση είναι το παρακάτω:

		(void) cdrom_is_random_writable(cdi, &ram_write);

	else if (!cdrom_is_dvd_rw(cdi))
		ret = 0;
Αφού ελεγχθεί ότι το μέσο είναι random writable και ελεγχθούν οι δυνατότητες του drive ότι υποστηρίζει random εγγραφές, πηγαίνουμε στο τελευταίο else που ελέγχει αν έχουμε επανεγγράψιμο dvd.

 

Βήμα ταχύ προς την συνάρτηση cdrom_is_dvd_rw όπου βλέπουμε το εξής:

	switch (cdi->mmc3_profile) {
	case 0x12:	/* DVD-RAM	*/
	case 0x1A:	/* DVD+RW	*/
		return 0;
	default:
		return 1;
	}
Ελέγχεται το mmc προφίλ του μέσου και επιστρέφεται 0 δηλαδή επιτρέπεται η εγγραφή μόνο αν έχουμε DVD-RAM και DVD+RW. Fuck. Πάντα σε debugging χρειάζεται να ακολουθήσεις μια αλυσίδα 36 συναρτήσεων και στο τέλος καταλήγεις σε κάτι εντελώς απλό. Μάλλον μόνο εγώ χρησιμοποιώ αυτό το feature του random writing :P. Σε συνδυασμό με το ότι blu-ray δεν έπιασε και τόσο πολύ, μάλλον κανείς δεν σκέφτηκε να προσθέσει και το προφίλ του bd-re εδώ.

 

Ίσως βέβαια να υπάρχει πιο δόκιμη λύση με την δημιουργία μιας συνάρτησης που να ελέγχει αποκλειστικά για blu-ray όπως γίνεται στις άλλες περιπτώσεις αλλά και αυτό μου έπαιξε τέλεια.

 

 

 

[Λύση]

--- drivers/cdrom/cdrom.c.orig	2015-09-24 11:49:37.673401889 +0300
+++ drivers/cdrom/cdrom.c	2015-09-24 10:45:13.800657895 +0300
@@ -885,6 +885,7 @@
 	switch (cdi->mmc3_profile) {
 	case 0x12:	/* DVD-RAM	*/
 	case 0x1A:	/* DVD+RW	*/
+	case 0x43:	/* BD-RE	*/
 		return 0;
 	default:
 		return 1;
Προσθέτουμε την τιμή 0x43 που είναι το προφίλ του BD-RE και όλα λειτουργούν τέλεια. Αν κάποιος λοιπόν κάνει backup σε BD-RE, μπορεί να κάνει την παραπάνω αλλαγή και να κάνει compile τον πυρήνα.
  • Like 4
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...