Zum Inhalt springen

Hdparm/Anwendung

Aus Foxwiki

Anwendung

Alle Informationen anzeigen

# hdparm -I /dev/sdb
/dev/sdb:
ATA device, with non-removable media
Model Number: Hitachi HDS722020ALA330
Serial Number: JK1160YAGMUVRT
Firmware Revision: JKAOA3MA
Transport: Serial, ATA8-AST, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6; Revision: ATA8-AST T13 Project D1697 Revision 0b
Standards:
Used: unknown (minor revision code 0x0029)
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: 3907029168
Logical/Physical Sector size: 512 bytes
device size with M = 1024*1024: 1907729 MBytes
device size with M = 1000*1000: 2000398 MBytes (2000 GB)
cache/buffer size = 29999 KBytes (type=DualPortCache)
Form Factor: 3.5 inch
Nominal Media Rotation Rate: 7200
Capabilities:
LBA, IORDY(can be disabled)
Queue depth: 32
Standby timer values: spec'd by Standard, no device specific minimum
R/W multiple sector transfer: Max = 16 Current = 0
Advanced power management level: disabled
DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6
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
* DOWNLOAD_MICROCODE
Advanced Power Management feature set
Power-Up In Standby feature set
* SET_FEATURES required to spinup after power up
SET_MAX security extension
* 48-bit Address feature set
* Device Configuration Overlay feature set
* Mandatory FLUSH_CACHE
* FLUSH_CACHE_EXT
* SMART error logging
* SMART self-test
Media Card Pass-Through
* General Purpose Logging feature set
* WRITE_{DMA|MULTIPLE}_FUA_EXT
* 64-bit World wide name
* URG for READ_STREAM[_DMA]_EXT
* URG for WRITE_STREAM[_DMA]_EXT
* WRITE_UNCORRECTABLE_EXT command
* Segmented DOWNLOAD_MICROCODE
* Gen1 signaling speed (1.5Gb/s)
* Gen2 signaling speed (3.0Gb/s)
* Native Command Queueing (NCQ)
* Host-initiated interface power management
* Phy event counters
* NCQ priority information
Non-Zero buffer offsets in DMA Setup FIS
* DMA Setup Auto-Activate optimization
Device-initiated interface power management
In-order data delivery
* Software settings preservation
* SMART Command Transport (SCT) feature set
* SCT Write Same (AC2)
* SCT Error Recovery Control (AC3)
* SCT Features Control (AC4)
* SCT Data Tables (AC5)
Security:
Master password revision code = 65534
supported
not enabled
not locked
not frozen
not expired: security count
not supported: enhanced erase
500min for SECURITY ERASE UNIT.
Logical Unit WWN Device Identifier: 5000cca221c90422
NAA : 5
IEEE OUI : 000cca
Unique ID : 221c90422
Checksum: correct

Bestimmte Information anzeigen

# hdparm -I /dev/sdb | grep "cache"
cache/buffer size = 29999 KBytes (type=DualPortCache)
Write cache
  • Datenträger sdb hat eine "cache size" von 29,999 MB.

Advanced Power Management einstellen

# hdparm -B 254 /dev/sda
/dev/sda:
setting Advanced Power Management level to 0xfe (254)
APM_level = 254
  • Datenträger sda ist auf höchst mögliche Leistung eingestellt => beste Performance, aber höchster Stromverbrauch.

Standby-Modus (Spindown)

  • Hier auf ein Standby-Zeitlimit von 2min.
# hdparm -S 24 /dev/sda
/dev/sda:
setting standby to 24 (2 minutes)

hdparm-Einstellungen nach einem Software-Reset beibehalten

  • Hier Aktivierung bei Datenträger sda.
# hdparm -K 1 /dev/sda
/dev/sda:
setting drive keep features to 1 (on)

Read-Lookahead-Funktion

  • Hier Aktivierung beim Datenträger sda.
# hdparm -A 1 /dev/sda
/dev/sda:
setting drive read-lookahead to 1 (on)
look-ahead = 1 (on)

Akkustik

Akkustiklevel anzeigen

# hdparm -M /dev/sda
/dev/sda:
acoustic = 254 (128=quiet ... 254=fast)
  • Akkustiklevel des Datenträgers sda ist auf "fast" eingestellt => schnell, aber laut.

Akkustiklevel einstellen

  • Hier auf "quiet" => geringere Performance.
# hdparm -M 128 /dev/sda
/dev/sda:
setting acoustic management to 128
acoustic = 128 (128=quiet ... 254=fast)

Lesegeschwindigkeit messen

Mit Cache

# hdparm -Tt /dev/sda
/dev/sda:
Timing cached reads: 6962 MB in 2.00 seconds = 3482.67 MB/sec
Timing buffered disk reads: 358 MB in 3.01 seconds = 119.12 MB/sec

Ohne Cache

# hdparm -Tt --direct /dev/sda
/dev/sda:
Timing O_DIRECT cached reads: 498 MB in 2.00 seconds = 248.49 MB/sec
Timing O_DIRECT disk reads: 360 MB in 3.01 seconds = 119.60 MB/sec

Problembehebung

Erweiterte Funktionen

Vorlage:Warnung Vorlage:Hinweis

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).

Vorlage:Hinweis

Beispiel:

Temperatur eines 4GB Microdrives: Vorlage:RootShell


... einer Desktop Festplatte: Vorlage:RootShell 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.

Vorlage:Hinweis Beispiel:

Vorlage:RootShell


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.

Vorlage:Hinweis Abschaltbare Funktionen anzeigen: Vorlage:RootShell 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: Vorlage:RootShell ... 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:

Vorlage:RootShell

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. Vorlage:RootShellDa 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:

Vorlage:RootShell

security_password="Test"

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

Schutz abschalten:

Vorlage:RootShell

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: Vorlage:RootShell

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: Vorlage:RootShell 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.

Vorlage:Hinweis

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

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 (Vorlage:DebianforumBeitrag). Vom Kernel standardmäßig zurückgesetzt, lässt sich dieser von hdparm erkennen und sogar setzen.

Vorlage:Hinweis

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: Vorlage:UserShell

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.

Vorlage:Hinweis 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: Vorlage:RootShell 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.