web-dev-qa-db-fra.com

dd sur tout le disque, mais ne veulent pas de partie vide

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.

41
Jonathan Henson

À 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.

39
Rob Bos

En supposant que vous souhaitiez enregistrer /dev/sdXN à /tgtfs/image.rawet vous êtes root:

  1. mkdir /srcfs && mount /dev/sdXN /srcfs

  2. 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

  3. 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)

21
Microsoft Linux TM

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).

14
Tom Looby

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/zeroing est douloureusement lent - sans compter que comme d'autres réponses l'ont noté, /dev/zeroing 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)

  • Utilisé
    dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY pour recopier les données sur un autre disque
  • gparted à nouveau utilisé 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 - des décalages de lecture/écriture (skip/seek option de dd, respectivement) seraient requis selon le cas.

10
Ashish Chopra

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.

8
c2h5oh

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.

7
Zoredache

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"
4
Aloha D