Existe-t-il une méthode pour obtenir un pourcentage sur un DD sous Linux?

41

Alors, voici ce qui se passe.

J'ai commencé une sauvegarde d'un lecteur sur mon serveur via une clé USB Linux Live. J'ai commencé à copier le premier disque avec la ddcommande vanilla; juste sudo dd if=/dev/sda of=/dev/sdc1et puis je me suis souvenu que cela laisse juste la console vierge jusqu'à ce qu'elle se termine.

De toute façon, je devais exécuter une sauvegarde différente sur le même disque. J'ai donc démarré celle-ci également sudo dd if=/dev/sdb of=/dev/sdc3 status=progress, puis une ligne de texte indiquant le taux de transfert actuel ainsi que la progression en octets.

J'espérais une méthode qui montre un pourcentage de la sauvegarde au lieu de faire le calcul du nombre d'octets sauvegardés sur 1,8 To. Y a-t-il un moyen plus facile de faire cela que status = progress?

Hastur
la source

Réponses:

68

Voir les réponses à cette question [ 1 ]

pv

Par exemple, vous pouvez utiliser pv avant de commencer

sudo apt-get install pv    # if you do not have it
pv < /dev/sda > /dev/sc3   # it is reported to be faster
pv /dev/sda > /dev/sc3     # it seems to have the same speed of the previous one
#or 
sudo dd if=/dev/sda | pv -s 1844G | dd of=/dev/sdc3  # Maybe slower 

Sortie [ 2 ] :

440MB 0:00:38 [11.6MB/s] [======>                             ] 21% ETA 0:02:19

Remarques:
En particulier pour les fichiers volumineux, vous voudrez peut-être voir man ddet définir les options nécessaires pour accélérer tout votre matériel, par exemple bs=100Mpour définir le tampon, oflag=synccompter les octets effectifs écrits, peut-être direct...
L'option -sne prend que les paramètres entiers, donc 1.8T-->1844G.
Comme vous pouvez le constater dès les premières lignes, vous n’avez absolument pas besoin ddde vous.


kill -USR1 pid

Si vous avez déjà lancé la ddcommande, une fois que vous avez identifié son PID ( Ctrl- Z+ bget que vous l'avez lu, ou pgrep ^dd...), vous pouvez envoyer un signal USR1( SIGUSR1ou SIGINFOvoir ci-dessous) et lire le résultat.
Si le PID du programme est 1234 avec

kill -USR1 1234

dd répondra sur le terminal de son STDERR avec quelque chose de similaire à

4+1 records in
4+0 records out
41943040 bytes (42 MB) copied, 2.90588 s, 14.4 MB/s

Avertissement: Sous OpenBSD, vous devrez peut-être vérifier au préalable le comportement de kill[ 3 ] : utilisez plutôt
kill -SIGINFO 1234.
Il existe la sigaction nommée SIGINFO. Celui SIGUSR1, dans ce cas, devrait terminer le programme ( dd) ...
Sous Ubuntu, utilisez -SIGUSR1( 10).

Hastur
la source
9
vous constaterez presque certainement que l'utilisation de «bs» dans la commande dd l'accélère énormément. Comme dd if = / dev / blah of = / tmp / blah bs = 100M pour transférer des blocs de 100M à la fois
Sirex le
1
@Sirex Bien sûr, vous devez paramétrer le bs pour optimiser le taux de transfert en fonction de votre matériel ... Dans la réponse, il suffit de répéter la ligne de commande de l'OP. :-)
Hastur le
3
@Criggie: c'est peut-être parce que ddtous les write()appels système étaient déjà terminés et fsyncou closebloqués dans l'attente des écritures. Avec une clé USB lente, les seuils de mémoire tampon d'entrée / sortie Linux par défaut concernant la taille des mémoires tampons d'écriture modifiées conduisent à un comportement qualitativement différent de celui obtenu avec des fichiers volumineux sur des disques rapides, car les mémoires tampons sont aussi grandes que ce que vous copiez. prend encore du temps perceptible.
Peter Cordes
5
Très bonne réponse. Cependant, je tiens à noter que dans OpenBSD, le signal de suppression correct est SIGINFO, pas SIGUSR1. Utiliser -USR1 dans OpenBSD ne fera que tuer dd. Donc, avant d'essayer cela dans un nouvel environnement, sur un transfert que vous ne voulez pas interrompre, vous voudrez peut-être vous familiariser avec la façon dont l'environnement agit (sur un test plus sûr).
TOOGAM
1
les avis sur les signaux ddsont vraiment intéressants, surtout pour les serveurs sur lesquels vous ne pouvez pas / ne voulez pas installerpv
Mike
38

Mon outil de prédilection pour ce genre de choses est progress:

Cet outil peut être décrit comme une commande C minuscule , sale, Linux-et-OSX-Only recherchant les commandes de base de coreutils (cp, mv, jj, tar, gzip / gunzip, cat, etc.) en cours d'exécution sur votre système et affiche le pourcentage de données copiées. Il peut également afficher la durée et le débit estimés , et fournit un mode "top-like" (surveillance).

"Capture d'écran de <code> progress </ code> en action"

Il recherche simplement /procles commandes intéressantes, puis examine les répertoires fd, fdinforecherche les fichiers ouverts, recherche les positions et indique l'état du fichier le plus volumineux.

Il est très léger et compatible avec pratiquement toutes les commandes.

Je le trouve particulièrement utile car:

  • comparé à pvin pipe ou dcfldd, je n'ai pas à me rappeler d'exécuter une commande différente lorsque je lance l'opération, je peux surveiller les choses après coup;
  • comparé à kill -USR1, cela fonctionne sur pratiquement n'importe quelle commande, je n'ai pas besoin de toujours vérifier la page de manuel pour être sûr de ne pas tuer accidentellement la copie; de plus, il est intéressant de noter que, lorsqu'il est appelé sans paramètre, il affiche la progression de la commande courante "transfert de données" en cours d'exécution, de sorte que je n'ai même pas à rechercher le PID;
  • par rapport à pv -d, encore une fois, je n'ai pas besoin de rechercher le PID.
Matteo Italia
la source
1
Remarque: vous pouvez surveiller davantage que les processus coreutils. Spécifiez simplement le nom de la commande avec --command <command-name>.
Jpaugh
1
C'est génial!
Floris
25

Exécutez ddensuite, dans un shell séparé, appelez la commande suivante:

pv -d $(pidof dd) # root may be required

Cela fera que pv obtienne des statistiques sur tous les descripteurs de fichiers ouverts du ddprocessus. Il vous montrera à la fois où se trouvent les tampons de lecture et d’écriture.

sleblanc
la source
2
Fonctionne après le fait !? Incroyable!!
Jpaugh
3
C'est très cool. Cela évite la surcharge mémoire-bande passante + contexte-commutateur de canaliser toutes les données à travers 3 processus! @ jpaugh: Je suppose qu'il se contente de regarder /proc/$PID/fdinfoles positions des fichiers et /proc/$PID/fdde voir quels fichiers (et donc les tailles). Donc oui, très cool et bonne idée pour une fonctionnalité, mais je ne l'appellerais pas "incroyable" car il y a des API Linux qui permettent de sonder les positions de fichier d'un autre processus.
Peter Cordes
@PeterCordes Je n'avais pas réalisé que la position du fichier était exposée par le noyau. (J'ai passé ma vie à préparer minutieusement les pvpipelines à l'avance.) Bien sûr, j'en ai pensé autant une fois que j'ai vu que cela fonctionnait.
Jpaugh
9

Il y a une alternative à dd: dcfldd.

dcfldd est une version améliorée de GNU dd avec des fonctionnalités utiles pour la criminalistique et la sécurité.

Etat de la sortie - dcfldd peut mettre à jour l’utilisateur de ses progrès en termes de quantité de données transférées et de durée de fonctionnement prolongée.

dcfldd if=/dev/zero of=out bs=2G count=1 # test file
dcfldd if=out of=out2 sizeprobe=if
[80% of 2047Mb] 52736 blocks (1648Mb) written. 00:00:01 remaining.

http://dcfldd.sourceforge.net/
https://linux.die.net/man/1/dcfldd

Antonin Décimo
la source
C'est un nom de commandement plus long ... clairement, il est inférieur. (+1)
jpaugh
6

En pourcentage, vous devez faire des calculs, mais vous pouvez obtenir la progression d’un jj sous une forme lisible par l’être humain, même après avoir déjà commencé, en effectuant les opérations suivantes: kill -USR1 $(pidof dd)

Le processus actuel de la DD s'affichera de la manière suivante:

11117279 octets (11 Mo, 11 Mio) copiés, 13,715 s, 811 ko / s

Sirex
la source
4
C'est fondamentalement la même chose qui status=progressdonne
rakslice
1
J'étais sur le point de dire que c'est exactement la même chose que status = progress.