dd: partition löschen ohne explizite angabe von größe

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
reox
Beiträge: 2530
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

dd: partition löschen ohne explizite angabe von größe

Beitrag von reox » 08.12.2020 13:34:53

Ich möchte eine Partition mit nullen überschreiben, zB:

Code: Alles auswählen

# lvcreate test -L 10G vmpool
# dd if=/dev/zero of=/dev/vmpool/test
Das funktioniert soweit, allerdings erhalte ich schlussendlich einen Fehler:

Code: Alles auswählen

dd: Fehler beim Schreiben von '/dev/vmpool/test': Auf dem Gerät ist kein Speicherplatz mehr verfügbar
20971521+0 Datensätze ein
20971520+0 Datensätze aus
10737418240 Bytes (11 GB, 10 GiB) kopiert, 43,627 s, 246 MB/s
# echo $?
1
Nun kann ich per fdisk die anzahl der sektoren und die sektorengröße auslesen und das dd mitgeben:

Code: Alles auswählen

# fdisk -l /dev/vmpool/test
Festplatte /dev/vmpool/test: 10 GiB, 10737418240 Bytes, 20971520 Sektoren
Einheiten: Sektoren von 1 * 512 = 512 Bytes
Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes
E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes
# dd if=/dev/zero of=/dev/vmpool/test bs=512 count=20971520
20971520+0 Datensätze ein
20971520+0 Datensätze aus
10737418240 Bytes (11 GB, 10 GiB) kopiert, 41,5659 s, 258 MB/s
# echo $?
0
Die Frage ist nun: Kann ich das auch ohne die explizite Angabe erreichen, so dass dd einfach alles vollschreibt aber ohne den Fehler zu werfen?

DeletedUserReAsG

Re: dd: partition löschen ohne explizite angabe von größe

Beitrag von DeletedUserReAsG » 08.12.2020 13:38:45

reox hat geschrieben: ↑ zum Beitrag ↑
08.12.2020 13:34:53
Kann ich das auch ohne die explizite Angabe erreichen, so dass dd einfach alles vollschreibt aber ohne den Fehler zu werfen?
Mit dd alleine naturgemäß nicht – das stammt noch aus der Zeit der Philosophie „Ein Tool – ein Job“, und was du willst, ist nicht sein Job.

Aber es sollte ’ne Kleinigkeit sein, sich da ein kleines Wrapperscript zu basteln.

reox
Beiträge: 2530
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: dd: partition löschen ohne explizite angabe von größe

Beitrag von reox » 08.12.2020 14:42:19

Ja, das bekomm ich hin ;)

Code: Alles auswählen

#!/bin/bash

LVMNAME=/dev/vmpool/test

PARTED_OUT=$(parted -s -m $LVMNAME 'unit s print' 2>/dev/null | head -n 2 | tail -n 1)
if [ -z "$PARTED_OUT" ]; then
    echo "ERROR: Could not get information from parted!"
    exit 2
fi
SECTORS=$(echo "$PARTED_OUT" | cut -d ':' -f 2 | tr -d 's')
BLOCKSIZE=$(echo "$PARTED_OUT" | cut -d ':' -f 4)
if [ -z "$SECTORS" ]; then
    echo "ERROR: Could not read sector count from $LVNAME"
    exit 2
fi

if [ -z "$BLOCKSIZE" ]; then
    echo "ERROR: Count not read blocksize from $LVNAME"
    exit 2
fi
dd if=/dev/zero of=$LVMNAME bs=$BLOCKSIZE count=$SECTORS status=progress
Wenns irgendwie effizienter geht, dann her damit ;)

Benutzeravatar
MSfree
Beiträge: 11610
Registriert: 25.09.2007 19:59:30

Re: dd: partition löschen ohne explizite angabe von größe

Beitrag von MSfree » 08.12.2020 14:52:39

reox hat geschrieben: ↑ zum Beitrag ↑
08.12.2020 13:34:53
Ich möchte eine Partition mit nullen überschreiben, zB:

Code: Alles auswählen

# lvcreate test -L 10G vmpool
# dd if=/dev/zero of=/dev/vmpool/test
Das funktioniert soweit, allerdings erhalte ich schlussendlich einen Fehler:

Code: Alles auswählen

dd: Fehler beim Schreiben von '/dev/vmpool/test': Auf dem Gerät ist kein Speicherplatz mehr verfügbar
20971521+0 Datensätze ein
20971520+0 Datensätze aus
10737418240 Bytes (11 GB, 10 GiB) kopiert, 43,627 s, 246 MB/s
# echo $?
1
Der Fehler bedeutet nur, daß dd versucht hat, über das Partitionsende hinaus zu schreiben, was natürlich nicht geht und daher einen Schreibfehler erzeugt.

Es hat also alles funktioniert, der Fehler kann in diesem Fall als Erfolgsmeldung interprätiert werden.

reox
Beiträge: 2530
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: dd: partition löschen ohne explizite angabe von größe

Beitrag von reox » 08.12.2020 15:32:10

MSfree hat geschrieben: ↑ zum Beitrag ↑
08.12.2020 14:52:39
Es hat also alles funktioniert, der Fehler kann in diesem Fall als Erfolgsmeldung interprätiert werden.
Naja - mein script sieht das anders :)
Ich hab den dd aufruf in einem script drin und schaue ob es funktioniert hat. Nachdem dd mit exit code 1 beendet wird, wird es als fehler interpretiert und das script beendet sich - auch wenn dd natürlich das ziel vollgeschrieben hat.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: dd: partition löschen ohne explizite angabe von größe

Beitrag von heisenberg » 08.12.2020 15:44:17

Das ist schon nachvollziehbar, dass man einen Fehler nicht einfach so ignorieren will. Es könnte ja mal ein anderer Fehler auftreten, mit dem gleichen Returncode. Oder der Fehler "Kein Speicherplatz verfügbar" hat eine andere Ursache.

Zum Bestimmen der Größe des Blockdevices gibt es noch blockdev --getsize64 /dev/... (Debianutil-linux).

Zu Überschreiben gibt es noch das tool Debianscrub. Das kann auch mit Nullen überschreiben(Methode fillzero).

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: dd: partition löschen ohne explizite angabe von größe

Beitrag von JTH » 08.12.2020 16:08:01

shred kann auch ne Variante sein (mit Einschränkung, siehe info/manpage), das würd alles in einem Schritt machen. Stammt aus Debiancoreutils, also garantiert installiert. z.B.:

Code: Alles auswählen

shred -n0 -v -z /dev/vmpool/test

wipefs aus Debianutil-linux ist in dem Zusammenhang auch immer mal hilfreich, wenn Partitionen/-tabellen nur unbenutzbar sein sollen, aber nicht komplett genullt werden müssen.
Manchmal bekannt als Just (another) Terminal Hacker.

reox
Beiträge: 2530
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: dd: partition löschen ohne explizite angabe von größe

Beitrag von reox » 08.12.2020 16:22:29

Ja gibt genug andere tools, dd sollte halt meistens eh da sein. shred schaut brauchbar aus. scrub meint es geht nicht:

Code: Alles auswählen

# scrub -p fillzero /dev/vmpool/test
scrub: using Quick Fill with 0x00 patterns
scrub: warning: /dev/vmpool/test is zero length
Oder hab ich da was in der manpage übersehen? Ich seh jetzt nichts, dass man da extra bei blockdevices was angeben müsste

shred scheint hingegen zu funktionieren und wenns in coreutils ist, umso besser :)

Antworten