Post 1065
Windows

mount error(12): Cannot allocate memory beim Einbinden von Windows-Freigaben

Wer Windows-Netzwerkfreigaben von einem Linux-System aus einbinden möchte, stößt gelegentlich auf die kryptische Fehlermeldung mount error(12): Cannot allocate memory. Der Name ist irreführend – es handelt sich nicht um einen tatsächlichen Speichermangel auf dem Linux-System, sondern um einen bekannten Bug auf der Windows-Serverseite.

Fehlerbild

Der Fehler tritt beim Ausführen von mount.cifs auf:

sudo mount -t cifs //192.168.1.100/freigabe /mnt/share -o username=user,password=pass

mount error(12): Cannot allocate memory
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
  and kernel log messages (dmesg)
  for more information.

Der dmesg-Ausgabe gibt oft zusätzlichen Hinweis:

dmesg | tail -20

Ursache: IRPStackSize zu klein

Der eigentliche Grund liegt auf dem Windows-Server: Der Parameter IRPStackSize (I/O Request Packet Stack Size) des Windows-Dienstes Server (LanmanServer) ist zu klein eingestellt. Dieser Wert bestimmt, wie viele Ebenen von Treibern einen I/O-Request weiterverarbeiten können. Der Standardwert (typischerweise 11 oder 15) reicht in bestimmten Konfigurationen – etwa wenn viele Treiber oder Sicherheitssoftware beteiligt sind – nicht aus.

Windows liefert dann intern den Fehlercode STATUS_INSUFF_SERVER_RESOURCES, was Linux als ENOMEM (Fehler 12: Cannot allocate memory) interpretiert.

Lösung: IRPStackSize in der Registry erhöhen

Auf dem Windows-Server (nicht auf dem Linux-Client) folgenden Registry-Wert setzen oder erhöhen:

Schlüssel: HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesLanmanServerParameters
Name:      IRPStackSize
Typ:       REG_DWORD
Wert:      15

Falls der Wert bereits existiert aber kleiner als 15 ist, auf 15 erhöhen. Wenn das Problem weiterhin besteht, schrittweise erhöhen (bis maximal 50).

Änderung per PowerShell

Die Registry-Änderung lässt sich auch per PowerShell als Administrator setzen:

# PowerShell als Administrator
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetServicesLanmanServerParameters" `
    -Name "IRPStackSize" -Value 15 -Type DWord

# Aktuellen Wert prüfen
Get-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetServicesLanmanServerParameters" `
    -Name "IRPStackSize"

Server-Dienst neu starten

Die Änderung wird erst nach einem Neustart des Server-Dienstes wirksam – ein vollständiger Neustart von Windows ist nicht erforderlich:

# PowerShell als Administrator
Restart-Service LanmanServer

# Oder per CMD
net stop server && net start server

Achtung: Das Neustarten des Server-Dienstes trennt kurzzeitig alle aktiven Netzwerkverbindungen zu diesem Windows-System. Am besten in einer Wartungszeit durchführen.

Mount-Befehl nach der Korrektur

Nach dem Neustart des Server-Dienstes das Einbinden erneut versuchen:

sudo mount -t cifs //192.168.1.100/freigabe /mnt/share     -o username=user,password=pass,uid=$(id -u),gid=$(id -g)

Für permanentes Einbinden via /etc/fstab:

//192.168.1.100/freigabe  /mnt/share  cifs  username=user,password=pass,uid=1000,gid=1000,iocharset=utf8  0  0

Mit dem erhöhten IRPStackSize-Wert und einem Neustart des Server-Dienstes ist der Fehler dauerhaft behoben – ohne jegliche Änderungen am Linux-System.