J'ai un disque, disons/dev/sda.
Voici fdisk -l:
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
J'ai besoin de faire une image à stocker sur notre serveur de fichiers pour l'utiliser dans les autres appareils que nous fabriquons, donc je ne veux que l'espace utilisé (seulement environ 4 Go). Je veux garder le mbr etc ... car cet appareil doit être prêt à démarrer dès que la copie est terminée.
Des idées? J'utilisais auparavant dd if=/dev/sda of=[//fileserver/file]
, mais à cette époque, ma copie principale était sur une mémoire flash de 4 Go.
À l'époque, j'ai rencontré un problème similaire avec les distributions Linux intégrées - débarrassez-vous de tous les fichiers indésirables 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 sur tout l'espace libre de l'appareil.
Maintenant, prenez une image disque et exécutez-la via gzip. Voila, image clairsemée.
N'évolue 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 vers un autre volume, le mettre à zéro, puis prendre cette image disque.
Remarque: pourrait être dangereux pour le SSD, l'utilisateur doit considérer cette opération avant de s'engager.
En supposant que vous souhaitiez enregistrer /dev/sdXN
à /tgtfs/image.raw
et vous êtes root:
mkdir /srcfs && mount /dev/sdXN /srcfs
Utilisez zerofill
ou simplement:dd if=/dev/zero of=/srcfs/tmpzero.txt
pour remplir à zéro les blocs inutilisés; 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 pointer 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 perforer les zéros avec dd car les blocs zéro sont très 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 la 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 de nombreuses écritures à votre SSD et réduisez sa durée de vie. (mais c'est bien pour un transfert occasionnel de données)
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 choses à noter sont 1) la taille de l'unité et 2) la colonne "Fin". Dans votre cas, vous disposez de cylindres équivalents à 8225280 octets. Dans la colonne "Fin", sda8 se termine à 525 (soit 525 [unités] * 16065 * 512 = ~ 4,3 Go)
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 (note que nous incrémentons le compte de 1 pour capturer le dernier bloc).
Tandis que /dev/zero
l'espace libre sur le disque 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 compter 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 CD live lubuntu, utilisé gparted
pour "réduire" le disque à la taille minimale possible, en 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 compressée rapidement (il va sans dire que vous souhaiterez peut-être ignorer la compression si vous avez suffisamment d'espace pour stocker les données brutes (ou si vous êtes par ailleurs enclin à réduire la charge du processeur)
dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY
pour recopier les données sur un autre disquegparted
à nouveau utilisé pour "étendre" la partitionJe 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
- des décalages de lecture/écriture (skip
/seek
option de dd
, respectivement) seraient requis selon le cas.
Tu ne peux 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 dirigez-le simplement via gzip.
En supposant que le reste du lecteur est vide (tous les zéros), vous pouvez diriger votre DD via gzip, ce qui devrait compresser assez bien l'espace vide. Vous pouvez utiliser un outil comme zerofree pour vous assurer que votre espace vide est réellement vide afin qu'il compresse bien.
Si vous utilisez un outil comme partimage , clonezilla ou certains des autres outils de clonage linux, ils géreraient la plupart de cela pour vous automatiquement.
La réponse acceptée n'est pas correcte. Je suis d'accord avec le commentaire ci-dessus. J'utilise dd avec le paramètre count pour sauvegarder mon disque sur une base régulière. Remplacez simplement le BACKUP_FOLDER et la lettre de votre appareil par "X":
Définissez le dernier bloc utilisé du disque:
ct=$(fdisk -l | awk '$1 == "/dev/sdX" { print $3 }')
Puis clonage du disque (à l'exclusion de son espace vide):
dd if=/dev/sdX bs=512 count=$ct | gzip > BACKUP_FOLDER/sdX_$(date +"%Y-%m-%d").img.gz >>"$LOG"