Diskussion:Hdparm/Anwendung
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).
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.
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.
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.