
Angenommen, ich habe ein Laufwerk, das an einer beliebigen Stelle einen fehlerhaften Superblock (oder Block) hat. Es ist ein riesiges Laufwerk, 1-8 TB. Es lässt sich nicht in ext3 formatieren, also schreibe ich es voller Nullen, damit ich es richtig formatieren kann. lsblk -f
zeigt seinen FSTYPE als leere Zeichenfolge an.
Gibt es einen Grund, den folgenden Befehl nicht auszuführen?
sudo dd if=/dev/zero bs=10G status=progress of=/dev/bad_disk
Antwort1
Ich vermute, dass Sie das Programm nicht unterbrechen können, während es einen Block schreibt, und dass das Schreiben von 10 GB viel Zeit in Anspruch nimmt. Die Leistungsverbesserung mit der Blockgröße stagniert meiner Erfahrung nach ziemlich schnell, daher würde ich bei vernünftigeren Größen bleiben (4 MB ...).
Antwort2
Meine Antwort bezieht sich genau auf den Titel:
Gibt es Argumente gegen die Verwendung
dd
mitbs=10G
?
Aber in deinem Fall ist es irgendwieXY-Problem. Das zugrunde liegende Problem (fehlerhafte Blöcke) sollte mit smartctl
und angegangen werden badblocks
, nicht mit dd
.
Speichernutzung
Dies ist eine andere Antworterwähnt „Leistungsverbesserung mit Blockgröße“:
Leistungsverbesserungen mit Blockgröße erreichen relativ schnell ein Plateau
Stimmt, aber das ist nur der bs
Teil der Geschichte, der „nahe Null“ ist. Im Kontext der Frage sollten wir den bs
Teil „geht gegen unendlich“ erzählen.
In der realen Welt bricht das Plateau bei einigen großen tatsächlich zusammen bs
. Mit bs=10G
versucht das Tool, 10 GiB Speicher zuzuweisen. Dies kann gelingen oder auch nicht (Speicher erschöpft). Selbst wenn es gelingt, gibt es immer noch Probleme:
- Bei anderen Prozessen wird der zugewiesene Speicher möglicherweise auf die Festplatte ausgelagert.
- Der Puffer
dd
kann auf die Festplatte ausgelagert werden. Das Tool verwendet ihn ständig, daher würde das Betriebssystem wahrscheinlich zuerst andere (nicht kürzlich aufgerufene) Daten auslagern. Wenn Sie jedoch 8 GiB RAM und 16 GiB Swap haben, gibt es keine Möglichkeit,bs=10G
RAM unterzubringen. - Wenn der Speicher später benötigt wird,OOM-Killer könnte eingreifen. Ihr
dd
Prozess ist möglicherweise der erste, der beendet wird.
Dies hängt natürlich alles davon ab, wie viel RAM und Swap-Speicher Sie haben und was andere Prozesse tun.
Hinweise
Ich persönlich bevorzuge bs
eine Größe, die in 0,1-1 Sekunde übertragen wird; oder kleiner, bs
wenn die RAM-Nutzung ein Problem sein könnte. Auf diese Weise kann ich dd
fast sofort unterbrechen (das ist der Kern derbereits erwähnte Antwort). Wenn die Hardwarebeschränkungen eine Geschwindigkeit dd
von über 10 GiB/s zulassen würden und ich über 40 GiB freien RAM hätte, würde ich in Betracht ziehen bs=10G
. Zu Hause komme ich kaum jemals über bs=64M
.
Ein Anwendungsfall, der bs=10G
nützlich sein kann, ist, wenn Sie verarbeiten möchtengenauso viele Daten wie Sie verbrauchen count=1
(oder zB 5 mal so viel: count=5
).Jedochin der Praxis mit großen bs
können Sie bekommenweniger, es sei denn, Sie verwenden iflag=fullblock
(siehediese Antwort). Aus Speichergründen würde ich bs
sowieso auf eine kleinere Größe umrechnen.