Approche différente, donc une autre réponse de ma part.
Vous pouvez vous utiliser ddrescue
pour rechercher des zéros. Utilisez --generate-mode
.
Quand ddrescue
est appelé avec l' --generate-mode
option, il fonctionne en "mode de génération", ce qui diffère du "mode de secours" par défaut. C'est-à-dire que si vous utilisez l' --generate-mode
option, ddrescue
rien ne sera sauvé. Il essaie seulement de générer un mapfile
pour une utilisation ultérieure.
[…]
ddrescue
peut dans certains cas générer une copie approximative mapfile
, à partir de infile
et la copie (partielle) outfile
, qui est presque aussi bonne qu’une copie exacte mapfile
. Cela se fait simplement en supposant que les secteurs contenant tous les zéros n’ont pas été sauvés.
[…]
ddrescue --generate-mode infile outfile mapfile
( source )
Supposons que votre fichier provient outfile
d'une ddrescue
exécution précédente . Nous ne pouvons pas l'utiliser comme infile
(parce que ddrescue
refuse de travailler quand infile
et outfile
sont le même fichier), nous avons besoin d'un fichier factice, /dev/zero
fera l'affaire. Pour trouver chaque zéro dont vous avez besoin -b 1
. C'est la commande ( mapfile
ne doit pas exister):
ddrescue -b 1 --generate-mode /dev/zero file mapfile
Chaque entrée avec ?
dans la liste des blocs de données à l'intérieur du mapfile
bloc signifie un bloc de zéros ( -b 1
un seul zéro est aussi un bloc). Voir la structure du mapfile pourddrescue
. Vous pouvez ensuite récupérer des informations à partir du fichier mapfile
.
Par exemple, la commande suivante vous donnera la longueur (hexadécimale, en octets à cause de -b 1
) du plus grand bloc de zéros (une sortie vide signifie qu'il n'y en avait pas):
grep '0x.*0x.*[?]' mapfile | awk -F ' ' '{print $2}' | sort -ru | head -n 1
Pour accélérer les choses, vous pouvez utiliser une taille de bloc plus grande ( -b
), mais les blocs de zéros commençant par un bloc et se terminant par le suivant peuvent ne pas être remarqués, même s’ils sont légèrement plus longs que la taille de bloc choisie; leur décalage devient important.
Pour ne rater aucune portion de zéros d’ N
octets de longueur ou plus, vous devez disposer d’une taille de bloc d'au plus M=$(((N+1)/2))
octets (par exemple, au plus 5
pour N=10
, 6
pour N=11
). La commande
ddrescue -b "$M" --generate-mode /dev/zero file mapfile
générera un mapfile où chaque ligne ?
dans la liste des blocs de données signifie au moins M
zéro (décalage correct), mais chaque portion de N
zéros (quel que soit son décalage) générera une telle ligne à coup sûr. Puisque deux blocs de M
sont au moins N
, le raisonnement suivant s'applique:
Prendre des lignes avec ?
de la liste des blocs de données,
- Si la longueur (deuxième colonne de la
mapfile
, rappelez-vous que l'unité est M
) est 0x2
supérieure N
ou égale à 0, vous avez ou plusieurs zéros à cette position;
- si la longueur est
0x1
alors vous devriez enquêter davantage s'il y a au moins des N
zéros autour de cette position;
- s'il n'y a pas de telle ligne, il n'y a pas de
N
zéros dans le fichier à coup sûr.
En réalité, ils seraient toujours un multiple de 512 octets et commenceraient toujours à une adresse de 512 octets.
Dans ce cas
ddrescue -b 512 --generate-mode /dev/zero file mapfile
va trouver et cartographier tous.
ddrescue
contiendra exactement quelles zones n'ont pas été clonées. Vous pouvez également utiliser ddrescueview pour les voir.