CIFS-Zugriffsproblem auf Windows
Versucht man mit "mount" unter Linux eine Dateifreigabe, also ein "Netzwerklaufwerk", von Microsoft Windows Vista oder 7 einzuhängen, kann es zur Fehlermeldung "Cannot allocate memory" kommen. Aber wie löst man das Problem und was ist dabei eventuell noch zu beachten?
Wenn man von Linux aus auf eine Dateifreigabe (auch "Netzwerklaufwerk") von Microsoft Windows zugreifen möchte führt man das an der Konsole normalerweise mit dem Befehl mount bzw. mount.cifs durch. Technisch kommt dabei das CIFS-Protokoll als Nachfolger des SMB-Protokolls zum Einsatz. In Verbindung mit Microsoft Windows Vista oder Microsoft Windows 7 kommt es jedoch verhältnismäßig oft zu einem Fehler - selbst wenn alle Berechtigungen auf Windows-Seite korrekt sind:
tux:~ # mount -t cifs -o guest //192.0.2.24/freigabe /mnt/
mount error(12): Cannot allocate memory
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
tux:~ #
Diese Fehlermeldung kann verschiedene Ursachen haben. Diverse Anleitungen und Artikel im Internet schlagen daraufhin irgendwelche Anpassungen der Windows-Registrierungsdatenbank vor und empfehlen gleichzeitig irgendwelche anderen Anpassungen an der Windows-Registry wiederum nicht vorzunehmen - ohne sich allerdings mit der Ursache und eventuellen Meldungen auf Windows-Seite zu beschäftigen.
Abhängig davon ob es sich bei dem eingesetzten Microsoft Windows um ein Workstation- oder ein Server-Produkt handelt gibt es ein unterschiedliches internes Performance-Tuning. Diese Unterscheidung gibt es übrigens bereits schon seit Microsoft Windows NT 4.0. Der ursprüngliche TechNet-Artikel der dieses Verhalten beschreibt ist inzwischen nicht mehr öffentlich verfügbar allerdings enthält das Dokument "Systems Internals Tips and Trivia" von Mark Russinovich eine Kopie der Informationen. Darüber hinaus geht der TechNet-Artikel "File Cache Performance and Tuning" auf die Auswirkungen bzw. Veränderungen durch Anpassung der nachfolgenden beiden Registry-Einstellungen ein. Prüfen Sie bitte ob sich in der Ereignisanzeige (auch "Event Viewer" genannt) eine der beiden Fehlermeldungen findet. In einem deutschsprachigen Windows-System lautet diese:
Quelle: srv
Ereignis-ID: 2017
Ebene: Fehler
Der Server konnte keinen nicht-ausgelagerten Poolspeicher reservieren, da die konfigurierte Grenze für die Reservierung von nicht-ausgelagertem Poolspeicher erreicht wurde.
Handelt es sich hingegen um ein englischsprachiges Windows-System so lautet die Meldung entsprechend:
Source: srv
Event ID: 2017
Level: Error
The server was unable to allocate from the system nonpaged pool because the server reached the configured limit for nonpaged pool allocations.
Findet sich eine der beiden obigen Fehlermeldungen in Ihrer Ereignisanzeige, so sind zwei Registry-Anpassungen erforderlich:
- Der Schlüssel HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\LargeSystemCache steht standardmäßig auf 0 und muss auf 1 abgeändert werden.
- Der Schlüssel HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\Size ist standardmäßig auf 1 bzw. 2 (je nach System) gesetzt und muss auf 3 abgeändert werden.
An einer Eingabeaufforderung mit Administrator-Rechten kann dies mit den nachfolgenden beiden Aufrufen kurzerhand erledigt werden:
C:\>reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v "LargeSystemCache" /t REG_DWORD /d 1 /f
Der Vorgang wurde erfolgreich beendet.
C:\>
C:\>reg add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" /v "Size" /t REG_DWORD /d 3 /f
Der Vorgang wurde erfolgreich beendet.
C:\>
Starten Sie anschließend den Rechner neu und versuchen Sie danach erneut unter Linux die Dateifreigabe einzuhängen. Einige andere Anleitungen verweisen darauf, dass es anstatt des Neustarts ausreichend wäre den Systemdienst "Server" (oder "Server service" bei einem englischsprachigen Windows) mittels services.msc oder net stop server gefolgt von net start server neu zu starten - in der Praxis hat dies bei mir immer wieder zu unerwünschten Nebeneffekten wie hängenden Diensten geführt.
Funktioniert der Zugriff weiterhin nicht, prüfen Sie bitte ob Sie eventuell eine der beiden nachfolgenden Meldungen in der Ereignisanzeige finden:
Quelle: srv
Ereignis-ID: 2011
Ebene: Fehler
Der Konfigurationsparameter "irpstacksize" des Servers ist zu klein, um ein lokales Gerät zu verwenden. Vergrößern Sie den Wert dieses Parameters.
Handelt es sich nicht um ein deutschsprachiges sondern um ein englischsprachiges Windows-System, lautet die Meldung:
Source: srv
Event ID: 2011
Level: Error
The server's configuration parameter "irpstacksize" is too small for the server to use a local device. Please increase the value of this parameter.
Sollte sich eine der beiden vorigen Fehlermeldungen in Ihrer Ereignisanzeige finden, muss der Registry-Schlüssel HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanServer\Parameters\IRPStackSize erhöht werden. Der Standardwert ist 15 (dezimal) und eine Erhöhung des Wertes sollte gemäß "Antiviren-Programm verursacht Ereignis-ID 2011" bzw. "Beschreibung des Parameters "IRPStackSize" in Windows" immer um 3 erfolgen, d.h. beispielsweise auf 18. Bitte denken Sie unbedingt bei manueller Anpassung in der Windows-Registry daran die Basis-Option von "Hexadezimal" auf "Dezimal" umzustellen (oder Sie rechnen den Wert von dezimal in hexadezimal um). An einer Eingabeaufforderung mit Administrator-Rechten kann die betreffende Registry-Anpassung mit dem nachfolgenden Aufruf einfach erledigt werden:
C:\>reg add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" /v "IRPStackSize" /t REG_DWORD /d 18 /f
Der Vorgang wurde erfolgreich beendet.
C:\>
Hintergrund ist, dass die Workstation-Varianten von Microsoft Windows standardmäßig nicht für die Verwendung als Dateiserver optimiert sind. Die obige Einstellung passt die sogenannten I/O Request Packets an; je Stack werden 36 Byte Speicher pro Empfangspuffer verwendet. Auch nach dieser Anpassung starten Sie bitte den Computer neu und versuchen Sie das Einhängen der Dateifreigabe unter Linux. Einige andere Anleitungen verweisen darauf, dass es anstatt des Neustarts ausreichend wäre den Systemdienst "Server" (oder "Server service" bei einem englischsprachigen Windows) mittels services.msc oder net stop server gefolgt von net start server neu zu starten - in der Praxis hat dies bei mir immer wieder zu unerwünschten Nebeneffekten wie hängenden Diensten geführt.
Gegebenenfalls ist es in seltenen Fällen erforderlich den Wert nachträglich noch weiter zu erhöhen wobei die Maximalgrenze bei (dezimal) 50 liegt.