Wie kann ich / tmp (sicher) auf ein anderes Volume verschieben?

17

Heute /tmpfüllte sich das Verzeichnis auf einer Maschine bei der Arbeit. Das Problem war, dass es sich auf der Root-Partition befand, die nicht sehr groß war. Um dies zu beheben, hat ein Mitarbeiter ein /new/tmpVerzeichnis an einer anderen Stelle erstellt, den gesamten Inhalt in das neue Verzeichnis kopiert, das Original entfernt /tmpund einen Symlink erstellt /tmp -> /new/tmp.

Als er die Dateien kopiert (wirklich, das war jemand anderes, nicht ich!) Er nicht genutzt , -aso dass die Besitzer von jeder Datei unter /new/tmpwaren root. Darüber hinaus hat er die Berechtigungen des /new/tmpVerzeichnisses nicht festgelegt, sodass dies die Standardeinstellung 0755 war. Dies verursachte ein ständiges Beenden des Problems und sogar das Ändern des Modus und der Besitzerbits konnten den Computer nicht in einen akzeptablen Betriebszustand zurückversetzen. Am Ende musste ich alles einschleusen /tmpund neu starten.

Das /tmpVerzeichnis enthielt verschiedene Sockets und Pipes und so weiter, da eine Menge Leute Gnome über VNC ausführen und ich ein Verzeichnis verwende, screendas über eigene Pipes verfügt.

Gibt es eine sichere Möglichkeit, ein /tmpVerzeichnis auf einem laufenden System auf ein anderes Volume zu verschieben? Ich bin mir nicht sicher, was ich getan hätte, um alles am Laufen zu halten. Ich bin besonders gespannt, was mit Rohren und Muffen passiert.

Greg Hewgill
quelle

Antworten:

20

Auf "Client" -Maschinen ist der sichere Weg zum Verschieben ein /tmpNeustart. Unter Client verstehe ich hier alles, was Programme ausführt, die Sockets verwenden /tmp, insbesondere X-Server und -Screen.

Das neue muss /tmpdefinitiv die richtigen Berechtigungen haben (1777), sonst kann man nicht hoffen, ein funktionierendes System zu haben.

Denn /tmpSie können so gut wie keine Dateien kopieren. Das liegt daran, dass die meisten Programme, die Inhalte /tmpspeichern, die Dateien öffnen. Wenn Sie die Datei kopieren, wird der Inhalt kopiert, die alten Dateien sind jedoch weiterhin in den Programmen geöffnet. Möglicherweise können Sie mit einem Debugger ( ptrace) auf sie zugreifen , dies ist jedoch viel komplizierter als ein Neustart. Bei vielen Programmen müssen Sie sie ohnehin zum Absturz bringen.

Wenn Ihr /tmpComputer voll ist und Sie live zu einem neuen wechseln möchten, müssen Sie alle Programme neu starten, deren Dateien dort geöffnet sind. Da dies bedeutet, dass X- und Bildschirmsitzungen neu gestartet werden, ist es nicht viel besser als ein Neustart.

Sie sollten in der Lage sein, auf neue Programme umzuschalten, vorhandene geöffnete Dateien jedoch mithilfe eines Union-Mounts an Ort und Stelle zu halten . (Das Prinzip ist solide, aber ich habe es nie versucht, daher kann es zu unerwarteten Problemen kommen.) Hier ist eine Möglichkeit, dies unter Linux zu tun.

  1. Behalten Sie alle vorhandenen Dateien bei, mit /tmpAusnahme einiger großer Dateien, die manuell ausgewählt wurden.
  2. Erstellen Sie eine /tmp.new(Modus 1777).
  3. Expose /tmpauf einem anderen Weg: mount --bind / /.root.only. Dies ist notwendig, da der nächste Schritt Schatten erzeugt /tmp. Möglicherweise gibt es verschiedene Implementierungen von Union Mount, für die dieser Schritt nicht erforderlich ist.
  4. Machen Sie eine Union Mount von /.root.only/tmpund /tmp.new, montiert auf /tmp. Auf diese Weise werden neu erstellte Dateien in /tmpgeschrieben /tmp.new, aber die Dateien in /.root.only/tmpwerden auch unter angezeigt /tmp. Eine Möglichkeit ist unionfs-Sicherung : unionfs-fuse /tmp.new:/.root.only/tmp /tmp.

Wenn Sie nicht auf die Union-Mount-Root zugreifen möchten (z. B. weil sie auf Ihrer Plattform nicht verfügbar ist oder weil es zu viele Probleme gibt), löschen Sie zumindest nicht das alte Verzeichnis. Verschieben Sie es, damit laufende Programme weiterhin das alte und neue Programme das neue Verzeichnis verwenden. (Natürlich können neue Programme nicht über Sockets oder Pipe-In mit alten Programmen kommunizieren, es /tmpsei denn, Sie legen fest TMPDIRoder teilen ihnen auf andere Weise mit, wo sie suchen sollen.)

mv /tmp /tmp.old && mkdir /tmp
Gilles 'SO - hör auf böse zu sein'
quelle
Würde es Ihnen etwas ausmachen zu klären, wie der neue Speicherort von / tmp durch einen Neustart beibehalten werden kann?
FoxDeploy
@FoxDeploy Gib einen Eintrag dafür ein/etc/fstab
Gilles 'SO - hör auf, böse zu sein'
Könnten Sie das näher erläutern?
FoxDeploy
@ FoxDeploy Ich bin nicht sicher, was Sie hier fragen. Wenn Sie sich /tmpan einem anderen Ort als dem Root-Dateisystem befinden möchten , listen Sie es auf /etc/fstab, genau wie jedes andere Dateisystem, das Sie beim Booten bereitstellen möchten. Wenn Sie das nicht fragen, sollten Sie eine neue Frage mit genügend Kontext stellen.
Gilles 'SO- hör auf böse zu sein'