Je n'ai pas dd
beaucoup utilisé , mais jusqu'à présent, cela ne m'a pas encore manqué. En ce moment, je vis dd
depuis plus de 12 heures - je réécris une image sur le disque d'où il provient - et je m'inquiète un peu, car j'ai pu passer dd
du disque à l'image dans environ 7 heures.
J'utilise OSX 10.6.6 sur un MacBook avec un Core 2 Duo à 2,1 GHz / noyau avec 4 Go de RAM. Je lis un fichier .dmg sur un disque dur à 7 200 tr / min (le lecteur de démarrage) et j'écris sur un lecteur à 7 200 tr / min connecté via un connecteur SATA-à-USB. J'ai laissé la taille de bloc par défaut, et l'image est d'environ 160 Go.
EDIT: Et, après 14 heures de stress pur, le tout dd
fonctionnait parfaitement après tout. La prochaine fois, cependant, je vais le parcourir pv
et le suivre strace
. Merci à tous pour votre aide.
la source
dd ... bs=16M
est ma suggestion, compte tenu de votre RAM, la taille du disque et la vitesse.dd
Mac OS X a tendance à se bloquer au point que je ne peux même pas tuer le processus, mais que je dois redémarrer le système. Je commence alors à travailler sur une machine virtuelle Linux.Réponses:
Vous pouvez envoyer
dd
un certain signal en utilisant lakill
commande pour lui faire afficher son statut actuel. Le signal estINFO
sur les systèmes BSD (y compris OSX) etUSR1
sur Linux. Dans ton cas:Vous pouvez trouver l'ID de processus (
$PID
ci-dessus) avec laps
commande; ou consultez les alternatives pgrep et pkill sur mac os x pour des méthodes plus pratiques.Plus simplement, comme le souligne Antoine G dans sa réponse , vous pouvez taper
ctrl-T
sur le shell qui exécute dd pour lui envoyer leINFO
signal.À titre d’exemple sous Linux, vous pouvez
dd
définir l’état de sortie de tous les processus actifs comme suit:Après la sortie de son statut,
dd
continuera à faire face.la source
pkill -USR1 -x dd
INFO
signal. Linux n'a pas de SIGINFO et utilise à laUSR1
place.dd if=/dev/zero of=/dev/null
. :)Sous OS X (sans essayer sous Linux), vous pouvez simplement taper Ctrl+ Tdans le terminal en cours d'exécution
dd
. Il imprimera le même résultat quekill -INFO $PID
, plus l'utilisation du processeur:Je l'ai découvert en lisant ce fil et en essayant d'ouvrir un nouvel onglet dans mon terminal en mélangeant ⌘+ Tavec Ctrl+ T.
la source
load
l'utilisation du processeur l'est-elle aussi ?^T
au terminal.Pour
dd
, vous pouvez envoyer un signal . Pour les autres commandes qui lisent ou écrivent dans un fichier, vous pouvez regarder leur position dans le fichier aveclsof
.Si vous planifiez à l'avance, dirigez les données
pv
.la source
pv
semble juste le billet.Une méthode plus générale consiste à utiliser
iotop
la quantité actuelle de lecture / écriture sur disque par programme.EDIT:
iotop -o
affiche uniquement les programmes qui effectuent actuellement des opérations d’E / S (merci à Jason C pour ce commentaire).la source
iotop -o
masquera les processus qui ne font pas d’IO et facilitera la lecture en un coup d’œil de ce qui se passe.J'attache habituellement
strace
à un tel processus en cours (avec l'-p $PID
option) pour voir s'il reste bloqué dans un appel système ou s'il est toujours actif.Ou, si vous ne souhaitez pas envoyer un signal au disque en marche, démarrez-en un autre pour valider si cela fonctionne.
la source
strace
? De plus, j'en ai démarré un autredd
et envoyé l'un des signaux suggérés, et ... ça l'a tué.Pour la prochaine fois, vous pourrez simplement l'utiliser
pv
dès le début (installez-le s'il est disponible via votre gestionnaire de paquets). Il s’agit d’un utilitaire ayant pour seul objectif de canaliser les entrées vers les sorties et de suivre les progrès et la rapidité.Ensuite, pour écrire une image sur un lecteur, disons avec une taille de bloc de 4 Mo:
En plus de la mise en mémoire tampon initiale (compensée par une synchronisation finale, qui peut être effectuée
dd
si vous le souhaitez), cela vous indiquera une barre de progression, la vitesse moyenne, la vitesse actuelle et l’ETA.L'
iflag=fullblock
option force dd à saisir des blocs entiers d'entréepv
, sinon vous êtes à la merci du tuyau pour les tailles de bloc.Pour aller dans l'autre sens, utilisez dd pour lire et pv pour écrire, bien que vous deviez spécifier explicitement la taille si la source est un périphérique en mode bloc. Pour un appareil de 4 Go:
Vous pouvez également déterminer automatiquement la taille, par exemple:
Il n'a pas d' importance ce que pour vous faire
dd
etpv
, c'est entièrement liée à la performance - si l'appareil que vous lisez ou de a des performances optimales pour certains blocksizes vous souhaitez utiliser audd
lieu d'pv
accéder à ce dispositif. Vous pouvez même en coller undd
aux deux bouts si vous voulez, ou pas du tout si vous vous en fichez:la source
À partir de la version
coreutils
8.24,dd
supporte en natif les progrès réalisés. Ajoutez simplement l'optionstatus=progress
.Exemple:
La source
la source
ddrescue
vous donnera des statistiques pendant son exécution.démo: http://www.youtube.com/watch?v=vqq9A01geeA#t=144s
la source
Parfois, vous ne pourrez peut-être pas utiliser le signal INFO ou USR1 car le flux stderr du
dd
processus n’est pas accessible (par exemple parce que le terminal dans lequel il a été exécuté était déjà fermé). Dans ce cas, une solution de contournement consiste à effectuer les opérations suivantes (testé sous FreeBSD, il peut être légèrement différent sous Linux):Utilisez
iostat
pour estimer le taux d'écriture moyen (Mo / s) sur le périphérique cible, par exemple:iostat -d -w30 ada0
Remplacez
ada0
ici le nom de votre périphérique cible et attendez une minute qu'il donne quelques résultats. Le paramètre "w" détermine le nombre de secondes entre les échantillons. En l'augmentant, vous obtiendrez une meilleure estimation moyenne avec moins de variance, mais vous devrez attendre plus longtemps.Utilisez
ps
pour déterminer combien de tempsdd
a fonctionné:ps -xo etime,command | grep dd
Convertissez cette valeur en secondes pour obtenir le nombre total de secondes d'exécution.
Obtenez la taille de l'appareil en Mo avec:
grep ada0 /var/run/dmesg.boot
Remplacez le nom de votre périphérique cible par
ada0
. Divisez le résultat par le taux d'écriture moyen pour obtenir le temps total de transfert en secondes. Soustrayez le temps écoulé pour obtenir le temps restant.Cette stratégie ne fonctionne que si
dd
elle écrit en continu au taux d’écriture moyen actuel depuis le début. Si d'autres processus se font concurrence pour les ressources de la CPU ou d'E / S (y compris le bus d'E / S), le taux de transfert peut alors être réduit.la source
J'ai commencé à utiliser dcfldd (1), qui montre mieux les opérations de dd.
la source
Pendant
dd
son exécution, je lance ceci dans un autre terminal en tant que root:Il imprime l’
dd
état toutes les 1 secondes dans la fenêtre du terminal d’origine où ildd
s’exécute et se ferme lorsque la commande est terminée.la source
Vous pouvez utiliser
progress
ce qui, en particulier, montre la progression d'une coursedd
. Il utilise/proc/$pid/fd
et/proc/$pid/fdinfo
que vous pouvez également surveiller à la main.la source
La
wchar
ligne (caractères écrits) dans/proc/$pid/io
peut vous donner des informations précises sur ledd
processus. Tant que cela change, votredd
fonctionne toujours!Voici un joli petit script php, que vous pouvez sauvegarder puis exécuter avec
php filename.php
pendant l'dd
affichage des octets écrits. Le bel avantage de regarder/proc/$pid/io
pluskill -USR1 $(pidof dd)
est que vous ne devez pas passer entre les bornes, ce qui est pas toujours une option.la source