Hdparm

Aus DebianforumWiki
Zur Navigation springen Zur Suche springen
Wiki ‹ Andere Hardware ‹ Hdparm


Getestet.png Getestet: Dieser Hinweis soll dir dabei helfen, zu entscheiden, ob dieser Artikel auf deinem System funktionieren wird oder nicht. Solltest du feststellen, dass dieser Artikel bei einer ungetestet Version funktioniert, kannst du das gerne hier korrigieren oder im Forum anmerken.




Laufwerksoptimierung mit hdparm

Dieser Artikel soll einen Überblick der Möglichkeiten von hdparm aufzeigen und den praktischen Einsatz beschreiben. Hdparm zeigt und setzt Parameter von Laufwerken, die am (E)IDE,- SATA und SAS Bus angeschlossen sind. Hintergründlich nutzen diese den ATA/ATAPI Befehlssatz. Deshalb ist es nur bei wenigen IDE zu USB Bridge Adaptern möglich, die dahinter liegende Festplatte anzusprechen. Um Adapter/Laufwerke zu finden, welche die nötige "ATA command pass through"-Funktionalität bieten, kann man sich an dieser Liste orientieren. Festplatten, SSDs und CD/DVD/Blue-Ray-Laufwerke sind typische Geräte, die angesprochen werden können.
Das Paket Debianpackage.png hdparm kann normal über die Paketverwaltung installiert werden. Hdparm muss mit Rootrechten ausgeführt werden.
Im Gegensatz zum Pendant Debianpackage.png blktool (Skript-freundlicher) kann hdparm eine ganze Menge mehr (außer SCSI), lässt sich konfigurieren und bringt ein eigenes Initskript mit.
Weitere ähnliche Werkzeuge finden sich in den Paketen Debianpackage.png sdparm und Debianpackage.png sg3-utils.

Hinweis.png Hinweis: Wenn der Chipsatz nur mit dem libata Treiber unterstützt wird, lassen sich viele Funktionen, wie DMA, nicht mehr abrufen und beeinflussen. Das betrifft nicht nur hdparm, sondern ist generell so. Zu erkennen daran, dass selbst IDE Laufwerke nicht mehr als hdX, sondern als SCSI Gerät, also sdX erkannt werden. SATA läuft unabhängig davon immer mit DMA.


Warnung.png Warnung: Hdparm ist grundsätzlich ein Werkzeug für fortgeschrittene Nutzer. Bei allen Beispielen muss darauf geachtet werden, dass Device-Namen auf das eigene System angepasst und die Hinweise der Manpage beachtet werden.



Laufwerksinformationen holen und deuten

Es ist nötig, sich erst einmal über die Fähigkeiten seines Laufwerkes zu informieren. Der hdparm-Aufruf ohne Parameter, ist gleichbedeutend mit „-v“, was wiederum diese Optionen impliziert: „-acdgkmur“ (unterscheidet sich leicht von älteren Versionen).

Die Eingabe bringt zum Beispiel (hier eine 250 GB IDE Notebook Festplatte):

root@debian:~# hdparm /dev/hda
/dev/hda:

 multcount     = 16 (on)
 IO_support    =  3 (32-bit w/sync)
 unmaskirq     =  0 (off)
 using_dma     =  1 (on)
 keepsettings  =  0 (off)
 readonly      =  0 (off)
 readahead     = 256 (on)
 geometry      = 30401/255/63, sectors = 488397168, start = 0

Einige Daten wie DMA , multiple sector count, read-ahead und die Geometrie sind so abgreifbar.

-i
Mehr Informationen bekommt man mit „-i“. Diese wurden zum Start erfasst und ändern sich i.d.R. nicht mehr.
root@debian:~# hdparm -i /dev/hda
/dev/hda:

 Model=WDC WD2500BEVE-00WZT0, FwRev=01.01A01, SerialNo=WD-WXE0E49V1027
 Config={ HardSect NotMFM HdSw>15uSec SpinMotCtl Fixed DTR>5Mbs FmtGapReq }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=50
 BuffType=unknown, BuffSize=8192kB, MaxMultSect=16, MultSect=16
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=488397168
 IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio3 pio4 
 DMA modes:  mdma0 mdma1 mdma2 
 UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5 
 AdvancedPM=yes: unknown setting WriteCache=enabled
 Drive conforms to: Unspecified:  ATA/ATAPI-1,2,3,4,5,6,7

 * signifies the current active mode

Erfahren lassen sich so:

Parameter Wert
Modelbezeichnung WDC WD2500BEVE-00WZT0
Firmware Version 01.01A0
Seriennummer WD-WXE0E49V1027
Anmerkung: Manche CD/DVD Laufwerke haben keine Seriennummer und liefern hier nur die des eingelegten Mediums.
Laufwerkscache BuffSize=8192kB
Anmerkung: Die Größe, welche Das Laufwerk selbst meldet, ist oft etwas geringer, als der Hersteller angibt. Das kann entweder daran liegen, dass der Wert schlicht falsch ist, oder ein Teil des Caches vom Laufwerkscontroller für interne Zwecke genutzt wird.
maximale Multsect MaxMultSect=16
aktuelle Multsect MultSect=16
Geometrie CurCHS=16383/16/63
LBA Unterstützung LBA=yes
maximale LBA Sektoren LBAsects=488397168
unterstützte und aktivierte PIO Modes pio0 pio3 pio4
unterstützte und aktivierte UDMA Modes udma0 udma1 udma2 udma3 udma4 *udma5
APM Unterstützung AdvancedPM=yes
Schreibcache-Status WriteCache=enabled
unterstützte ATA Version(en) Unspecified: ATA/ATAPI-1,2,3,4,5,6,7

Aktivierte/gesetzte Eigenschaften sind mit einem "*" gekennzeichnet.

-I
Da sich diese Werte zur Laufzeit geändert haben können, ist es möglich, mit "-I" die "Identify-Informationen" vom Laufwerk zu holen, welche wesentlich umfangreicher ausfallen.
root@debian:~# hdparm -I /dev/hda
/dev/hda:

ATA device, with non-removable media
        Model Number:       WDC WD2500BEVE-00WZT0                   
        Serial Number:      WD-WXE0E49V1027
        Firmware Revision:  01.01A01
Standards:
        Supported: 8 7 6 5 
        Likely used: 8
Configuration:
        Logical         max     current
        cylinders       16383   16383
        heads           16      16
        sectors/track   63      63
        --
        CHS current addressable sectors:   16514064
        LBA    user addressable sectors:  268435455
        LBA48  user addressable sectors:  488397168
        Logical/Physical Sector size:           512 bytes
        device size with M = 1024*1024:      238475 MBytes
        device size with M = 1000*1000:      250059 MBytes (250 GB)
        cache/buffer size  = 8192 KBytes
Capabilities:
        LBA, IORDY(can be disabled)
        Standby timer values: spec'd by Standard, with device specific minimum
        R/W multiple sector transfer: Max = 16  Current = 16
        Advanced power management level: 254
        Recommended acoustic management value: 128, current value: 254
        DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5 
             Cycle time: min=120ns recommended=120ns
        PIO: pio0 pio1 pio2 pio3 pio4 
             Cycle time: no flow control=120ns  IORDY flow control=120ns
Commands/features:
        Enabled Supported:
           *    SMART feature set
                Security Mode feature set
           *    Power Management feature set
           *    Write cache
           *    Look-ahead
           *    Host Protected Area feature set
           *    WRITE_BUFFER command
           *    READ_BUFFER command
           *    NOP cmd
           *    DOWNLOAD_MICROCODE
           *    Advanced Power Management feature set
                SET_MAX security extension
           *    Automatic Acoustic Management feature set
           *    48-bit Address feature set
           *    Device Configuration Overlay feature set
           *    Mandatory FLUSH_CACHE
           *    FLUSH_CACHE_EXT
           *    SMART error logging
           *    SMART self-test
           *    General Purpose Logging feature set
           *    64-bit World wide name
           *    IDLE_IMMEDIATE with UNLOAD
           *    Segmented DOWNLOAD_MICROCODE
           *    SMART Command Transport (SCT) feature set
           *    SCT Long Sector Access (AC1)
           *    SCT LBA Segment Access (AC2)
           *    SCT Error Recovery Control (AC3)
           *    SCT Features Control (AC4)
           *    SCT Data Tables (AC5)
                unknown 206[13] (vendor specific)
Security: 
        Master password revision code = 65534
                supported
        not     enabled
        not     locked
                frozen
        not     expired: security count
        not     supported: enhanced erase
        96min for SECURITY ERASE UNIT. 
Logical Unit WWN Device Identifier: 50014ee202e2a687
        NAA             : 5
        IEEE OUI        : 0014ee
        Unique ID       : 202e2a687
HW reset results:
        CBLID- above Vih
        Device num = 0 determined by the jumper
Checksum: correct

Im Abschnitt "Configuration" sind die Angaben von logischer und physischer Sektorgröße von aktuell hoher Bedeutung. Sind diese identisch und von bisher typischen 512 Byte, ist nichts zu beachten. Jedoch kann die physische, im Zuge größerer Festplattenkapazitäten, höherer Datendichten oder anderer Speicher-Technologien, ein vielfaches davon sein. Beispielsweise eine ältere 1" CF-HDD:

	Logical  Sector size:                   512 bytes
	Physical Sector size:                  1024 bytes
	device size with M = 1024*1024:        3906 MBytes
	device size with M = 1000*1000:        4095 MBytes (4 GB)

Oder eine moderner 1TB HDD mit Advanced Format (AF):

        Logical  Sector size:                   512 bytes
        Physical Sector size:                  4096 bytes
        Logical Sector-0 offset:                  0 bytes
        device size with M = 1024*1024:      953869 MBytes
        device size with M = 1000*1000:     1000204 MBytes (1000 GB)

Um Geschwindigkeitseinbußen oder gar schnellere Alterung einer SSD zu vermeiden, müssen Partionsgrenzen diesen Sektorgrößen angepasst werden. Siehe hierzu im Forum: Diskussion 126050, Diskussion 791502, Diskussion 806843 und hier: Ubuntuusers Wiki Alignment.


Zusätzlich gibt es z.B. unter „Commands/features“ viele Einzelheiten über erweiterte Befehle/Funktionen. Zum Beispiel über S.M.A.R.T., HPA, Security Feature Set, APM, AAM, GP-Logging, SCT usw. Die aufgelisteten Eigenschaften können sich stark, in Abhängigkeit von Gerätemodell, hdparm-Version und anderer Hardware, unterscheiden.

Leistungsoptimierungen

Insbesondere bei älterer Hardware kann es vorkommen, dass sich das System träge anfühlt, Kopiervorgänge ewig dauern oder Videos beim Abspielen ruckeln. Da die Festplatte oft das langsamste Element in einem PC ist, sollte man hier mit der Suche ansetzen.

Durchsatztest

Hinweis.png Hinweis: Um hier wirklich akkurate und realistische Ergebnisse zu erhalten, sollte man sicherstellen, dass zum Zeitpunkt der jeweiligen Tests keine anderen Anwendungen intensiv genau das betreffende Laufwerk oder die CPU belasten (z.B. im Hintergrund arbeitende Indizierungsdienste, Backups, automatische Updates usw.). Das kann man sehr praktisch mit Debianpackage.png iotop, Debianpackage.png atop, Debianpackage.png htop, top oder anderen Tools feststellen.


Hierfür dienen die hdparm-Schalter „-t“ und „-T“.

-T
Testet die Performance des System Caches. Hierbei wird ohne Festplattenzugriff direkt aus dem Linux Puffer Cache gelesen und somit der Durchsatz des Prozessors, Caches und Arbeitsspeichers bestimmt. Der Aufruf sollte 2 oder mehrmals wiederholt werden, um einen stabilen Wert zu erhalten. Auch wenn es keinen Einfluss hat, muss trotzdem ein device angegeben werden.
Beispielsweise auf einem modernen System mit Mehrkern-CPU und DDR3 Ram könnte die Ausgabe so aus sehen:
root@debian:~# hdparm -T /dev/sda
/dev/sda:
Timing cached reads: 6678 MB in 2.00 seconds = 3345.76 MB/sec
Auf einem älteren Pentium 4 mit DDR1 Speicher:
root@debian:~# hdparm -T /dev/hda
/dev/hda:
Timing cached reads: 540 MB in 2.01 seconds = 269.23 MB/sec
-t
Dieser Test liest direkt über den System Cache vom angegebenen Laufwerk. Hierbei ist zu beachten, dass dies die reine Netto-Datenrate zwischen Laufwerk und Chipsatz und dem vorhandenen Kernel Modul ist. Deshalb sollte der Test wie bei „-T“ mehrmals wiederholt werden, wobei möglichst darauf geachtet werden sollte, dass keine weiteren Festplattenzugriffe stattfinden, die das Ergebnis verfälschen würden.
--direct
Dieser Schalter, in Verbindung mit „-t“, übergeht selbst den System Cache und liest so direkt vom Laufwerk. Der Wert gibt so den reinen Durchsatz, welchen Laufwerk, Chipsatz und Treiber bieten.
Hinweis.png Hinweis: Erst ab hdparm Version 5.7 und Debian Sarge vorhanden.


--offset
Hier kann ein Versatz in GiB angegeben werden, ab dem "hdparm -t" die Messung vor nimmt. Mit dem Hintergrund, dass mechanische Laufwerke (z.B. Festplatten) am Anfang, also im äußersten Bereich der Platter, schneller sind, als im Inneren. Das Verhalten kann mit diesem Schalter nachvollzogen werden. Bei Flash-Speichern gibt es womöglich keine Variationen.
Anmerkung: Der Offset sollte maximal ca. 10% unter der Laufwerkskapazität liegen.
Hinweis.png Hinweis: Erst ab hdparm Version 9.29 und Debian Squeeze vorhanden.


Beispiele an einer 500 GB SATA Festplatte:

root@debian:~# hdparm  -t /dev/sdc
/dev/sdc:
 Timing buffered disk reads: 230 MB in  3.00 seconds =  76.55 MB/sec

Ein normaler Test.

root@debian:~# hdparm  --direct -t /dev/sdc
/dev/sdc:
 Timing O_DIRECT disk reads: 232 MB in  3.02 seconds =  76.86 MB/sec

Mit --direct gibt es quasi keinen Unterschied auf diesem System.

root@debian:~# hdparm  --direct --offset 250 -t /dev/sdc
/dev/sdc:
 Timing O_DIRECT disk reads (offset 250 GB): 196 MB in  3.02 seconds =  64.83 MB/sec

Bei 250 GiB, also der halben Kapazität, geht der Durchsatz schon deutlich zurück.

root@debian:~# hdparm  --direct --offset 460 -t /dev/sdc
/dev/sdc:
 Timing O_DIRECT disk reads (offset 460 GB): 116 MB in  3.03 seconds =  38.34 MB/sec

Kurz vor Ende ist er auf dem Minimum. Das ist bei allen Festplatten ähnlich, ungefähr ein Unterschied von 50% zum äußersten Bereich.

Anmerkung: Die grafische Darstellung der Schreib- und Leserate sowie der Zugriffzeiten über den gesamten Bereich können seit Squeeze mit palimpsest aus dem Paket Debianpackage.png gnome-disk-utility durchgeführt werden.

Optimierungen

Die Wirkung und Unterstützung unterscheidet sich bei den Herstellern und Modellen. Die Schalter mit ihrer Funktion:

  • -a Stellt die Sektorenzahl für den FS-Readahead ein.
  • -A schaltet die „read-lookahead“-Funktion einer IDE-Festplatte ein oder aus. Normalerweise ist diese Funktion bereits aktiviert.
  • -c zeigt den Status oder aktiviert den (E)IDE-32-Bit-I/O-Support. Die Parameter hier für sind: 0, um den Support zu deaktivieren, und 1, um den Support zu aktivieren. Der Wert 3 aktiviert den 32-Bit-Support mit einer speziellen Sync-Sequenz, die von einigen Chipsets benötigt wird. Diese Option funktioniert mit fast allen Chipsets, bringt jedoch etwas mehr Overhead mit sich. Wird kein Parameter angegeben, so wird die aktuelle Einstellung angezeigt. Wirkt sich nur auf die Verbindung zwischen Chipsatz und PCI Bus aus.
  • -d zeigt, ob für das genannte Gerät der DMA-Modus benutzt wird, oder aktiviert/deaktiviert den Modus. Das Flag „using_dma“ funktioniert nur mit wenigen Kombinationen aus Festplatte und Controllern. Beispielsweise wird beim Intel Triton Chipset der Bus-Master-DMA-Modus in Verbindung mit vielen Festplatten unterstützt. Wenn möglich, sollte die Option -X34 zusammen mit -d1 benutzt werden, um sicherzustellen, dass das Laufwerk selbst den Multiword DMA Modus 2 unterstützt.
  • -E setzt die CD/DVD Geschwindigkeit. Wird normalerweise nicht benötigt und manchmal ignoriert.
  • -f synchronisiert und speichert den Cache-Puffer der Festplatte beim Beenden des Programms. Dieser Vorgang wird auch bei den Optionen -t und -T durchgeführt. Gleiches wird mit dem Konsolenbefehl "sync" bewirkt.
  • -F schreibt, wenn unterstützt, den Schreibcache des Laufwerks.
  • -g zeigt die Festplattengeometrie, also Angaben zu Zylinder, Köpfe, (Sektoren), die Größe (in Sektoren) des Laufwerkes und den Offset (in Sektoren) des Devices vom Anfang der Festplatte.
  • -k liest oder setzt das Flag "keep_settings_over_reset" für das Laufwerk. Wenn diese Option gesetzt ist, werden die Optionen -dmu über einen (Soft-) Reset hinaus gespeichert.
  • -K setzt das Flag "keep_features_over_reset". Das Setzen dieser Option rettet die Einstellungen -APSWXZ über einen (Soft-) Reset hinaus. Diese Option wird nicht von allen Laufwerken unterstützt.
  • -m Gibt an, wie viele Sektoren mit einem I/O Interrupt gleichzeitig geholt werden. Als Wert 0, 2 oder ein vielfaches davon.
  • -M stellt das Automatic Acoustic Management (AAM) ein. Steuert die Geschwindigkeit der Kopfbewegungen, was die Geräuschentwicklung und die Performance beim Suchen beeinflusst. Theoretisch von 1 ...255. Viele unterstützen nur drei Zustände, die oft auf 0 = aus; 128 = leise und 254 = laut fallen.
  • -p versucht, das IDE-Interface-Chipset auf den gewünschten PIO-Modus zu setzen oder den bestmöglichen PIO-Modus einzustellen.
  • -q unterdrückt die Ausgabe von Meldungen für die folgenden Optionen. Dies kann eingesetzt werden, wenn hdparm aus einer Datei beim Systemstart heraus aufgerufen wird. Diese Option hat keine Auswirkungen auf die Optionen -i, -v, -t oder -T.
  • -r liest oder setzt das „Read-Only-Flag“. Damit ist kein Schreiben auf das Laufwerk mehr möglich.
  • -u liest oder setzt das „interrupt-unmask“-Flag. Dies kann auf vielen Systemen die Reaktionszeit des Systems verbessern, ist aber mit Vorsicht einzusetzen, da nicht alle Chipsets diese Funktion richtig umsetzen können. Ein Wert von 1 aktiviert diese Funktion.
  • -W aktiviert oder deaktiviert bei einem IDE-Laufwerk die Funktion "write-caching" Erhöht die Schreibleistung, riskiert bei plötzlichem Stromausfall aber Datenverlust (da der Festplattencache nicht geschrieben werden kann). Dies ist Standardmäßig aktiviert.
  • -X setzt den IDE-Übertragungsmodus bei neueren (E)IDE/ATA2-Laufwerken. Diese Option wird meistens zusammen mit -d1 benutzt, um den DMA-Modus von/zu einem Laufwerk mit Chipsets, die dies unterstützen (beispielsweise Intel 430FX Triton), zu aktivieren. Dort können dann auch mit -X34 „Multiword-DMA-mode2“-Übertragungen aktiviert werden. Die Option -X66 aktiviert UltraDMA-Mode2-Übertragungen. Nützlich, um z.B. Übertragungsfehler (CRC Fehler) zu vermeiden und einem schrittweisen, automatischen herabsetzen durch ein schlechtes Kabel zuvor zu kommen.

Energieverwaltung

Für die Energieverwaltung lassen sich folgende Schalter verwenden.

  • -B setzt den APM Parameter, wenn es unterstützt wird. Die Implementierungen der Hersteller sind sehr verschieden, jedoch ist folgende Einteilung üblich: 1 ... 127 beinhaltet ein Spin-Down; 128 ... 254 nicht. Die aggressivste Einstellung ist 1, die schwächste 254. 255 schaltet APM aus, wenn möglich. Eine wichtige Einstellung, um die Lebensdauer bestimmter Festplatten zu verlängern; u.a. hier diskutiert: Diskussion 101050
  • -C zeigt den aktuellen „Power-Mode-Status“ einer IDE-Festplatte an. Dieser kann folgende Werte annehmen: „unknown“ - Das Laufwerk unterstützt dieses Kommando nicht; „active“/„idle“ - Normalbetrieb; „standby“ - Low Power Modus, die Festplatte dreht sich nicht oder „schläft“ sogar komplett. Die Optionen -S, -y, -Y und -Z können zur Veränderung der IDE-Power-Modes verwendet werden.
  • --idle-immediate versucht einen geringeren Energiemodus zu erreichen. Die Spindel läuft weiter.
  • --idle-unload versucht die Köpfe zu parken. Die Spindel läuft weiter. Beide Optionen erst ab hdparm Version 9.3.
  • -S setzt die Standby-Zeit des Gerätes. Nach der eingestellten Zeit fährt die Festplatte in den Ruhezustand (entspricht -y). Ein Wert von 0 schaltet diese Funktion aus, maximal bis 255. Die Einteilung ist nicht linear, man muss etwas probieren um auf die gewünschte Zeit zu kommen.
  • -y setzt das Laufwerk sofort in den Standby Modus, die Spindel stoppt dabei. Bei Zugriffen wacht es automatisch wieder auf.
  • -Y setzt das Laufwerk in den Sleep Modus, welcher am wenigsten Energie benötigt. Die Spindel stoppt auch hier. Normalerweise wird es bei Zugriffen automatisch aufgeweckt. Die benötigte Startzeit ist etwas länger als im Standby Modus.
  • -Z deaktiviert die automatische Energiespar-Funktion einiger älterer Seagate Festplatten um ungünstige Spin-Downs zu verhindern.

Konfiguration

Fast alle Einstellungen, die mit hdparm verändert werden, bleiben nur bis zum nächsten Systemstart erhalten. Um dem entgegenzuwirken, gibt es unter /etc/hdparm.conf eine Konfigurationsdatei, die günstiger Weise schon mit selbsterklärenden Beispielen und Beschreibungen gefüllt ist. Eines muss noch erwähnt werden. Durch die neuen libata Treiber spielt es keine Rolle mehr, an welchem IDE Kanal ein Laufwerk Master oder Slave ist - die Device-Nodes unter /dev werden beim Start per Zufall nummeriert. Will man aber für bestimmte Laufwerke bestimmte Einstellungen setzen, bietet es sich an, die automatisch von udev generierten Symbolischen Links unter /dev/disk/ zu verwenden. Demnach kann ein Block zum Beispiel so aussehen:

/dev/disk/by-id/ata-Hitachi_HDT725050VLA380_VFJ401R41S702K { 
        apm = 128
        acoustic_management = 128
        spindown_time = 240
}

Sollten Probleme auftreten, weil hdparm zu früh gestartet wird, kann man probieren, das Init-Skript mit einer höheren Startnummer zu versehen. Beispiel:

root@debian:~# mv /etc/rcS.d/S07hdparm /etc/rcS.d/S38hdparm

Anmerkung: Nach dem Resume von einem Suspend-to-ram/to-disk wird die hdparm.conf leider übergangen und die getätigten Einstellungen überschrieben. Zur Abhilfe muss man sich entweder an der Datei /etc/default/hdparm oder an entsprechenden pm-util Skripten vergreifen bzw. eigene erstellen, wie hier vorgeschlagen: Diskussion 138254

Tipps / Tricks / erweiterte Funktionen

Warnung.png Warnung: Folgende Befehle können auch bei richtiger Anwendung einen kompletten Datenverlust oder gar Hardware-Schaden verursachen!


Hinweis.png Hinweis: Hdparm verlangt bei jeder potentiell gefährlichen Operation ein "--yes-i-know-what-i-am-doing"-Flag, um zu vermeiden, solch ein Kommando aus versehen abzusetzen.


Eine kleine Sammlung nützlicher Hdparm-Anwendungen.


-z
Zwingt den Kernel, die Partitionstabelle des gegebenen Gerätes neu einzulesen. Erfüllt die gleiche Aufgabe wie "sfdisk -R", "blockdev --rereadpt" oder "blktool <device> reread-part". Kann nützlich sein, um eine manuell geänderte Partitionstabelle ohne Neustart zu aktualisieren (Beispielsweise MBR mit dd überschrieben oder Partitionstabelle zurück gespielt).
-w
Führt einen Laufwerksreset durch. Diese Funktion ist sehr gefährlich, da sie das ganze System gefährden kann.


Temperatur: Hitachi

-H
Speziell für Hitachi Festplatten, lässt sich die Temperatur auslesen und anzeigen, ob dieser Wert im grünen Bereich ist. Besonders für sehr alte Geräte, oder welche, die kein SMART unterstützen (z.B. CF-Microdrives).
Hinweis.png Hinweis: Erst ab hdparm Version 6.7 und Debian Etch verfügbar.


Beispiel:

Temperatur eines 4GB Microdrives:

root@debian:~# hdparm -H /dev/sdb

/dev/sdb:
 drive temperature (celsius) is:  26
 drive temperature in range:  yes


... einer Desktop Festplatte:

root@debian:~# hdparm -H /dev/sdc

/dev/sdc:
 drive temperature (celsius) is:  41
 drive temperature in range:  yes

Hier stimmt sie mit der von SMART übermittelten überein (RAW_VALUE):

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
[...]
194 Temperature_Celsius     0x0002   146   146   000    Old_age   Always       -       41 (Min/Max 3/59)
[...]

Fragmentierung einer Datei

--fibmap
Wenn man herausfinden möchte, welche Sektoren eine Datei belegt, oder wie fragmentiert sie ist, bietet sich diese Option an. Hdparm benötigt nach dieser Option ausschließlich den Absoluten Pfad zur gewünschten Datei. Bei Erfolg wird eine Liste der belegten Bereiche ausgegeben. Die Sektorzahlen sind absolute LBA Nummern der betreffenden Festplatte und keine Blockzahlen des Dateisystems! Laut Manpage scheint diese Option mit fast jedem Dateisystem umgehen zu können. Nur nach einem sync soll es auch bei ext4/xfs gut funktionieren.
Hinweis.png Hinweis: Erst ab hdparm Version 8.7 und Debian Lenny verfügbar.


Beispiel:

root@debian:~# hdparm --fibmap /boot/vmlinuz-2.6.38.3-1000hz 

/boot/vmlinuz-2.6.38.3-1000hz:
 filesystem blocksize 4096, begins at LBA 63; assuming 512 byte sectors.
 byte_offset  begin_LBA    end_LBA    sectors
           0   10682503   10682558         56
       28672   10685159   10685174         16
       36864   10687167   10687190         24
       49152   10687199   10687278         80
       90112   10693263   10693270          8
       94208   10693919   10693966         48
      118784   10694047   10694670        624
      438272   10695807   10696190        384
      634880   10696639   10698814       2176
     1748992   10699647   10700294        648
     2080768   10700415   10701102        688
     2433024   10702399   10702702        304


Funktion freischalten

--dco-freeze
--dco-identify
--dco-restore
Seit ATA/ATAPI 6 gibt es das Device Configuration Overlay (DCO). Damit haben OEM Hersteller die Möglichkeit, bestimmte, in den Identify-Informationen gelisteten Werte, zu deaktivieren. Mit hdparm lassen sich diese anzeigen.
Hinweis.png Hinweis: Erst ab hdparm Version 9.0 und Debian Squeeze verfügbar.


Abschaltbare Funktionen anzeigen:

root@debian:~# hdparm --dco-identify /dev/sdj

/dev/sdj:
DCO Revision: 0x0001
The following features can be selectively disabled via DCO:
        Transfer modes:
                 mdma0 mdma1 mdma2
                 udma0 udma1 udma2 udma3 udma4 udma5 udma6(?)
        Real max sectors: 312581808
        ATA command/feature sets:
                 SMART self_test error_log security HPA 48_bit
        SATA command/feature sets:
                 (?): NCQ interface_power_management SSP

Anschließend würde man die Ausgabe mit den Identify "-I" Werten vergleichen. Ist dort eine deaktivierte aber gewünschte Funktion dabei, kann man laut Manpage versuchen, diese auf Werkseinstellung zurück zu setzen:

root@debian:~# hdparm --yes-i-know-what-i-am-doing --dco-restore /dev/sdj

/dev/sdj:
 issuing DCO restore command
 HDIO_DRIVE_CMD(dco_restore) failed: Input/output error

... wie gesagt, mit etwas Glück. Mit einem "--dco-freeze" ließe sich die aktuelle, vielleicht vollwertige Konfiguration, bis zum nächsten Start/Reset einfrieren.


Security

Das "security feature set" ist Teil des ATA Standards und ermöglicht das Sperren der Festplatte durch ein Passwort, sowie deren automatische Löschung.

Passwort-Schutz

Die Passwörter werden direkt auf den Plattern der Festplatte gespeichert, lassen sich so durch Tausch der Laufwerkselektronik (wovon generell abzuraten ist) nicht umgehen. Die Passwörter sollten also mit Vorsicht gesetzt werden, denn theoretisch kann selbst der Hersteller diese nicht umgehen. Es ist jedoch möglich. Für hohe Sichereitsansprüche ist eine Vollverschlüsselung der Daten deshalb effektiver.

--user-master PASSWORT-TYP
Grundsätzlich lassen sich zwei unterschiedliche, 32 Byte lange Passwörter setzen. Mit "u" wird das User-Passwort gewählt; mit "m" das Master-Passwort, welches als Not-Schlüssel dient. Dieser Schalter lässt sich mit dem "security mode" und den anderen kombinieren, als Standard ist immer das User-Passwort gewählt.
--security-set-pass PASSWORT
Dieser Schalter setzt das gegebene Passwort und aktiviert damit die Sicherheitsfunktion, "NULL" für ein leeres. Ist dies das User-Passwort, wird die Sperrung aktiviert.
--security-mode SICHERHEITSSTUFE
Mit "h" wird die Stufe "high security", mit "m" "maximal security" gewählt. Bei ersterem ist die Entsperrung mit beiden Passwörtern, bei "maximal" nur mit dem User-Passwort möglich. Mit dem Master-Passwort lässt sich die Festplatte nur durch ein "security erase" entsperren, wobei alle Daten gelöscht werden. Ohne Angabe wird auf "high" gesetzt. Mit "user-master" und den anderen Schaltern kombinierbar.
--security-unlock PASSWORT
Hiermit wird die Festplatte temporär, also bis zum nächsten Start (Reset), entsperrt.
--security-disable PASSWORT
Im entsperrten Zustand lässt sich die Sicherheitsfunktion so dauerhaft ausschalten.
--security-freeze PASSWORT
Damit werden alle Sicherheitseinstellungen eingefroren, bis zum nächsten Start sind keine Änderungen mehr möglich. Diese Funktion wird von einigen BIOS beim Start gesetzt, um ein Sperren mit böswilliger Absicht zu verhindern.

Beispiele:
Die Unterstützung prüfen:

root@debian:~# hdparm -I /dev/sdg | grep Security: -A7
Security: 
        Master password revision code = 65534
                supported
        not     enabled
        not     locked
        not     frozen
        not     expired: security count
        not     supported: enhanced erase

Das "not" zeigt jeweils, was inaktiv ist. Je nach Gerät sind hier Informationen über die Dauer eines "security-erase" angegeben.

Die Aktivierung geschieht mit dem Setzen eines Passwortes.

root@debian:~# hdparm --security-set-pass Test /dev/sdg

Da Passwortmode und Sicherheitsstufe nicht angegeben sind, wird der Standard verwendet.

security_password="Test"

/dev/sdg:
 Issuing SECURITY_SET_PASS command, password="Test", user=user, mode=high

Unter "Security" ist nun das not vor enabled verschwunden:

               enabled

Würde der Rechner oder die Festplatte jetzt neu gestartet werden, würde diese nicht mehr zugreifbar sein, ohne diese zu entsperren oder den Schutz ganz aufzuheben:

root@debian:~# hdparm --security-unlock Test /dev/sdg
security_password="Test"

/dev/sdg:
 Issuing SECURITY_UNLOCK command, password="Test", user=user

Schutz abschalten:

root@debian:~# hdparm --security-disable Test /dev/sdg
security_password="Test"

/dev/sdg:
 Issuing SECURITY_DISABLE command, password="Test", user=user

Die Festplatte ist dauerhaft entsperrt:

        not     enabled

Das Master-Passwort ließe sich so setzen:

root@debian:~# hdparm --user-master m --security-set-pass Passwort2 /dev/sdg
security_password="Passwort2"

/dev/sdg:
 Issuing SECURITY_DISABLE command, password="Passwort2", user=master

Den aktuellen Schutzzustand einfrieren:

hdparm --security-freeze /dev/sdg

/dev/sdg:
 issuing security freeze command

Das fehlende not zeigt wieder den Zustand:

                frozen

Ein Versuch, den Schutz danach ein zu schalten:

root@debian:~# hdparm --security-set-pass TEST /dev/sdg

schlägt dann fehl:

security_password="TEST"

/dev/sda:
 Issuing SECURITY_SET_PASS command, password="TEST", user=user, mode=high
SECURITY_SET_PASS: Input/output error


Security Erase

--security-erase PASSWORT
Es wird eine gesperrte Festplatte so entsperrt und automatisch komplett mit Nullen beschrieben.
--security-erase-enhanced PASSWORT
Führt ein "enhanced security erase" aus und bewirkt ansonsten das selbe wie "security erase". Insbesondere bei SSDs kann es hier Unterschiede geben.
Hinweis.png Hinweis: Die Festplatte oder SSD ist während des Security-Erase meist blockiert und es ist möglich, dass dies ebenfalls mit dem System geschieht!


Beispiel:
Nachdem man zuvor den Schutz, durch setzen eines User-Passwortes, aktiviert hat, ist ein Security-Erase möglich mit:

root@debian:~# hdparm --user-master u --security-erase TEST /dev/sdg
security_password="TEST"

/dev/sdc:
 Issuing SECURITY_ERASE command, password="TEST", user=user

Ob die Festplatte ein enhanced erase unterstützt, wird mit "-I" angezeigt:

        not     supported: enhanced erase

Anmerkung: Wenn die Dauer des Löschens nicht angegeben ist, kann man abhängig von der Kapazität und der mittleren Schreibgeschwindigkeit auf die Zeit schließen. Unterstützt die Festplatte SMART, entspricht die benötigte Zeit ungefähr der, welche für einen erweiterten Selbsttest angegeben wird:

Extended self-test routine
recommended polling time:        (  54) minutes.

So ist besonders bei Festplatten an einem langsamen IDE/SATA Chipsatz das Löschen mit der maximalen Geschwindigkeit erreichbar, da die Operation von der Festplattenfirmware selbst durchgeführt wird und so unabhängig von der Bus-Anbindung ist. Bei SSDs müssen nur die Blöcke der NAND Flash gelöscht werden, dadurch muss nicht jedes Byte geschrieben werden und die Gesamtdauer kann so wenige Minuten betragen. Das ist jedoch sehr Herstellerspezifisch.


HPA - Host Protect Area

-N
Zeigt und setzt die LBA Sektoren.
Mit ATA/ATAPI 4 wurde das Host Protect Area eingeführt. Damit lässt sich ein definierter Bereich der Festplatte selbst vor Partitionierprogrammen verstecken und die Gesamtkapazität so scheinbar schrumpfen. HPA verhält sich so wie eine unsichtbare Grenze, die nichts anderes bewirkt. Gerne für Wiederherstellungspartitionen in OEM Systemen verwendet und so manches BIOS kopiert sich ungefragt in einen selbst erstellten HPA-Bereich (Beitrag 792021). Vom Kernel standardmäßig zurückgesetzt, lässt sich dieser von hdparm erkennen und sogar setzen.
Hinweis.png Hinweis: Erst ab hdparm Version 8.0 und Debian Lenny verfügbar.


Beispiel:

hdparm -N /dev/sdc

/dev/sdc:
 max sectors   = 156250000/156250000, HPA is disabled

Die maximale LBA Zahl kann flüchtig wie folgt gesetzt werden:

hdparm --yes-i-know-what-i-am-doing -N156200000 /dev/sdc

/dev/sdc:
 setting max visible sectors to 156200000 (temporary)
 max sectors   = 156200000/156250000, HPA is enabled

Nach einem Reset oder Neustart wäre diese Einstellung zurückgesetzt. Das permanente, also nichtflüchtige, Setzen wird durch ein kleines p vor der Sektorzahl bewirkt:

hdparm --yes-i-know-what-i-am-doing -Np156200000 /dev/sdc

/dev/sdc:
 setting max visible sectors to 156200000 (permanent)
 max sectors   = 156200000/156250000, HPA is enabled

Hier hat die Ausführung funktioniert. Damit wissen aber fdisk, dd & Co noch nichts davon:

fdisk -luc /dev/sdc

Disk /dev/sdc: 80.0 GB, 80000000000 bytes
255 heads, 63 sectors/track, 9726 cylinders, total 156250000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000be68d
[...]

Erst nach einem Neustart wäre dies der Fall.


Als weiteres Beispiel folgend das Erkennen und rückgängig machen, eines vom BIOS gesetzten HPA. Die Meldung vom Kernel lässt Verdacht schöpfen:

user@debian:~$ dmesg | grep -i hpa
[   12.523134] ata7.00: HPA detected: current 156247887, native 156250000
hdparm -N /dev/sdd

/dev/sdd:
 max sectors   = 156247887/156250000, HPA is enabled

(156250000-156247887)*512 Byte = 1.081.856 Byte wurden geschluckt! Nun den HPA löschen:

hdparm -Np156250000 /dev/sdd

/dev/sdd:
 setting max visible sectors to 156250000 (permanent)
 max sectors   = 156250000/156250000, HPA is disabled

Danach neu starten um mit dd zu schauen ob, und was da nun versteckt war:

dd if=/dev/sdd of=hpa.bin bs=512 skip=156247887
2113+0 Datensätze ein
2113+0 Datensätze aus
1081856 Bytes (1,1 MB) kopiert, 0,00426143 s, 254 MB/s

Mit hexdump gucken:

hexdump -Cn40 hpa.bin
00000000  25 e4 2d 6c 68 35 2d 7f  42 01 00 00 00 02 00 00  |%.-lh5-.B.......|
00000010  00 00 50 20 01 0c 4b 38  4e 53 43 39 33 39 2e 42  |..P ..K8NSC939.B|
00000020  49 4e fe 0f 20 00 00 2c                           |IN.. ..,|
00000028c

Etwas lha-komprimiertes.

lha -x hpa.bin
k8nsc939.bin    - Melted   :  oooooooooooooooo
LHa: Error: CRC error k8nsc939.bin
ls -l k8nsc939.bin 
-rw-r--r-- 1 ich ich 131072 30. Nov 2019  k8nsc939.bin

So wurde in den versteckten Bereich ein BIOS Image gepackt. Bei manchen lässt sich das abstellen.


HPA ignorieren: Es ist möglich den Kernel anzuweisen, eine eventuell gesetzte HPA Limitierung zu ignorieren. Es ist lediglich nötig, als Kernel Bootparameter folgendes mitzugeben:

libata.ignore_hpa=1 

Eine 0 ist Standard und würde die limits beibehalten. Äquivalent libata als Modulparameter ignore_hpa=1. Oder durch IDE Treiber unterstützte Controller ide-core.nohpa zum Boot mitgeben.


Schlechte Sektoren schreiben/auslagern

--read-sector
--write-sector
Als schlecht erkannte Sektoren einer Festplatte, benötigen erst einen Schreibvorgang, um letztendlich ausgelagert und von Spare-Sektoren ausgetauscht zu werden, sofern sich diese nicht durch neu geschriebene ECC-Summen korrigieren lassen. Da Tools wie GNU-DD standardmäßig auf Block-Ebene agieren (außer man setzt direct-Flags), brechen sie dabei mit einem I/O-Fehler ab. Badblocks z.B. ist da etwas hartnäckiger. Ist der problematische Sektor bekannt, kann mit hdparm nun versucht werden, diesen auf "low-level"-Ebene zu überschreiben. Leider ist es nicht möglich, ein anderes Bitmuster vorzugeben. Parallel sollte man die Kernel-Meldungen im Auge behalten, um alle ATA-Fehler mitzubekommen.
Hinweis.png Hinweis: Erst ab hdparm Version 8.0 und Debian Lenny verfügbar.


Beispiel: Im SMART Selftest-log:

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed: read failure       40%        55         713318
[...]
hdparm --read-sector 713318 /dev/sdd

/dev/sdd:
reading sector 713318: FAILED: Input/output error

Der ist wirklich hin. Nun der Schreibversuch:

hdparm --yes-i-know-what-i-am-doing --write-sector 713318 /dev/sdd

/dev/sdd:
re-writing sector 713318: succeeded

Der Sektor wurde anscheinend intern ersetzt und ist nun mit dem Inhalt des letzten Schreibvorganges gefüllt:

root@debian:~# hdparm  --read-sector 713318 /dev/sdj

/dev/sdj:
reading sector 713318: succeeded
0000 0000 0000 0000 0000 0000 0000 0000
[...]
0000 0000 0000 0000 0000 0000 0000 0000

Anmerkung: Die SMART Attribute und vieles mehr lässt sich mit dem smartmontools auslesen. Dazu unter Festplattendiagnostik- und Überwachung mehr.

Schlechte Sektoren erzeugen

--make-bad-sector
Zum Test von Hardware oder Überwachungsdiensten/systemen braucht man einen praktischen und doch kontrollierten Ernstfall, also einen Lesefehler der Festplatte. Der Befehl setzt entweder ein "WRITE_LONG" oder ein neues für LBA48 taugliches "WRITE_UNCORRECTABLE_EXT" Kommando ab, um den gegebenen Sektor auf der Festplatte zu korrumpieren. Ein "f" vor der Sektorzahl würde diesen nur als schlecht markieren, nicht wirklich korrumpieren. Beim Korrumpieren werden natürlich nur die ECC Daten des Sektors verfälscht und nicht die physische Oberfläche beschädigt. Somit lässt sich dieser beim nächsten beschreiben auch wieder reparieren. Selbstverständlich nutzt man dafür keine Festplatte mit produktivem Inhalt und Funktion, eher eine ausrangierte oder wenigstens ungenutzte. Denn der betroffene Sektor wird gelöscht und bei falscher Anwendung kann mehr passieren!
hdparm --yes-i-know-what-i-am-doing --make-bad-sector 100 /dev/sdc

/dev/sdc:
Corrupting sector 100 (WRITE_LONG): succeeded

Erst nach einem fehlgeschlagenen Leseversuch:

hdparm --read-sector 100 /dev/sdc

/dev/sdc:
reading sector 100: FAILED: Input/output error

So taucht die erwartete und gewünschte Meldung im Syslog auf bzw. die betreffenden SMART Attribute erhöhen sich:

ata4.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
ata4.00: irq_stat 0x40000001
ata4.00: failed command: READ SECTOR(S)
ata4.00: cmd 20/00:01:64:00:00/00:00:00:00:00/e0 tag 0 pio 512 in
         res 51/40:00:64:00:00/00:00:00:00:00/e0 Emask 0x9 (media error)
ata4.00: status: { DRDY ERR }
ata4.00: error: { UNC }
ata4.00: configured for UDMA/133
ata4: EH complete
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       1
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       1

Anmerkung: Die SMART Attribute und vieles mehr lässt sich mit dem smartmontools auslesen. Dazu unter Festplattendiagnostik- und Überwachung mehr.

Links / Weiterführendes


http://sourceforge.net/projects/hdparm

http://de.wikipedia.org/wiki/Hdparm

http://debiananwenderhandbuch.de/hdparm%20Festplattenparameter.html

http://wiki.ubuntuusers.de/Archiv/DMA

http://linuxwiki.de/hdparm

http://de.wikipedia.org/wiki/ATA/ATAPI

http://de.wikipedia.org/wiki/Host_Protected_Area

http://www.heise.de/ct/artikel/Baerendienst-289866.html

http://wiki.ubuntuusers.de/SSD/Secure-Erase

https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase

http://www.serialata.org