Ich habe kürzlich festgestellt, dass wir cat
so viel verwenden können dd
, und es ist tatsächlich schneller alsdd
Ich weiß, dass dd
dies beim Umgang mit Bändern nützlich war, bei denen die Blockgröße tatsächlich für die Korrektheit und nicht nur für die Leistung von Bedeutung war. Gibt es heutzutage Situationen, in denen dd
etwas cat
nicht geht? (Hier würde ich einen Leistungsunterschied von weniger als 20% für irrelevant halten.)
Konkrete Beispiele wären schön!
Antworten:
In der Darstellung
dd
handelt es sich um ein Tool eines IBM-Betriebssystems, dessen fremdes Erscheinungsbild (Übergabe von Parametern) beibehalten wurde und das einige sehr selten verwendete Funktionen ausführt (wie die Konvertierung von EBCDIC in ASCII oder die Umkehrung von Endianness… ist heutzutage nicht mehr erforderlich).Ich pflegte zu denken , dass
dd
war schneller zum Kopieren großer Datenblöcke auf derselben Platte (aufgrund einer effizienteren Nutzung der Pufferung), aber das ist nicht wahr , zumindest auf dem heutigen Linux - Systemen.Ich denke, einige der
dd
Optionen sind nützlich, wenn es um Bänder geht, bei denen das Lesen wirklich in Blöcken erfolgt (Bandtreiber verbergen die Blöcke auf dem Speichermedium nicht so wie Plattentreiber). Aber ich kenne die Einzelheiten nicht.Eine Sache
dd
, die (leicht) von keinem anderen POSIX-Tool erledigt werden kann, ist , die ersten N Bytes eines Streams zu nehmen. Viele Systeme können damit umgehenhead -c 42
, aberhead -c
obwohl es üblich ist, ist es nicht in POSIX (und ist heute nicht verfügbar unter zB OpenBSD). (tail -c
ist POSIX.) Auch wennhead -c
vorhanden, liest es möglicherweise zu viele Bytes aus der Quelle (da es intern die Stdio-Pufferung verwendet). Dies ist ein Problem, wenn Sie aus einer speziellen Datei lesen, bei der nur das Lesen Auswirkungen hat. (Aktuelle GNU-Coreutils lesen die genaue Anzahl mithead -c
, FreeBSD und NetBSD verwenden jedoch stdio.)Im Allgemeinen wird
dd
eine Schnittstelle zur zugrunde liegenden Datei-API bereitgestellt, die für Unix-Tools einzigartig ist: Siedd
kann eine Datei nur zu einem bestimmten Zeitpunkt überschreiben oder abschneiden oder in einer Datei suchen . (Dies ist eine einzigartige Fähigkeit, und es ist eine große; seltsamerweise ist sie am besten für Dinge bekannt, die andere Werkzeuge tun können.)dd
dd
>
Umleitung auch in der Shell verwenden.>>
Umleitung in der Shell oder mit anhängentee -a
.Wenn Sie eine Datei kürzen möchten, indem Sie nach einem bestimmten Zeitpunkt alle Daten entfernen , wird dies vom zugrunde liegenden Kernel und der C-API über die
truncate
Funktion unterstützt, jedoch von keinem Befehlszeilentool mit Ausnahme vondd
:Wenn Sie Daten in der Mitte einer Datei überschreiben möchten, ist dies in der Underyling-API ebenfalls möglich, indem Sie die Datei zum Schreiben öffnen , ohne sie abzuschneiden (und
lseek
gegebenenfalls an die gewünschte Position zu verschieben). Sie können jedoch nurdd
eine Datei ohne öffnen Abschneiden oder Anhängen oder Suchen in der Shell ( komplexeres Beispiel ).Also ... Als Systemwerkzeug
dd
ist es so ziemlich nutzlos. Als Textverarbeitungsprogramm (oder Binärdatei) ist es sehr wertvoll!quelle
trunc
undseek
verwendbar vondd
).dd
Kann Binärdaten aus nicht durchsuchbaren Dateideskriptoren lesen, ohne dass ungelesene Daten aufgrund der Stdio-Pufferung zerstört werden. Ein Beispiel finden Sie hier: etalabs.net/sh_tricks.htmlhead -c N
Anruferead
und geht nie über N. in NetBSD 5.1,head -c
fordertgetc
. In FreeBSD 7.4,head -c
fordertfread
.dd
stellt O_DIRECT (usw.) auch für Shell-Skripte zur Verfügung, was meiner Meinung nach ebenfalls einzigartig ist.truncate
ermöglicht das Abschneiden oder Erweitern von Dateien, wodurch eine andere Verwendung von wegfälltdd
.Der
dd
Befehl enthält VIELE Optionen, die cat nicht verarbeiten kann. Vielleicht ist cat in Ihren Anwendungsfällen ein brauchbarer Ersatz, aber kein Ersatz für dd.Ein Beispiel wäre,
dd
einen Teil von etwas zu kopieren, aber nicht das Ganze. Vielleicht möchten Sie einige der Bits aus der Mitte eines ISO-Images oder der Partitionstabelle von einer Festplatte basierend auf einem bekannten Speicherort auf dem Gerät entfernen. Mit könnendd
Sie die Start-, Stopp- und Mengenoptionen angeben, die diese Aktionen ermöglichen.Diese Optionen
dd
machen es für feinkörnige Datenmanipulationen unverzichtbar, wohingegencat
* nur ganze Dateiobjekte, Geräte oder Streams verarbeiten kann.* Wie Gilles in den Kommentaren angemerkt hat, ist es möglich
cat
, Teile von etwas mit anderen Werkzeugen zu isolieren, arbeitet abercat
immer noch mit dem gesamten Objekt.quelle
dd
Hat eigentlich nichts mit Low-Level-Geräten zu tun, es braucht einen Einstieg/dev
wie bei den anderen. Sie können eine ganze Partition mitcat
oder einen Teil davon mit kopierentail +c $(($start+1)) | head -c $count
.cat | head | tail
, um die letzten MB abzurufen, wird der Mond durch das Hochdrehen der Festplatte näher an der Erde angesaugt.Bisher hat noch niemand erwähnt, dass Sie mit dd spärliche Dateien erstellen können , diese
truncate
können jedoch auch für den gleichen Zweck verwendet werden.Dies geschieht fast augenblicklich und erstellt eine beliebige große Datei, die beispielsweise als Loopback-Datei verwendet werden kann:
Das Schöne ist, dass es anfangs nur einen einzigen Block Speicherplatz belegt und danach nur noch nach Bedarf wächst (die ext4-Formatierung einer 10-GB-Datei belegt auf meinem System 291 MB). Verwenden Sie
du
diese Option , um zu ermitteln, wie viel Speicherplatz tatsächlich verwendetls
wird. Sie gibt nur die maximale Größe an, auf die die Datei anwachsen kann.quelle
ls -ls
zeigt dir die spärliche Größe.dd of=sparse-file bs=1 count=0 seek=10G
wäre äquivalent zutruncate -s 10GB sparse-file
. Verwirrenderweisetruncate
unddd
genau entgegengesetzte Interpretation vonGB
vs.G
...man dd
sagt:MB =1000*1000, M =1024*1024
und so weiter. Undman truncate
sagt: EsMB 1000*1000, M 1024*1024
gibt also keinen Unterschied. Ich benutze beidedd
undtruncate
aus dem GNU Coreutils. Das solltest du auch! :-)Ein häufiges Beispiel ist das Überschreiben bestimmter Segmente einer Festplatte mit etwas. Beispielsweise möchten Sie Ihren MBR möglicherweise mit folgendem Befehl löschen:
Sie können damit auch leere Dateien erstellen (z. B. für Loop-Disk-Images):
quelle
head -c
? Bitte teilen Sie einen Benchmark !dd
ist sehr nützlich, um den Bootsektor einer Festplatte oder eines anderen Speichergeräts zu sichern (dd if=/dev/sda of=boot_sector.bin bs=512 count=1
) und ihn später neu zu schreiben (dd if=boot_sector.bin of=/dev/sda
). Es ist ebenfalls nützlich, um die Header verschlüsselter Volumes zu sichern.cat
Vielleicht könnte ich das tun, aber ich würde es nicht dem Teil des Umschreibens anvertrauen. Es ist schwierig,cat
nur eine bestimmte Anzahl von Bytes zu lesen / schreiben.quelle
Ich hatte kürzlich Grund, zum ersten Mal in meiner Linux-Geschichte einige Partitionen mit mehreren hundert GB zu klonen (vgl.
cp -ar
Oderrsync
die mir schon oft gute Dienste geleistet haben). Natürlich habe ich mich gewandtdd
, weil jeder weiß, dass du das verwendest ... und war entsetzt über die Aufführung. Ein bisschen googeln führte mich bald zuddrescue
, was ich jetzt schon ein paar Mal benutzt habe und hervorragend funktioniert (viel schneller als dd).quelle
ddrescue
ist großartig, insbesondere, um Daten von fehlerhaften Festplatten abzurufen.Hier sind einige DD-Tricks, die ich mir über die Jahre ausgedacht habe.
Ausschneiden und Einfügen bei unfreundlichem oder nicht interaktivem Bash
Wenn Sie sich in einer Situation befinden, in der EOF / ^ D / ^ F nicht erkannt wird, können Sie dd verwenden, um Textdateien auf einen Host zu übertragen. Da es nach einer festgelegten Anzahl von Bytes automatisch aufhört zu lesen.
Ich habe dies erst letztes Jahr während einer Sicherheitsübung verwendet, bei der es uns möglich war, Nicht-Tty-Shells auf einem Remote-Host abzurufen und Dateien zu übertragen.
Tatsächlich habe ich sogar ein paar Binärdateien erstellt, indem ich sie mit base64 codiert und ein langsames, aber zuverlässiges Base64-Decodierungsskript für reine Bash-Dateien verwendet habe.
Ein super cooler Trick ist, dass während dd läuft, wenn Sie ein USR1-Signal senden, es seinen aktuellen Status ausgibt (gelesene Bytes, Bytes pro Sekunde ..)
Universeller Durchsatzstatusfilter
Ich habe dies geschrieben, um als reiner Bash-Fortschrittsfilter für jedes Programm zu fungieren, das Daten über stdout ausgibt. (Hinweis: Fast alles gibt Daten über stdout aus. Bei Programmen, die dies nicht tun, können Sie schummeln, wenn sie Sie nicht mit / dev / stdout als Dateinamen belästigen. Grundsätzlich gilt jedoch, dass Sie jedes Mal X erhalten Anzahl der Bytes, Drucken von Hash-Markierungen (wie bei FTP der alten Schule, wenn der Hash-Modus aktiviert war)
(Anmerkung) Die Sache mit der Fortschrittsdatei ist lahm, dies war größtenteils ein Proof of Concept. Wenn ich es überarbeite, würde ich nur eine Variable verwenden.
Slice-and-Dice-Dateien mit anonymen Shell-Dateihandles
Hier ist ein extrem pseudocodiertes Beispiel dafür, wie Sie eine signierte TAR-Datei haben können, die Sie ohne Fehler extrahieren können, indem Sie die TAR-Eingabe über ein anonymes Dateihandle bereitstellen - ohne TMP-Dateien zum Speichern von Teildateidaten zu verwenden.
Die Antwort lautet: Ich finde dd unglaublich nützlich. Und dies sind nur die drei Beispiele, die mir auf den ersten Blick einfallen.
quelle
Sie können einige Ausgabeinhalte umleiten. Es ist besonders nützlich, wenn Sie schreiben müssen mit
sudo
:Außerdem ist
sudo
es äquivalent zu:oder dazu:
quelle