Ich benutze Debian Stretch. Meine Root-Partition ist gemountet read-only
. Nur wenn ich Pakete installiere oder aktualisiere, wird sie erneut /
bereitgestellt read-write
(mithilfe von apt hook) und anschließend erneut bereitgestellt ro
.
Manchmal kann ich nach einem Paket-Upgrade nicht /
wieder schreibgeschützt einbinden :
mount -o remount,ro /
mount: / is busy
In älteren Debian-Versionen (Wheezy) konnte ich offene Dateien auflisten, mit denen keine Verknüpfung bestand lsof
:
lsof +L1
oder genauer gesagt, Dateien, die /
ein erneutes Einhängen in ro verhindern:
{ lsof +L1 ; lsof|sed -n '/SYSV/d; /DEL|(path /p;' ; } | grep -Ev '/(dev|home|tmp|var)'
Unter Debian Stretch werden lsof +L1
jedoch keine Dateien aufgelistet.
Ich sehe keine Änderungen +|-L
in man lsof
das würde erklären , warum es funktioniert nicht mehr.
Warum listet lsof + L1 keine offenen Dateien mehr auf, deren Verknüpfung aufgehoben wurde?
Wie kann ich die Dateien auflisten, die verhindern, dass sie erneut schreibgeschützt bereitgestellt werden?
AKTUALISIEREN
Ich habe alle Prozesse gestoppt , die gestoppt werden kann und nur haben init
und getty
immer noch laufen, aber ich kann immer noch nicht remount /
zu ro
.
w
oderu
in derFD
Spalte derlsof
Ausgabe oder beispielsweise nachF
in der Ausgabe vonfuser -vm /
. Ich kann Ihnen jedoch keine vollständige Liste geben. Möglicherweise möchten Sie auch das Needrestart- Paket installieren .root
?fuser -m /
, was ist mit root?Antworten:
Wie kann ich die Dateien auflisten, die verhindern, dass sie erneut schreibgeschützt bereitgestellt werden?
A)
fuser
finden Sie in derpsmisc
Packung; Dies ist ein Anwendungsfall, in dem ichfuser
Shines & als nützlicher empfindelsof
.# fuser -v -m / 2>&1 | grep '[Ff]r.e'
Daraufhin werden alle Prozesse angezeigt, bei denen Dateien zum Lesen (f) und Schreiben (F) geöffnet sind. Die Dateien, die verhindern würden, dass sie wieder in den schreibgeschützten Zustand versetzt werden, sind solche, die zum Schreiben geöffnet werden (F).
Tötet die Prozesse , die ein sind ausführbar ist , laufen mit Root - Verzeichnis - Dateien zum Schreiben geöffnet ., Dh
# for fupid in $(fuser -v -m / 2>&1 | grep Fr.e | awk '{print $2}'); do kill $fupid; done
Das steht über den
systemd
Kommentaren mit einer Einschränkung. Wennsystemd
esinit
dann ist,fuser
wird es sehen und es gibt andere Überlegungen. Beimsystemd
Laufen können Prozesse hinter Ihrem Rücken (neu) gestartet werden, auch wenn sie gerade identifiziert und getötet wurdenfuser
.systemd
ist viel weiter fortgeschritten als die traditionellesysvinit
.B) Das UPDATE in der Beschreibung gibt an, dass das System nur ...
init
undgetty
noch läuft ...Ich sehe den Kommentar, der besagt, dass das System nicht verwendet
systemd
, sondern verwendetinit
. Auf der Streckesystemd
istinit
. In dem Kommentar wurde nicht ausdrücklich darauf hingewiesensysvinit
, daher gehe ich davon aus, dass das betreffende System möglicherweise die Standardausdehnungsystemd
für verwendetinit
. Oder dass andere Leute, die über diesen Beitrag stolpern und Stretch verwendensystemd
, diesen Teil nützlich finden.Per dem Debian - Wiki ,
Mit
systemd
Laufen müssen einige zusätzliche Schritte unternommen werden, um das Programm freizugeben, damit es problemlos erneut bereitgestellt werden kann.Es ist wahrscheinlich
system.slice
, dass Dateien fürsystemd-journald.service
oder geöffnet sindsystemd-udevd.service
(beide haben Socket-Abhängigkeiten). Oder, wennNetworkManager
es läuft, kann es erneut erscheinen,dhclient
was Leases in / var / ... schreibt (& / var / ist nicht immer sein eigenes Gerät), etc. findetfuser
möglicherweise & Sie tötendhclient
aberNetworkManager
es beginnt gleich wieder nach oben.Die Moral ist, dass viele Dinge automatisiert sind, die "wollen" (und noch mehr mit "wollen")
systemd
).Um sicherzugehen, wenn es machbar ist, wird das
systemd
Äquivalent von Laufstufe 1 mitrescue.target
(und) abgeglichenrunlevel1.target
ist ein symbolischer Link zurescue.target
) .1) Beginnen Sie, indem Sie das System von isolieren
rescue.target
# systemctl isolate rescue.target
Es sollte Sie auffordern, das root-Passwort einzugeben. Folgen Sie den Anweisungen auf dem Bildschirm.
2) Finde in der Rettungshülle heraus, was du willst.
# systemctl show -p Wants /
Normalerweise ist es
system.slice
; alles aufhalten, was will. z.B# systemctl stop system.slice
3) An diesem Punkt sollte die Remount nicht berichten
mount: / is busy
undmount -o remount,ro /
soll funktionieren. Wenn nicht, überprüfen Sie erneut mitfuser
.4) FWIW; Ich habe auch mal gesehen, wann ein
umount
Fehler auftritt, wenn / wenn ein anderes Gerät in einem Unterverzeichnis eines anderen Mounts gemountet ist, dh verschachtelte Mounts. Zum Beispielumount /
würde fehlschlagen, wenn / var / oder / boot / auf einem anderen Gerät (und gemountet) ist. Solltemount -o remount,ro /
aber in diesem Fall noch funktionieren.lsblk
kann hilfreich sein, um verschachtelte Reittiere zu visualisieren.Warum listet lsof + L1 keine offenen Dateien mehr auf, deren Verknüpfung aufgehoben wurde?
Da sie nicht verfügbar sind (Sockets oder die meisten FIFOs und Pipes), sind sie nicht mehr geöffnet (der übergeordnete Prozess hat den Dateideskriptor geschlossen) oder sie haben (immer noch) eine Linkanzahl größer als 1.
man lsof (8) details ...
quelle
Hast du
/proc
bestiegen?Anscheinend jemand zu sein, der sich darum kümmert
/
meiste Zeit nur lesbar gemountet wird, und ich kann mir vorstellen, dass Sie sich auch dafür entschieden haben, procfs nicht zu mounten. Aber procfs wird benötigtlsof
, um offene Dateien zu finden.Von Prozessen geöffnete Dateien werden vom Kernel über symbolische Links in procfs verfügbar gemacht. Die Verzeichnisse
/proc/<pid>/fd
enthalten für jede geöffnete Datei einen Symlink. Der Name der Symlinks ist die Nummer des Dateideskriptors, und der Pfad, auf den der Symlink verweist, ist der Dateipfad.Dangling-Symlinks bleiben weiterhin erhalten
/proc
Bei geöffneten Dateien, die bereits gelöscht wurden, . Der referenzierte Pfad der Datei wird umbenannt und endet mit "(gelöscht)".Was
lsof +L1
macht, unterscheidet sich im Wesentlichen nicht von einem schnellen Einzeiler wie:Sie können also einen ähnlichen Einzeiler verwenden, um alle offenen Dateien aufzulisten, die möglicherweise verhindern, dass das Root-Dateisystem erneut bereitgestellt wird (sofern dies funktioniert
/proc
).Wenn Sie jedoch
/proc
gemountet haben, sind die einzigen anderen Ursachen, an die ich denken kann, Fehler ... Wie auch immer, zu Ihrer Information, auf meinem aktuellen Debian-Stretch-System.lsof +L1
funktioniert wie erwartet.quelle
/proc
bestiegen. Ich folge Ihrer Argumentation nicht, warum ich es vielleicht nicht getan habe. Sowiesostat -c%N /proc/[0-9]*/fd/* | grep deleted
zeigt mir nichts.Ich konnte dieses Problem nur einmal reproduzieren und löste es
mount
mit der Option -n .Zitat von man mount :
Das
mount
Programm selbst, das Dateien zum Schreiben in das Root-Dateisystem öffnete , klang für mich nach einer plausiblen Erklärung. Speziellmount
schreibt/etc/mtab
immerhin und/etc
oft Teil des Root-Dateisystems. Ich konnte es jedoch nicht mehr auf demselben Computer reproduzieren, nachdem ich es einmal gemacht hatte ...Könnte dies Ihr Problem lösen?
quelle
-n
mit mount macht keinen Unterschied.Ohne Einblick in Ihr System ist es sehr schwierig, das genaue Problem zu ermitteln. Die Kommentare und vorherigen Antworten sind gute Starts.
Das heißt, ich würde den ganzen Weg durch das Debian-Wiki zurückgehen, das die Voraussetzungen für das Mounten / Nur-Lesen beschreibt.
Der Link zur Dokumentation ist hier: https://wiki.debian.org/ReadonlyRoot
Die Große werde ich dir hier zeigen:
1 - Es gibt bestimmte Stellen unter /, die gelesen und geschrieben werden müssen. Basierend auf der Dokumentation sieht es ungefähr so aus:
Ihre Block-Geräte unterscheiden sich wahrscheinlich in Abhängigkeit von Ihrer Storage-Stack-Konfiguration (Partitionen, Partitionless Lvm usw.). Die Hauptidee ist jedoch, dass Sie diese 4 Mount-Punkte benötigen, um das nachfolgende gemountete Dateisystem für die RW-Mount-Option zu haben.
2 - Es gibt eine Reihe von speziellen Dateien in / etc, für die Sie entweder einen symbolischen Link erstellen oder eine andere Änderung vornehmen müssen (speziell im verlinkten Artikel beschrieben). Diese können auf der Grundlage der auf Ihrem Linux-Server ausgeführten Anwendungen angewendet werden oder nicht. Einige der Dateien sind möglicherweise noch nicht einmal auf Ihrem Computer vorhanden, aber ich habe alles in die Dokumentation aufgenommen. Denken Sie daran, ich empfehle dringend, diese Änderungen vorzunehmen, AUCH WENN Sie die PID des Prozesses getötet haben. Hier sind die Pfade direkt aus dem Debian-Wiki:
Nachdem Sie alle oben genannten Punkte überprüft und bestätigt haben, dass sie den Spezifikationen im Wiki entsprechen, müssen Sie als Nächstes /etc/apt/apt.conf überprüfen
Anhand Ihres Fehlers können Sie Folgendes abschließend anhand der Dokumentation überprüfen:
"Nach einem Upgrade von Paketen könnten Sie mit dem Problem konfrontiert werden, dass mount die erneute Bereitstellung des Dateisystems verweigert und Ihnen nur mitteilt, dass / ausgelastet ist. Dies wird durch gelöschte Dateien verursacht, die noch von einem Prozess verwendet werden. Um herauszufinden, welche Prozesse verwendet werden, verwenden Sie Deleted Dateien verwenden das Tool checkrestart (1) aus dem Paket debian-goodies oder den folgenden Befehl. Oft sind dies Daemons, die aktualisierte Bibliotheken verwenden. Sie müssen sie neu starten, damit die Dateien freigegeben werden. "
Befehl im Dokument bereitgestellt:
Ohne Ihre genaue Dateisystemkonfiguration, Partitionierung und Speichergerätekonfiguration zu kennen, ist es schwierig, Ihnen noch viel zu folgen. Ich würde damit beginnen, Ihre Voraussetzungen in der Dokumentation noch einmal zu überprüfen (und oben umrissen).
quelle