Zum Inhalt springen

Diskussion:Hdparm/Anwendung

Aus Foxwiki

Erweiterte Funktionen

Warnung
Folgende Befehle können auch bei richtiger Anwendung einen kompletten Datenverlust oder gar Hardware-Schaden verursachen!
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

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 (beispielsweise CF-Microdrives).

Vorlage:Hinweis

Beispiel:

Temperatur eines 4GB Microdrives:

# hdparm -H /dev/sdb

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


... einer Desktop Festplatte:

# 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
|Erst ab hdparm Version 8.7 und Debian Lenny verfügbar

Beispiel

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

Abschaltbare Funktionen anzeigen
# 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:

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

Sicherheit

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

# 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 eraseDas "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.

# 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:
# hdparm --security-unlock Test /dev/sdg
security_password="Test"

/dev/sdg:

Issuing SECURITY_UNLOCK command, password="Test", user=user

Schutz abschalten

# hdparm --security-disable Test /dev/sdg
security_password="Test"

/dev/sdg:

Issuing SECURITY_DISABLE command, password="Test", user=userDie Festplatte ist dauerhaft entsperrt:

        not     enabled<

Master-Passwort 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 beispielsweise 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.