Solution 1 :
À l'époque, j'ai rencontré un problème similaire avec les distributions Linux embarquées - débarrassez-vous de tous les fichiers inutiles avant de compresser l'image.
dd if=/dev/zero of=asdf.txt
. Attendez qu'il meure. Supprimez asdf.txt.
Vous venez d'écrire des zéros dans tout l'espace libre de l'appareil.
Maintenant, prenez une image disque et exécutez-la via gzip. Voilà, image clairsemée.
Ne s'adapte probablement pas très bien et pourrait causer des problèmes si vous avez réellement besoin d'écrire sur le disque, mais bon.
Vous pouvez prendre un instantané rsync du disque sur un autre volume, le mettre à zéro, puis prendre cette image disque.
Remarque :Pourrait être dangereux pour le SSD, l'utilisateur doit envisager cette opération avant de s'engager.
Solution 2 :
En supposant que vous souhaitiez enregistrer /dev/sdXN
à /tgtfs/image.raw
et vous êtes root :
-
mkdir /srcfs && mount /dev/sdXN /srcfs
-
Utilisez
zerofill
ou juste:
dd if=/dev/zero of=/srcfs/tmpzero.txt
pour remplir les blocs inutilisés avec zéro ; attendez qu'il remplisse complètement le système de fichiers, puis :
rm /srcfs/tmpzero.txt
-
Prenez l'image avec dd et utilisez conv=sparse pour taper des zéros à la volée :
dd conv=sparse if=/dev/sdxn of=/tgtfs/image.raw
Si vous souhaitez utiliser la compression, vous n'avez pas besoin de taper les zéros avec dd car les blocs zéro sont hautement compressibles :
dd if=/dev/sdxn | gz -c | dd of=/tgtfs/image.raw
PS:Vous devez noter que ce n'est pas une bonne idée de le faire (remplir le système de fichiers avec des zéros) sur un support de stockage basé sur une mémoire flash (c'est-à-dire que votre système de fichiers source est un SSD) sur une base régulière, car cela entraînera une écriture intensive à votre SSD et réduire sa durée de vie. (mais ça va pour le transfert occasionnel de données)
Solution 3 :
Utilisez dd, avec l'option count.
Dans votre cas, vous utilisiez fdisk, je vais donc adopter cette approche. Votre "sudo fdisk -l " a produit :
Disk /dev/sda: 64.0 GB, 64023257088 bytes
255 heads, 63 sectors/track, 7783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000e4b5
Device Boot Start End Blocks Id System
/dev/sda1 * 1 27 209920 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 27 525 4000768 5 Extended
Partition 2 does not end on cylinder boundary.
/dev/sda5 27 353 2621440 83 Linux
/dev/sda6 353 405 416768 83 Linux
/dev/sda7 405 490 675840 83 Linux
/dev/sda8 490 525 282624 83 Linux
Les deux éléments dont vous devez tenir compte sont 1) la taille de l'unité et 2) la colonne "Fin". Dans votre cas, vous avez des cylindres égaux à 8225280 octets. Dans la colonne "Fin", sda8 se termine à 525 (soit 525[units]*16065*512 =~4.3GB)
dd peut faire beaucoup de choses, comme démarrer après un décalage ou s'arrêter après un nombre spécifique de blocs. Nous ferons ce dernier en utilisant l'option count dans dd. La commande apparaîtrait comme suit :
sudo dd if=/dev/sda of=/your_directory/image_name.iso bs=8225280 count=526
Où -bs est la taille du bloc (il est plus facile d'utiliser l'unité utilisée par fdisk, mais n'importe quelle unité le fera tant que l'option count est déclarée dans ces unités), et count est le nombre d'unités que nous voulons copier (remarque que nous incrémentons le compte de 1 pour capturer le dernier bloc).
Solution 4 :
Alors que /dev/zero
l'espace disque libre et utilisez dd conv=sparse
/gz -c
est possible, sur d'énormes disques avec un espace vide fonctionnant dans des centaines de Go, /dev/zero
ing est douloureusement lent - sans oublier que, comme d'autres réponses l'ont noté, /dev/zero
ing un SDD jusqu'à EOF.
Voici ce que j'ai fait lorsque j'ai rencontré cette situation :
-
Sur un live CD Lubuntu, utilisé
gparted
pour "réduire" le disque à la taille minimale possible, laissant le reste de l'espace non alloué -
Utilisé
dd bs=1M count=<size_in_MBs> if=/dev/sdX | gzip -c --fast| dd of=/path/to/image.gz
pour créer l'image rapidement compressée (inutile de dire que vous pouvez ignorer la compression si vous disposez de suffisamment d'espace pour stocker des données brutes (ou si vous êtes autrement enclin à réduire la charge du processeur) - Occasion
dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY
pour recopier les données sur un autre disque - Utilisé
gparted
à nouveau pour 'étendre' la partition
Je ne l'ai pas essayé pour plusieurs partitions, mais je pense que le processus ci-dessus peut être adapté pour copier des "partitions" si la table de partition sur le disque de destination est créée en premier et que seules les données contenues dans la partition sont copiées via dd
- décalages de lecture/écriture (skip
/seek
possibilité de dd
, respectivement) seraient requis selon le cas.
Solution 5 :
Vous ne pouvez pas. dd
est un outil de très bas niveau et il n'a aucun moyen de faire la distinction entre les fichiers et l'espace vide.
D'un autre côté, l'espace vide se compressera très, très bien, donc si vous ne vous souciez que de l'espace de stockage, pas par exemple du temps d'écriture, alors faites-le simplement passer par gzip.