![]() |
Festplatte ausschalten
Kann man irgendwie eine einzelne Festplatte per Software abschalten?
|
Re: Festplatte ausschalten
Da meine Backup/Capture-Festplatten meist nur unnötig Strom fressen und laut sind, interessiert mich das auch;
deswegen: push |
Re: Festplatte ausschalten
Nicht wirklich.
Man kann zwar ein neues Energieschema setzen, aber da gibt es Probleme wenn die Timeouts zu kurz sind. |
Re: Festplatte ausschalten
Zitat:
|
Re: Festplatte ausschalten
Zitat:
Und das ständige aus und an der Platten tut denen ganz schön weh. |
Re: Festplatte ausschalten
Zitat:
Aber fragt mich nicht, wie es unter Windows geht. Unter Linux ist es kein Problem, mit hdparm eine einzelne Festplatte in den Standby-Zustand zu versetzen, da hdparm die Devices einzeln anspricht. Ich wage die Vermutung, daß Windows dafür keine entsprechende Schnittstelle zur Verfügung stellt. |
Re: Festplatte ausschalten
Wie wäre es, wenn man eine Platte z.B an den 2. IDE Kanal hängt und diesen in der Systemsteuerung deaktiviert?
Dann müssten doch Zugriffe auf die Platte nicht mehr auftreten? |
Re: Festplatte ausschalten
Also man kann auch unter Windows Festplatten einzeln abschalten. Ich hatte da mal ein Programm das dies konnte, zumindest für P-ATA Festplatten. Vielleicht fällt mir der Programmname noch ein. Dann poste ich den noch.
rantanplan [EDIT] Ich habs gefunden: ![]() Das Programm heisst "HDSleep", hilft aber wohl nicht weiter da die letzte Version 1.55 von 1999 ist. Die Webseite des Herstellers existiert auch nicht mehr. Und da das Programm für Win9x ist weiss ich nicht ob es unter Win2k/WinXP überhaupt läuft (die gab es 1999 ja noch nicht). [/EDIT] |
Re: Festplatte ausschalten
Gibt es dazu wirklich keine Lösung?
Auch ich habe Festplatten, die ich gerne einfach ausschalten könnte. Sie über das Gerätemanagement zu aktivieren und deaktiveren wäre umständlich und fällt für mich komplett raus, da ich mich dafür immer als Administrator anmelden müsste; ein Programm mit Administrator-Rechten zu starten wäre hingegen kein Problem. Würde mich über eine Lösung sehr freuen. :) |
Re: Festplatte ausschalten
na ja, das Programm bringt einen *.sys (NT) und einen *.vxd (9x) - Treiber mit. Also könnte es unter Win XP arbeiten. Leider lässt sich das Programm nicht starten.... Lizenz abgelaufen... :wall:
Man müsste sich also mal den Treiber näher ansehen.... |
Re: Festplatte ausschalten
Hmm, ich hab' mir den Treiber mal angesehen. Er importiert zumindestens nicht allzu viele Funktionen:
Delphi-Quellcode:
Hat irgendwer eine Idee, wie der Treiber arbeiten könnte? Könnte ein Anfänger in Sachen Treiberprogrammierung mit Grund - C - Syntax - Kenntnissen und ab jetzt zuviel Zeit (/ME) sowas auch schreiben?
//Impotierte Funktionen
IoCreateSymbolicLink 00010280 IoCreateDevice 00010284 RtlInitUnicodeString 00010288 IofCompleteRequest 0001028C IoDeleteSymbolicLink 00010290 KeQuerySystemTime 00010294 IoDeleteDevice 00010298 //Interne Funktionen aDeviceHdsback 000102A0 aDosdevicesHdsb 000102C0 aDosdevicesHd_0 00010420 //Exportierte Funktionen start 000102E8 P *auf Olli wart'* |
Re: Festplatte ausschalten
![]() Zitat:
|
Re: Festplatte ausschalten
So, um meinen Monolog jetzt zu komplettieren (:mrgreen:)
Die Lösung Man definiere folgende Typen (Dank' an Alex Konshin für seine Unit, die diese Definitionen schon beinhaltet)
Delphi-Quellcode:
Man übernehme diese Konstanten:
Type
TIDERegs = packed record bFeaturesReg : Byte; // Used for specifying SMART "commands". bSectorCountReg : Byte; // IDE sector count register bSectorNumberReg : Byte; // IDE sector number register bCylLowReg : Byte; // IDE low order cylinder value bCylHighReg : Byte; // IDE high order cylinder value bDriveHeadReg : Byte; // IDE drive/head register bCommandReg : Byte; // Actual IDE command. bReserved : Byte; // reserved for future use. Must be zero. end; IDEREGS = TIDERegs; PIDERegs = ^TIDERegs; TIdSector = packed record wGenConfig : Word; //00 wNumCyls : Word; wReserved : Word; wNumHeads : Word; wBytesPerTrack : Word; wBytesPerSector : Word; wSectorsPerTrack : Word; wVendorUnique : Array[0..2] of Word; sSerialNumber : Array[0..19] of Char; //10-19 wBufferType : Word; wBufferSize : Word; wECCSize : Word; sFirmwareRev : Array[0..7] of Char; //23-26 sModelNumber : Array[0..39] of Char; //27-46 wMoreVendorUnique : Word; wDoubleWordIO : Word; wCapabilities : Word; wReserved1 : Word; wPIOTiming : Word; wDMATiming : Word; wBS : Word; wNumCurrentCyls : Word; wNumCurrentHeads : Word; wNumCurrentSectorsPerTrack : Word; ulCurrentSectorCapacity : ULONG; //57-58 wMultSectorStuff : Word; ulTotalAddressableSectors : ULONG; //60-61 wSingleWordDMA : Word; wMultiWordDMA : Word; //63 wFlowControlPIOSupported : Word; //64 wMinimumMultiWordDMA : Word; //65 wRecommendedMultiWordDMA : Word; //66 wMinimumPIOCycleWOFlow : Word; //67 wMinimumPIOCycleIORDYFlow : Word; //68 bReserved1 : Array[0..21] of Byte; //69-79 wMajorVersionNumber : Word; //80 wMinorVersionNumber : Word; //81 wCommandSetSupported : Word; //82 wCommandSetSupported2 : Word; //83 wCommandSetExtension : Word; //84 wCommandSetFeatureEnabled1 : Word; //85 wCommandSetFeatureEnabled2 : Word; //86 wCommandSetFeatureEnabled3 : Word; //87 wUltraDMAMode : Word; //88 wTimeRequiredErase : Word; //89 wTimeRequiredEnhancedErase : Word; //90 wAbleMode : Word; //91 bReserved2 : Array[0..71] of Byte; //92-127 wSecurityModeFeature : Word; //128 wCurrentFeatureOption : Word; //129 wReserved2 : Word; //130 wInitialPowerMode : Word; //131 bReserved3 : Array[0..247] of Byte; //132-255 end; PIdSector = ^TIdSector;
Delphi-Quellcode:
Und dann diese beiden Funktionen:
const
BufferSize = SizeOf(TIDERegs)+4; IOCTL_IDE_PASS_THROUGH = $0004d028;
Delphi-Quellcode:
Voilà.
Function IdeRegPassThrough(Device: String; var ideregs: TIDERegs ): Boolean;
var ret:BOOL; hDevice : THandle; cbBytesReturned : DWORD; pInData : PIDERegs; pOutData : Pointer; Buffer : Array[0..BufferSize-1] of Byte; begin Result := False; FillChar(Buffer,BufferSize,#0); hDevice := CreateFile( PChar(Device), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 ); if hDevice=INVALID_HANDLE_VALUE then Exit; try pInData := @Buffer; pOutData := pInData; pInData^ := ideregs; ret := DeviceIoControl( hDevice, IOCTL_IDE_PASS_THROUGH, @Buffer, BufferSize, @Buffer, BufferSize, cbBytesReturned, nil ); if not ret then begin Exit; end; ideregs := PIDERegs(pOutData)^; finally CloseHandle(hDevice); end; Result := True; end; function SendToSleep(Device: String): Boolean; var ideregs : TIDERegs; begin Result := False; with ideregs do begin bFeaturesReg := 0; bSectorCountReg := 0; bSectorNumberReg := 0; bCylLowReg := 0; bCylHighReg := 0; bDriveHeadReg := $A0; bCommandReg := $E6; bReserved := 0; end; if not IdeRegPassThrough(Device, ideregs ) then Exit else Result := True; end; Jetzt die Erklärung: Die Funktion IdeRegPassThrough stammt aus einem japanischen Projekt, in dem es darum ging, das APM von Festplatten unter W2k zu kontrollieren. Um dies zu tun, werden ATA - Kommandos an die Festplatte geschickt. Dies kann man unter Windows 2000 aufwärts mit dem Befehl IOCTL_IDE_PASS_THROUGH bewerkstelligen. Jetzt brauch man eigentlich nur den Befehl zum Ausschalten an die Platte senden. Dies geschieht mit meiner Funktion SendToSleep, die als Parameter \\.\PhysicalDriveX erwartet, wobei X hier für eine Zahl steht. Dabei repräsentiert die 0 euer erstes IDE - Laufwerk, die 1 euer zweites usw... Der eigentliche Befehl findet sich in dieser Zeile:
Delphi-Quellcode:
$E6 ist laut ATA - Definition der Sleep-Befehl. Dieser ist ab ATA4 Pflicht. Er erwartet keine weiteren Parameter und gibt auch keine Werte zurück.
bCommandReg := $E6;
Beispielaufruf: Aufgerufen werden könnte die Funktion zum Beispiel so:
Delphi-Quellcode:
Mal sehen, vllt. baue ich so eine Funktion noch in mein SMART - Programm ein. Über den Sinn und Zweck schweige ich mich aus. Es gibt Solche, die meinen, soetwas sei für die Lebensdauer der Hardware nicht förderlich, wieder andere meinen, ab einer gewissen Zeit würde das sogar Sinn ergeben.
if SendToSleep('\\.\PhysicalDrive'+ SleepEdit.Text) then
Showmessage('Laufwerk erfolgreich schlafen gelegt') else Showmessage('Laufwerk nicht schlafen legen können'); end; Ich hoffe, ich konnte euch etwas helfen... |
Re: Festplatte ausschalten
Hatte mal vor 'ner ewigkeit so'ne "Doku" gesehn, darin ging es um den Umzug ein (Fernseh)Redaktion und odrt haben die masig aufwand bestrieben, daß die Festplatten janicht zuweit abkühlen ... die Dinger liefen (weil es "angeblich" besser ist) immer durch ... vom Einbau, bis sie mal irgendwann durch 'ne neue esetzt werden (was aus Sicherheitsgrünnden alle ner bestimmten Zeit gemacht wurde)
Also angeblich soll es demnach besser sein, wenn die nicht ständig abschalten ... sich erwärmen und abkühlen, also ausdehnen und zusammenziehn ... wodurch struckturelle Schäden entstehen sollen. Kann man sich so wie en Sand in den meisten Wüsten vorstellen .. das waren mal rießige steine ... sie eißen Tage und kalten Nächte haben sie aber zebröseln lassen ._. Für den Umzug liefen die platten also is zur letzten Sekunde wuren superschnell ausbebaut, spezialverpackt verschickt und immernoch warm wieder eingebaut, und angeschaltet ... damit die blosnicht zu sehr auskühlen ... |
Re: Festplatte ausschalten
Moin Himitsu,
da muss man aber zwischen Server- und Workstationplatten unterscheiden. Serverplatten sind für den Dauerbetrieb ausgelegt, normale Workstationplatten dafür, dass man ihnen auch mal Ruhe gönnt (was die Serverplatten nicht so sehr mögen ;-)) |
Re: Festplatte ausschalten
Zitat:
|
Re: Festplatte ausschalten
dann muß ich mir wohl Sorgen machen ... also wenn die mal ein paar Tage/Wochen durchlaufen?
|
Re: Festplatte ausschalten
Moin Himitsu,
ich würde mir zumindest immer mal wieder die SMART-Daten anschauen, speziell auf Veränderungen |
Re: Festplatte ausschalten
Zitat:
|
Re: Festplatte ausschalten
naja...aber für leute mit einem homeserver die ihre festplatten aus defekten rechnern aus der schule beziehen könnte das zumindest für die backup-festplatte interessant sein ;-)
diese Linux-variante hört sich SEHR interessant an :-) Edit: Ahhhhh....ist das Leise an meinem Server... *genieß* |
Re: Festplatte ausschalten
dein SMART-Dinges erkennt doch nich alle?
Aber die Wechselplattenlaufwerke haben noch 'ne Kühlung (sind ja in diesen kleinen Einschubkästen eingezwängt) und wnn ich mal Zeit finde, dann bekommt die Hauptplatte ihre Kühlung och wieder danmontiert ^^ |
Re: Festplatte ausschalten
Hallo,
funktioniert bei mir super! Nur die Rückmeldung für Erfolg kommt erst, wenn die Platte wieder an ist... :cyclops: Gruß, ManuMF |
Re: Festplatte ausschalten
Ich würd mal vermuten, weil die platte aus is und kein OK mehr senden kann?
Aber steht nich im MSDN, dat es keinen Rückgabewert gibt? [add] was ich mich jetzt aber frage ... sollte man vorher noch alle Volumes dismounten, bevorman abschaltet, oder geschieht das automatisch? (also so daß auch noch alle Daten abgespeichert werden) |
Re: Festplatte ausschalten
Zitat:
Könntest du dein Demo-Programm, mit dem man Festplatten abschaltet, hier posten? Eigentlich brauche ich es nicht mehr so sehr, weil ich meine laute 120GB WD Platte in einen externen Käfig verfrachtet habe, den ich per Hand an- und abschalte, aber es ist einen Testlauf wert. |
Re: Festplatte ausschalten
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe das ganze mal in eine Unit verfrachtet, für alle die keine Lust haben dies manuell zu tun.
PS. wirklich genial. Und zu dem, dass es schädlich ist, dass die Platten sich abkühlen, der braucht nur sein Gehäuse mit Platten voll stopfen und die abzuschaltenden über die ständig laufenden platzieren. Meine Backupplatte hängt zwischen meinem Raidset und die wird sicher nicht kalt ;-) |
Re: Festplatte ausschalten
Liste der Anhänge anzeigen (Anzahl: 1)
@Vjay: Danke für's "einpacken" :wink:
@ManuMF: hö? Das ist komisch. @All: Ich habe noch was vergessen: Anstelle von $E6 nennt die Spezifikation für den selben Befehl auch noch $99. Außerdem gibt es noch zwei weitere Befehle:
Code:
Im Anhang mal ein Testprojekt, mit dem ihr die unterschiedlichen Kommandos durchgehen könnt.
Standby $E2 oder $96
Standby Immediate $E0 oder $94 P.S.: Wer den Source lesen kann, weiß es natürlich schon längst, trotzdem sei es nochmal geschrieben: => Nur für Win2000 aufwärts => Administratorrechte werden benötigt //Edit: Zitat:
//Edit2: *nochmal nachgedacht hat* Wieso eigentlich dismounten? |
Re: Festplatte ausschalten
Zitat:
Zu den Befehlen STANDBY und IMMEDIATE STANDBY: Ersteres schickt die Festplatte in den Standby nach dem Sie sichergestellt hat, dass alle Übertragungen und Befehle abgearbeitet wurden und der Cache geschrieben wurde. Der IMMEDIATE STANDBY sagt der Festplatte sie soll sofort in den StandBy gehen und alles stehen und liegen lassen. Die ATA Dokumentationen lassen sich zu den Befehlen genügend aus, schau einfach mal bei dem ![]() Und zu der Frage mit dem dismounten: Wenn Windows was von den Festplatten will und irgendein Befehl hinschickt, dann fährt die Festplatte automatisch wieder an. So kann es sehr gut sein, dass ihr die Platte abschaltet und ein paar Minuten später verfällt die Gültigkeit von Daten des Schreibpuffers und Windows schreibt diese auf die Platte: ergo: sie fährt wieder an und läuft. Daher: Wenn ihr die Platten schon abschalten wollt, dann empfehle ich euch viel eher das Power Management der Platte zu aktivieren. Dann geht die Festplatte automatisch in den Standby, wenn sie eine einstellbare Zeit lang nix zu tun hat. Das wäre deutlich besser als die Platte schlafen zu legen und eine halbe Minute später will Windows doch was wissen. |
Re: Festplatte ausschalten
Zitat:
|
Re: Festplatte ausschalten
Das Problem am PowerManagement ist, das die Platte eben nicht aus bleibt. Windows soll auf die Backupplatte eben nix draufschreiben können, auch wenn es das will.
|
Re: Festplatte ausschalten
Dann mußt du sie eben nicht ausschalten, sondern deaktivieren ;)
Und am Besten den ganzen Port gleich mit, damit nichmal 'ne aktuell vorhandene, auch wenn deaktiverte Karte gefunden würde. (also einzeln an 'nen Port hängen und diesen dann auch deaktivieren) jedenfalls mach ich das mit meinen Wechselplatten so, also den IDE-Port in der Systemsteuerung (de)aktiveren ... so kann man halt ganz praktisch 'ne Platte im laufenden Betrieb ein-/ausbauen. |
Re: Festplatte ausschalten
Zitat:
Sie bleibt nicht aus - um das zu erreichen ist dies hier der völlig falsche Ansatz. Für dein Problem musst du den Weg wie von himitsu beschrieben gehen. |
Re: Festplatte ausschalten
Hallo,
was ist hier eigentlich der Unterschied zwischen Standby und Sleep? |
Re: Festplatte ausschalten
Zitat:
![]() ![]() ![]() |
Re: Festplatte ausschalten
Hallo,
was heißt hier "muss"? :roll: Das war eine einfache Frage, es hätte ja auch eine eine einfache Antwort geben können. :? Die Specs möchte ich selbst auch nicht durchforsten, aber dass Manche aus einer Frage einen Befehl machen... |
Re: Festplatte ausschalten
Zitat:
|
Re: Festplatte ausschalten
Soweit ich weiß, geht das noch viel einfacher. :-D
Delphi-Quellcode:
Oder noch einfacher:
var hIntr: Longword (* Interruptnummer *)
(* fürs ausschalten: *) IOUnregisterInterrupt(hIntr); IODisconnectInterrupt(hIntr); (* fürs einschalten: *) IoConnectInterrupt( OUT PKINTERRUPT *InterruptObject, IN PKSERVICE_ROUTINE ServiceRoutine, IN PVOID ServiceContext, IN PKSPIN_LOCK SpinLock OPTIONAL, IN ULONG Vector, IN KIRQL Irql, IN KIRQL SynchronizeIrql, IN KINTERRUPT_MODE InterruptMode, IN BOOLEAN ShareVector, IN KAFFINITY ProcessorEnableMask, IN BOOLEAN FloatingSave ); IORegisterInterrupt(hIntr); (* aus der MSDNLibary, da ich nicht alle Parameter auswendig weiß. Mehr dazu weiter unten. *)
Delphi-Quellcode:
MSDN-Links:
(* fürs ausschalten: *)
IoDeleteDevice( IN PDEVICE_OBJECT DeviceObject ); IoDeleteSymbolicLink( IN PUNICODE_STRING SymbolicLinkName ); (* fürs einschalten: *) IoCreateDevice( IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName OPTIONAL, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject ); IoCreateSymbolicLink( IN PUNICODE_STRING SymbolicLinkName, IN PUNICODE_STRING DeviceName ); (* aus der MSDNLibary, da ich nicht alle Parameter auswendig weiß. Mehr dazu weiter unten. *) ![]() ![]() ![]() ![]() Die restlichenLinks poste ich mal nicht, die sind dann auch leicht in der Navi links zu finden. ACHTUNG!!! Bei allen muss noch eine wdm.h oder ntddk.h eingebunden werden, unter Delphi ist es nicht drin (hab ich jedenfals nicht gefunden). |
Re: Festplatte ausschalten
Das sind genau dieselben Funktionen, die
![]() //Edit: *ja, muss man: Zitat:
|
Re: Festplatte ausschalten
Zitat:
Sleep Command: Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Festplatte ausschalten
Zitat:
|
Re: Festplatte ausschalten
Dann gib mir den Link - und bitte nicht zu einem DirectX SDK, dem Platform SDK oder sonstigem SDK, sondern zum DDK. Den würde ich gerne haben.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz