Linux tips and tricks/Masterizzazione

Wikibooks, manuali e libri di testo liberi.
Indice del libro

Esistono fondamentalmente due programmi per creare e copiare CD in Linux: cdrecord e cdrdao. Sotto molti aspetti sono del tutto equivalenti, ma il secondo è più indicato nell'incisione di CD audio a partire da tracce distinte, in quanto è possibile controllare, e soprattutto sopprimere, la pausa di due secondi tipicamente inserita fra una traccia e l'altra, e che sarebbe fastidiosa se le singole tracce sfumassero l'una nell'altra (come avviene nelle registrazioni di concerti dal vivo).

Entrambi i comandi hanno un'interfaccia a riga di comando, ma sono disponibili numerosi applicativi grafici che, secondo la classica filosofia UNIX, si limitano ad utilizzare questi due programmi, in maniera pressoché trasparente per l'utente. Fra questi, xcdroast, gcombust, gnome-toaster e molti altri.

Nelle prossime sezioni saranno illustrate alcune applicazioni elementari di cdrecord. Le stesse operazioni dovrebbero essere possibili con cdrdao, sia pure con le dovute differenze di sintassi.

Identificazione dei dispositivi[modifica]

Sia cdrecord che cdrdao sono stati sviluppati per accedere esclusivamente ai dispositivi con interfaccia SCSI, solitamente molto affidabili, ma anche costosi, e quindi raramente installati su sistemi personali.

Linux consente di emulare l'interfaccia SCSI al di sopra dell'interfaccia IDE o EIDE, normalmente utilizzata per accedere a vari tipi di unità a disco sui sistemi personali. Grazie a questa emulazione, è possibile usare cdrecord e cdrdao anche sui sistemi personali, come se fossero muniti di dispositivi SCSI.

Per individuare i dispositivi, lo standard SCSI utilizza tre numeri separati da virgola, come all'inizio della riga seguente:

2,0,0   200) 'HL-DT-ST' 'RW/DVD GCC-4521B' '1.04' Removable CD-ROM

estratta dall'output del comando cdrecord -scanbus oppure cdrdao scanbus. Dal kernel 2.5 i dispositivi ATA (detti comunemente anche IDE) possono essere indicati con la usuale notazione /dev/hdN. L'opzione scanbus di cdrecord, in questo caso, può non funzionare. Una soluzione consiste nello specificare l'opzione dev=ATAPI. Per cdrdao, invece, non risultano problemi.

Altre versioni di cdrecord e del kernel consentono di identificare i dispositivi secondo l'uso prevalente in GNU/Linux, cioè nella forma /dev/sgN, usata per riferirsi a dispositivi a carattere con interfaccia SCSI nativa o emulata. L'effettivo valore per il numero N dipende dalle situazioni, ma in un sistema con unico dispositivo per lettura e incisione questo viene di solito identificato con /dev/sg0.

È utile ricordare che, in GNU/Linux, lo stesso dispositivo fisico può essere di norma considerato un dispositivo a carattere oppure un dispositivo a blocchi. La differenza è evidenziata dal nome: le notazioni /dev/sg0 e /dev/scd0, ad esempio, identificano lo stesso dispositivo, ma la prima presuppone un accesso per caratteri, la seconda un accesso per blocchi.

Nota. L'autore di cdrecord sottolinea che il driver Linux sg, che consente di indicare un dispositivo con un nome del tipo /dev/sgN, è caratterizzato da un pessimo disegno generale. Egli stesso, però, raccomanda di provare prima questo tipo di accesso.

Se non si usa la notazione SCSI, si dovrà quindi fare attenzione a identificare il dispositivo con il nome opportuno. Recenti versioni di cdrecord accettano anche nomi come /dev/hdc o /dev/hdd, normalmente usati per accedere a dispositivi con interfaccia IDE. Per maggiore portabilità e compatibilità è comunque consigliabile usare sempre la notazione SCSI.

In conclusione, a seconda dei casi può essere più o meno complicato individuare correttamente i dispositivi, ma basta provare nei diversi modi sopra illustrati.

CD multisessione[modifica]

Normalmente ci si trova ad operare con CD monosessione, cioè CD a cui non è possibile aggiungere dati dopo la prima incisione. Infatti, alla fine di un'incisione, il Cd viene normalmente fissato (dall'inglese to fixate), nel senso che vengono registrate le informazioni necessarie a rendere leggibile il CD.

In alcuni casi si rivela però molto utile poter aggiungere dati ad un CD, sia esso un CD-R o un CD-RW, potendo nello stesso tempo accedere al contenuto del CD come se fosse un normale CD monosessione. A questo scopo lo standard ISO9660 prevede la possibilità di creare CD multisessione: quando il CD viene fissato alla fine di una sessione, vengono registrate informazioni supplementari che consentono di aggiungere nuovi dati al posto giusto in una successiva sessione. Il risultato è quindi un CD sempre leggibile, ma al quale è possibile aggiungere altri dati.

Il rovescio della medaglia è innanzitutto un certo spreco di spazio: all'inizio di ogni sessione viene registrata una sequenza di 4500 settori di zeri detta lead-in, seguita da un'altra sequenza di 150 settori di zeri detta pre-gap, mentre alla fine, dopo i dati, viene registrata una sequenza di 2250 settori di zeri detta lead-out. Solo nella prima sessione mancano il lead-in e il pre-gap, e il lead-out copre 6750 settori invece di 2250 (4500 in più).

Si vede dunque che, fra la prima e la seconda sessione, occorrono, oltre allo spazio occupato dai dati della prima sessione, 6750 + 4500 + 150 = 11400 ulteriori settori, mentre fra le sessioni successive gli ulteriori settori necessari sono 2250 + 4500 + 150 = 6900. Rispettivamente, in termini di megabyte, si tratta di circa 22Mb dopo la prima sessione e di circa 13Mb dopo le successive. Se si prevede di aggiungere sempre sessioni molto più piccole di 13Mb, è opportuno considerare bene questa scelta.

Un altro svantaggio dei CD multisessione è la difficoltà di accesso alle singole sessioni: è facile accedere a tutte le sessioni che precedono una sessione a scelta, ma è più difficile accedere ad una sessione escludendo tutte le altre, anche se questa necessità è piuttosto rara.

Infine, si ricordi che un CD multisessione non è sempre leggibile con qualunque dispositivo, specialmente nel caso di CD audio. In generale, invece, non ci sono problemi nel caso di CD dati.

Copia di un CD dati monosessione[modifica]

Le operazioni da effettuare in questo caso sono piuttosto elementari. Se si dispone di due dispositivi distinti, uno per la lettura (SOURCE) e uno per la scrittura (TARGET), si può procedere come segue:

 dd if=SOURCE | cdrecord -data dev=TARGET -

Se invece si dispone di un unico dispositivo, occorre separare la fase di lettura da quella di scrittura, salvando il risultato della lettura in un file temporaneo (IMAGE):

 dd if=SOURCE of=IMAGE
 cdrecord -dev=SOURCE IMAGE

In dettaglio, i parametri in maiuscolo hanno il seguente significato:

SOURCE
è il nome del dispositivo da cui leggere i dati. Esso usa la normale notazione dei dispositivi in GNU/Linux. Nomi plausibili sono /dev/scd0 oppure /dev/hdc, ma in ogni caso non è ammessa la notazione SCSI, né si può fare riferimento a dispositivi a carattere, perché il comando dd opera per blocchi.
TARGET
identifica il dispositivo di incisione contenente il mezzo fisico su cui verranno effettivamente incisi i dati. In questo caso è ammessa la notazione SCSI e il riferimento a dispositivi a carattere, entrambi gestiti da cdrecord.
IMAGE
un file che conterrà l'immagine ISO9660 del disco sorgente, che verrà poi incisa sul disco destinazione.

Il comando dd usato sopra potrebbe essere sostituito da qualunque altro comando in grado di copiare su disco rigido l'intero file system presente sul CD originale. Ma in questo modo si trasformerebbe il file system ISO9660 presente sul CD originale in un file system diverso (ad esempio ext2 o reiser), dal quale poi si dovrebbe ricavare una nuova immagine ISO da incidere. Il comando dd evita questo passaggio, normalmente inutile, perché copia il contenuto del dispositivo a basso livello, ignorando completamente il tipo e la struttura del file system, e riproducendolo integralmente.

È il caso di notare, nel primo caso illustrato, l'importanza del trattino ('-') finale, che segnala a cdrecord di prelevare i dati da incidere dall'output del comando precedente, in questo caso appunto dd.

Anche disponendo di due dispositivi distinti, potrebbe essere prudente separare comunque la lettura dalla scrittura, e provare a montare nel file system l'immagine IMAGE, tramite il comando:

 mount -o loop IMAGE MOUNTPOINT

in cui MOUNTPOINT è una qualunque directory, tipicamente una sottodirectory di /mnt. Se questo comando non riporta errori, si può navigare nella directory MOUNTPOINT per verificare che il suo contenuto corrisponda a quello del CD originale, e solo dopo procedere alla scrittura. Il semplice fatto che mount non riporti errori è di solito indice di esito positivo della lettura: qualunque errore in lettura, anche minimo, comprometterebbe certamente la struttura ISO9660, e mount riporterebbe un messaggio d'errore.

Se è disponibile una checksum del CD originale, è opportuno calcolare la stessa checksum sull'immagine ottenuta, e verificare che le due siano uguali. Questa è ovviamente una verifica più significativa del semplice mount.

In generale, incidendo CD-RW, non è essenziale distinguere le due fasi, dal momento che, in caso di errori, il disco destinazione può essere riscritto. Incidendo invece CD-R, è prudente verificare l'affidabilità dei mezzi disponibili (lettore, masterizzatore e dischi) almeno per le prime volte, e poi regolarsi di conseguenza.

Creazione di un CD dati monosessione[modifica]

La creazione di un CD dati avviene in modo simile alla copia esatta. La differenza è che la sorgente non è un CD in formato ISO9660, bensì un file immagine, del tutto simile al file IMAGE che si ottiene durante la copia se questa viene effettuata in due passaggi. Tale file viene creato con il comando mkisofs a partire da una serie di directory o file, specificati come argomenti del comando stesso.

Nella situazione più semplice, e anche più comune, si procede come sotto:

 mkisofs -r SOURCE_1 [SOURCE_2 ... SOURCE_N] | cdrecord dev=TARGET -

Il parametro TARGET ha esattamente il significato visto a proposito della copia esatta. I parametri SOURCE_1,... SOURCE_N, di cui solo il primo è obbligatorio, sono tipicamente percorsi assoluti o relativi, non necessariamente corrispondenti a directory, anche se questa è la situazione più comune.

Anche in questo caso, è fondamentale il trattino finale, perché la pipe ('|') collega l'output di mkisofs, cioè l'immagine ISO delle directory specificate, allo standard input di cdrecord, che però deve essere informato di questo.

L'opzione -r è generalmente sufficiente ad ottenere risultati soddisfacenti nella maggior parte delle situazioni. Essa produce un'immagine non compatibile con l'ISO9660 puro, ma con la sua estensione più diffusa, nota come Rock Ridge extensions. Un'immagine di questo tipo può contenere nomi di file praticamente arbitrari, costituiti da un numero qualsiasi di caratteri di qualunque tipo, fatte salve le cautele relative al set di caratteri. Quest'ultimo potrebbe costituire un problema, ma è comunque possibile specificare un set di caratteri con l'opzione -input-charset.

Se il CD deve essere letto in ambiente Windows, è possibile che si abbia qualche problema di compatibilità. L'opzione -J, che attiva altre estensioni proprietarie di Microsoft, note come Joliet extensions, potrebbe essere utile in questi casi.

Occorre tenere presente che l'uso delle estensioni Rock Ridge richiede la sostituzione dei nomi di file lunghi con nomi compatibili con ISO9660, e la creazione di una apposita tabella di corrispondenza. Nei casi più complessi, in cui sono raggruppati in una sola immagine molti file provenienti da directory diverse, questo può causare duplicazioni di nomi che mkisofs non è in grado di sciogliere.

La soluzione è l'uso dei cosiddetti graft-points, ma questo è piuttosto complesso, ed è opportuno in questi casi ricorrere ad un'interfaccia come xcdroast o altre che si occupano di invocare mkisofs con i parametri necessari ad evitare questi conflitti, il tutto in maniera trasparente all'utente.

Creazione di un CD multisessione[modifica]

Al costo di un certo spreco di spazio sul supporto, è possibile incidere più sessioni sullo stesso CD in fasi successive. Questo è particolarmente utile, ad esempio, a fini di backup: periodicamente si aggiunge una nuova sessione al CD già iniziato, contenente un archivio dei dati modificati dall'ultima sessione.

Non tutti i dispositivi offrono questa possibilità, ma il comando cdrecord -prcap dovrebbe fornire indicazioni chiare in proposito.

L'incisione della prima sessione non è molto diversa dall'incisione di un CD monosessione. Supponendo che IMAGE sia un'immagine ISO9660, ottenuta in qualsivoglia modo, essa dev'essere incisa con il comando

cdrecord dev=TARGET -multi IMAGE

Come si vede, l'unica differenza rispetto al CD monosessione è l'opzione -multi. A questo punto il CD può già essere montato nel filesystem, come se fosse un CD monosessione.

Per aggiungere una nuova sessione, non si può prescindere da mkisofs, perché la nuova immagine deve essere creata indicando a mkisofs alcuni parametri ricavati dalla sessione precedente. I comandi da usare, nella loro forma più semplice, sono i seguenti:

NEXT=$(cdrecord dev=TARGET -msinfo)
mkisofs -r -o IMAGE -C $NEXT -M TARGET SOURCE_1 ... SOURCE_N
cdrecord dev=TARGET -multi IMAGE

I parametri e le variabili in maiuscolo hanno il seguente significato:

TARGET
è il nome del dispositivo usato per incidere. Può assumere le varie forme già discusse sopra.
NEXT
se il supporto nel dispositivo contiene più di una sessione, questa variabile deve avere un valore del tipo X,Y, con X e Y numeri interi. Se il supporto contiene solo una sessione, X vale 0.
IMAGE
è l'immagine che sarà incisa come nuova sessione.
SOURCE_1... SOURCE_N
sono file e directory da aggiungere al CD, e che contribuiscono all'immagine IMAGE.

Come si vede, rispetto all'incisione di un CD monosessione, ogni nuova sessione di un CD multi-sessione richiede due nuove opzioni per mkisofs (-C e -M), che gli consentono di creare un'immagine che andrà a collocarsi al punto giusto del CD multi-sessione.

Duplicazione di un CD multisessione[modifica]

I dati contenuti in un CD multisessione possono essere estratti in due modi: si può accedere all'intero disco o alle singole sessioni. In entrambi la procedura più semplice prevede l'uso del comando mount.

Usato senza particolari opzioni, mount monta l'intero CD:

 mount DEV DIR

Nel comando sopra, DEV è il nome del file nella directory /dev che corrisponde al dispositivo di lettura. DIR è invece la directory su cui montare il CD. Un tipico esempio è:

mount /dev/hdc /mnt/cdrom

Fra l'altro, nella maggior parte dei casi è probabile che in /etc/fstab sia presente una riga equivalente all'esempio sopra, per cui dovrebbe essere sufficiente il comando:

mount /mnt/cdrom

A questo punto il contenuto del CD è completamente disponibile nella directory DIR, e sta all'utente decidere cosa farne. Ad esempio, può creare un nuovo CD multisessione in cui la prima sessione comprende l'intero contenuto del CD originale, recuperando tutto lo spazio vuoto necessario fra una sessione e l'altra. Questo può avere senso lavorando con CD-RW, ma non con CD-R.

Per montare una singola sessione occorre indicare a mount il numero di sessione tramite l'opzione -o session:

 mount -o session=NUM DEV DIR

Il parametro NUM indica il numero di sessione. La prima sessione di un CD è numerata con lo 0.

In realtà in questo modo non si accede a ciascuna singola sessione, ma a tutte quelle comprese fra la prima e quella selezionata. Questo è coerente con il fatto che, senza l'opzione -o session, viene montato l'intero CD, come se si fosse selezionata l'ultima sessione.

Duplicazione di un CD multisessione (versione hard, in costruzione)[modifica]

È teoricamente possibile accedere a singole sessioni di un CD multisessione, escludendo tutte le altre, ricorrendo al comando dd o al comando readcd.

Il problema, però, è che alcuni settori del CD sono creati in modo intenzionalmente non corretto per gestire le informazioni necessarie a recuperare correttamente il contenuto del CD.

Per evitare questo problema alla radice si possono incidere le varie sessioni con l'opzione -pad di cdrecord, che aggiungono 15 settori da 2048 byte alla fine di ogni sessione, sufficienti ad evitare che dd rilevi un errore di I/O.

Alcune fonti indicano che una soluzione migliore è ricorrere alla modalità di incisione DAO (Disc At Once). Altre fonti dicono però che non tutti i dispositivi sono in grado di incidere CD multisessione in modalità DAO, e operano invece in modalità TAO (Track At Once).

Occorre dunque fare delle prove per capire quali modalità sono gestite dal proprio dispositivo, o se la sola opzione -pad di cdrecord è sufficiente.

Per CD già incisi in modalità TAO, o senza opzione -pad, si può usare il comando readcd, fornito di norma insieme a cdrecord. La documentazione di cdrecord suggerisce, a proposito di readcd, due possibilità. Nel primo caso si procede come segue:

 cdrecord dev=SOURCE -toc
 readcd dev=SOURCE f=IMAGE sectors=$((LAST - 2))

In questi due comandi le variabili hanno il seguente significato:

SOURCE
è il nome del dispositivo contenente il CD da cui estrarre l'immagine ISO9660.
IMAGE
l'immagine ISO9660 ricavata dal CD.
LAST
è la posizione dell'ultimo settore dell'ultima sessione.

Come si vede, readcd richiede che i settori da leggere siano due meno della fine dell'ultima sessione.

Copia di un CD audio[modifica]

Per duplicare un CD audio è necessario il comando cdparanoia oppure, in alternativa, il comando cdda2wav. Nel seguito si farà riferimento solo a cdparanoia.

Questo comando deve il suo nome all'uso di varie tecniche per cercare di rimediare a piccoli difetti del supporto. Il risultato sono copie molto fedeli, anche se, in presenza di originali particolarmente rovinati, il processo può essere molto lungo.

Per incidere la copia si usa ancora cdrecord, ma con l'opzione -audio. Nel caso più semplice, in presenza di due distinti dispositivi per la lettura e la scrittura, è sufficiente il comando seguente:

cdparanoia -q -d SOURCE 1- - | cdrecord dev=TARGET -audio -

in cui i parametri in maiuscolo hanno il seguente significato:

SOURCE
dispositivo contenente il CD audio. Esso è indicato con la notazione IDE, o anche con un dispositivo che sia un link ad un dispositivo IDE.
TARGET
dispositivo su cui incidere la copia. Per il suo nome si veda sopra.

Il comando illustrato legge e incide tutte le tracce, dalla prima all'ultima, grazie allo span argument 1-. Se il supporto per la copia non è un CD-RW, eventuali problemi in lettura potrebbero rendere impossibile completare la scrittura correttamente, e quindi il supporto per la copia potrebbe risultare inutilizzabile. Può essere più prudente operare in due fasi distinte, disponendo di sufficiente spazio su disco:

 cdparanoia -q -B -d SOURCE
 cdrecord dev=TARGET -audio track*.wav

Creare un cd audio da console[modifica]

1) Ottenere i file wav dal cd audio[modifica]

Ci sono diversi modi, uno è quello di usare cdda2wav in questo modo:

cdda2wav -B

Questo estrarrà tutte le tracce dal cd audio in formato wav. Se è necessario indicare dove si trova il cd, nel caso in cui ad esempio si disponga di più di un lettore, è possibile passare l'opzione -D (o per esteso -device) seguita dall'inidicazione del device:

cdda2wav -D /dev/hdc -B

2) Masterizzare i wav e ottenere un cd audio[modifica]

È possibile masterizzare un cd audio a partire dalle tracce in formato wav. Per farlo occorre mettere tutte le tracce in una directory e, aperta una console, spostarsi in quella directory e digitare:

cdrecord dev=0,0,0 speed=4 -eject -pad -audio -raw -swab *.wav