April 18 2023, 09:51#

Effacement sécurisé d'un disque dur avec dd sous FreeBSD

Pour effacer le disque /dev/da1 j'utilise la commande dd combinée avec /dev/urandom pour générer des nombres aléatoires.

Exemple

dd if=/dev/urandom of=/dev/da1 conv=sync status=progress

Par défaut, dd positionne la taille du bloc/secteur à 512. Pour accélérer le process, on peut l'aligner à la taille du secteur physique du disque, qui est de 4096 (stripesize).

Cette information peut s'obtenir à l'aide de diskinfo et camcontrol.

Exemple avec diskinfo

$ diskinfo -v /dev/da1
/dev/da1
    512             # sectorsize
    500107862016    # mediasize in bytes (466G)
    976773168       # mediasize in sectors
    4096            # stripesize
    0               # stripeoffset
    60801           # Cylinders according to firmware.
    255             # Heads according to firmware.
    63              # Sectors according to firmware.
    ST500LM0 12 HN-M500MBB  # Disk descr.
    0322031102F9    # Disk ident.
    umass-sim1      # Attachment
    No              # TRIM/UNMAP support
    Unknown         # Rotation rate in RPM
    Not_Zoned       # Zone Mode

Petit calcul pour comprendre : si on reprend la taille du media en bytes (mediasize in bytes) et qu'on divise par la taille du secteur (sectorsize), on retrouve la taille du media en nombre de secteurs (mediasize in sectors).

$ echo $((500107862016 / 512))
976773168

On peut obtenir d'avantage d'infos sur le disque avec camcontrol identify /dev/da1, mais je vais pas aborder ce sujet dans cette note, on a déjà l'info nécessaire avec diskinfo.

Le paramètre bs de la commande dd permet de paramétrer la taille du bloc/secteur (block/sector size).

Avec cette nouvelle info cela donne

dd if=/dev/urandom of=/dev/da1 bs=4096 conv=sync status=progress

Top, c'est bien plus rapide !

Vu la taille de mon disque (500G), j'ai interrompu le process par manque de temps pour le laisser finir. 309G ont été effacés. Pour ne pas recommencer depuis le début, il me fallait calculer le nombre de secteurs à sauter pour donner un point de départ à dd.

J'ai décidé de repartir à 300G, voici comment j'ai calculé.

Calculer la taille à sauter en bytes

$ echo $((300 * 1024 * 1024 * 1024))
322122547200

Calcul du nombre de secteurs d'une taille de 4096 à sauter

# echo $((322122547200 / 4096))
78643200

Pour reprendre la tâche après interruption, il est possible de définir un nombre de blocs à sauter en sortie avec l'argument oseek.

# dd if=/dev/urandom of=/dev/da1 bs=4096 oseek=78643200 conv=sync status=progress
dd: /dev/da1: end of deviceB, 166 GiB) transferred 16298.003s, 11 MB/s

43453447+0 records in
43453446+0 records out
177985314816 bytes transferred in 16298.896788 secs (10920084 bytes/sec)

Résumons et vérifions le résultat ci-dessus. J'ai un disque de 500G dont j'ai déjà formaté 309G (disons 300).

Le mediasize in bytes est de 500107862016 (466G). Vérifions...

$ echo $((500107862016 / 1024 / 1024 / 1024))
465

Plus précisément 465.76, arrondi à 465 par le Shell et à 466 par diskinfo.

Calcul de la taille restant à effacer

$ echo $((466 - 300))
166

La commande dd nous dit que 166G ont été transférés.

Elle nous dit aussi que 177985314816 bytes ont été transférés, calculons cela encore une fois...

$ echo $((177985314816 / 1024 / 1024 / 1024))
165

Plus précisément 165.76, arrondi à 165 par le Shell et à 166 par dd. On est tout bon !

Tags : freebsd dd cybersécurité hdd disk camcontrol shell