Utilisation des utilitaires dd, cat, head, truncate pour créer, recopier, réduire ou étendre, concaténer ou substituer les données d'un fichier binaire
Sommaire
1 - Création
Utilisation du pseudo-périphérique /dev/zero : création d'un fichier contenant 512 zéros
$ dd if=/dev/zero bs=512 count=1 of=zero.img
$ head -c 512 /dev/zero > zero.img
Utilisation du pseudo-périphérique /dev/urandom : création d'un fichier contenant 512 valeurs aléatoires
$ dd if=/dev/urandom bs=512 count=1 of=random.img
$ head -c 512 /dev/urandom > random.img
2 - Réduction ou extension d'un fichier
Ajouter 512 ZÉROS (à la fin du fichier)
$ truncate -s +512 original
Enlever 512 octets (à la fin du fichier) (les valeurs sont perdues)
$ truncate -s -512 original
Ajuster la taille à une valeur donnée - en cas de réduction, les valeurs sont perdues, en cas d'agrandissement des zéros sont ajoutés - Ajuster à 100 MiB (puissance de 10)
$ tail -c +513 original > original_avec_début_tronqué
Recopie sauf le dernier bloc de 512
$ head -c -512 original > original_avec_fin_tronquée
4 - Concaténation - Substitution
Ajout du contenu de l'entrée à la fin de la sortie (concaténation)
$ dd if=Input of=Output conv=notrunc oflag=append
$ cat Input >>Output
Remplacement du début du fichier de sortie par le fichier d'entrée. Les valeurs du fichier de sortie non remplacées sont inchangées
$ dd if=Input of=Output conv=notrunc
Remplacement du fichier de sortie à partir du 5 ème bloc par le contenu du fichier d'entrée. Les valeurs du fichier de sortie non remplacées sont inchangées
$ dd if=file1 of=file2 bs=512 seek=5 conv=notrunc
5 - Recopie entre un fichier et un périphérique
Recopie d'un CDROM
$ sudo dd if=/dev/sr0 of=cd.img
$ sudo cat /dev/sro > cd.img
Recopie d'un disque
$ sudo dd if=/dev/sdb of=disk.img
$ sudo cat /dev/sdb > disk.img
Recopie d'une partition
$ sudo dd if=/dev/sdb1 of=part.img
$ sudo cat /dev/sdb1 > part.img
Transfert d'un fichier image sur un périphérique bloc
$ sudo dd if=img.img of=/dev/sdb
$ cat img | sudo tee /dev/sdb 1>/dev/null
Annexe - Options de la commande dd
1 - Options principales
if=<source> Où sont les données d'entrée à copier
bs<Taille_des_blocs> Lire et écrire <Taille_des_blocs> à la fois, par défaut égal à 512 octets, valeur puissance de 2 recommandée, par exemple 4K.
count=N Ne copier que n blocs d'entrée
skip=<Nombre_blocs_entrée> Démarrer la lecture après le <Nombre_blocs_entrée> indiqué multiplié par la taille de bloc ( la taille de bloc est fournie soit soit par ibs si présent, soit en priorité par bs si présent)
of=<cible> Où les données seront copiées
seek=<Nombre_blocs_sortie> Démarrer l'écriture après le <Nombre_blocs_sortie> indiqué multiplié par la taille de bloc ( la taille de bloc est fournie soit par obs si présent, soit en priorité par bs si présent)
status= <progress> montrer les statistiques de transfert périodique
conv=<Conv1,Conv2,..> Modifier le fichier comme indiqué par la suite d'arguments séparés par des virgules, sans espaces <Conv1,Conv2,..>
noerror : Tell dd to continue operation, ignoring all read errors.
sync : Add input blocks with zeroes if there were any read errors, so data offsets stay in sync
fdatasync: physically write output file data before finishing
fsync : likewise, but also write metadata
notrunc : dans le fichier de sortie existant remplacer (depuis le début du fichier ou après le saut indiqué par seek) les données fournies par l'entrée, mais ne pas supprimer les données non remplacées (c'est le comportement par défaut d'un fichier bloc, n'est utile que dans le cas d'un fichier "standard")
iflag=<fullblock,direct>
fullblock : accumulate full blocks of input (iflag only)
direct : utiliser des E/S directes pour les données (permet de ne pas utiliser le cache des E/S )
oflag=<append,direct> :
append : dans le fichier de sortie existant ajouter (à la fin du fichier) les données fournies par l'entrée, s'utilise avec conv=notrunc ( non valable sur un fichier bloc )
direct : utiliser des E/S directes pour les données (permet de ne pas utiliser le cache des E/S )
2 - Options utilisables par défaut
Sauf cas particulier, les options suivantes sont recommandées
conv=fsync : la commande ne s'achève qu'une fois la recopie physique des données sur le périphérique effectuée, évite de retirer un périphérique avant que le transfert ne soit achevé
status=progress : affiche l'avancement de la recopie
iflag=fullblock : avec les grandes valeurs de bloc ou lorsque dd est utilisé en filtre assure que le nombre de données transférées soit exactement bs*count
oflag=direct ; le cache d'E/S ne sera pas utilisé, en association avec iflag=flullblock assure que les données sont transférées bloc par bloc. Si la commande est interrompue, on est ainsi assuré de récupérer la main dès que le transfert du bloc en cours est terminé