Linux-Server hat nicht genügend Speicherplatz

31

Diese Frage wurde mir in zwei aufeinanderfolgenden Interviews gestellt, aber nach einigen Recherchen und Gesprächen mit verschiedenen Systemadministratoren habe ich keine gute Antwort erhalten. Ich frage mich, ob mir hier jemand helfen kann.

Auf einem Server ist nicht genügend Speicherplatz vorhanden. Sie stellen fest, dass eine sehr große Protokolldatei sicher entfernt werden kann. Sie löschen die Datei, aber der Datenträger zeigt weiterhin an, dass er voll ist. Was würde dies verursachen und wie würden Sie es beheben? Und wie würden Sie herausfinden, welcher Prozess diese riesige Protokolldatei schreibt?

ewwhite
quelle
3
Sie müssen mit besseren Systemadministratoren sprechen. Das ist triviales Zeug.
womble
2
Trivial, aber die Situation und die Frage kommt oft genug ...
ewwhite
Wird das OP dies akzeptieren können?
ewwhite
5
Trivial oder nicht, für jemanden, der nicht * nix fließend spricht (z. B. einen primären Windows-Administrator), ist dies ein guter Lernstoff.
John Gardeniers

Antworten:

56

Dies ist eine häufig gestellte Interviewfrage und eine Situation, die in einer Vielzahl von Produktionsumgebungen auftritt.

Die Verzeichniseinträge der Datei wurden gelöscht, der Protokollierungsprozess wird jedoch weiterhin ausgeführt. Der Speicherplatz wird vom Betriebssystem erst dann freigegeben, wenn alle Dateizugriffsnummern geschlossen wurden (z. B. wenn der Prozess abgebrochen wurde) und alle Verzeichniseinträge entfernt wurden. Um den Prozess zu finden, der in die Datei schreibt, müssen Sie den lsofBefehl verwenden.

Der andere Teil der Frage kann manchmal lauten: "Wie löscht man eine Datei, in die geschrieben wird, ohne den Prozess zu beenden?" Im Idealfall würden Sie die Protokolldatei mit so etwas wie "null" oder "kürzen",: > /var/log/logfile anstatt die Datei zu löschen.

ewwhite
quelle
1
... oder fuser.
Steven Montag
1
Ein bisschen erweitern: Bis alle Verweise auf eine Datei auf der Festplatte verschwunden sind, kann dieser Speicherplatz nicht von etwas anderem verwendet werden. Das schließt Dateihandles ein. Damit funktioniert auch dieser Trick: serverfault.com/questions/45237/link-to-a-specific-inode
Jeff Ferland
1
Wenn Sie festgelegt haben no-clobber, versuchen Sie:>| /var/log/logfile
Belmin Fernandez
2
Ich stelle bei jedem Interview eine Variante dieser Frage: "Sie erhalten Nachrichten mit voller Festplatte. Sie haben nicht genügend Speicherplatz df, duSie verwenden kaum welche. Was ist der Grund dafür und warum stimmen die beiden Tools nicht überein?"
Voretaq7
Was tun, wenn nach > /var/log/filedem Speicherplatz auf der Festplatte immer noch 100%? Die Protokolldatei scheint leer zu sein ... aber erst nach dem Neustart des Programms, das in diese Protokolldatei schreibt, wird der Speicherplatz wiederhergestellt. Gibt es eine Möglichkeit, den Speicherplatz wiederherzustellen, ohne das Programm neu zu starten?
Alemani
14

Es gibt noch einen weiteren Link zur Datei (entweder fester Link oder offenes Dateihandle). Durch Löschen einer Datei wird nur der Verzeichniseintrag gelöscht. Die Dateidaten und der Inode hängen herum, bis der letzte Verweis darauf entfernt wurde.

Es ist eine gängige Praxis, dass ein Dienst eine temporäre Datei erstellt und diese sofort löscht, während die Datei geöffnet bleibt. Dadurch wird eine Datei auf dem Datenträger erstellt. Es wird jedoch sichergestellt, dass die Datei gelöscht wird, wenn der Prozess abnormal beendet wird, und es wird auch verhindert, dass andere Prozesse versehentlich auf die Datei zugreifen. MySQL führt dies beispielsweise für alle temporären Tabellen auf der Festplatte durch. Malware verwendet häufig ähnliche Methoden, um ihre Dateien zu verbergen.

Unter Linux können Sie bequem auf diese gelöschten Dateien zugreifen als /proc/<pid>/fd/<filenumber>.

tylerl
quelle
8

Ich bin kein Systemadministrator, aber nach dem, was ich unter Unix.SE zusammengetragen habe, löscht ein Linux-System eine Datei nicht (markieren Sie den Speicherplatz als frei / wiederverwendbar), nachdem die Verknüpfung aufgehoben wurde, bis alle darauf verweisenden Dateideskriptoren dies getan haben wurde geschlossen. Um den ersten Teil zu beantworten, ist der Speicherplatz noch nicht frei, da er noch von einem Prozess gelesen wird. Zur Beantwortung der zweiten Frage können Sie sehen, bei welchem ​​Prozess die Datei verwendet wird lsof.

Kevin
quelle
2

Eine alternative Antwort neben der offensichtlichen Antwort auf Hardlink / Open File: Diese Datei ist eine (sehr) spärliche Datei wie /var/log/lastlogauf RHEL, die eigentlich nicht so viel Platz in Anspruch nimmt. Das Löschen hatte nur geringe Auswirkungen. Sie müssen sich daher die nächstgrößere Datei ansehen.

Alexios
quelle
1

Wenn der Prozess, bei dem die Datei geschrieben wird, root ist, wird in den für den Superuser reservierten Dateibereich geschrieben. Das Dateisystem verfügt über diesen Speicherplatz, um ein System betriebsbereit zu halten, falls eine Benutzeraufgabe den Datenträger füllt. Dieser Bereich (imho per default 5%) ist für viele Tools unsichtbar.

lsof kann Ihnen zeigen, welcher Prozess die Datei gesperrt hat, ergo schreibt darauf.

Jemand
quelle
1
Sie können diesen Reserveprozentsatz auch mit tune2fs einstellen. Dies kann eine schnelle Möglichkeit sein, dem Server die Fortsetzung der Ausführung zu ermöglichen, während Sie Speicherplatz freigeben.
Sjbotha
1

Ein zweiter Fall ist, dass die Datei nicht nur von einem Prozess geöffnet wird, sondern auch von einem Dateisystem, das Snapshots wie btrfsoder unterstützt ZFS.

Zum Beispiel machen Sie einen Schnappschuss mit der riesigen vorhandenen Protokolldatei. Wenn Sie die Datei jetzt löschen, wird nur das Delta gelöscht. Das Delta wird nur gelöscht, wenn die Datei nicht verwendet wird.

Siehe auch:

Ein dritter Fall liegt vor, wenn Sie ein Dateisystem haben, das die Deduplizierung auf Blockebene unterstützt und der größte Teil der Datei mit einer anderen Datei identisch ist. Ich erwarte nicht, dass dies für ein Protokoll geschieht, es sei denn, Sie haben einen Container oder eine VM, die die Protokolle an einen Syslog-Container oder eine VM sendet, die denselben FS verwenden, sodass die Protokollinhalte identisch sind.

Mircea Vutcovici
quelle