Das Dateisystem kann nach dem Paket-Upgrade nicht wieder schreibgeschützt bereitgestellt werden


10

Auf meinem Debian-System habe ich meine /auf separater Partition und gemountet read-only. Nur /home/, /var/und /tmp/beschreibbar ist. Ich habe auch ein Pre-Invokeund erstellt Post-Invoke apt hook, damit aptdas System automatisch für das Schreiben erneut bereitgestellt werden kann, wenn Pakete installiert oder aktualisiert werden, und es erneut bereitgestellt werden kann, read-onlywenn es fertig ist:

DPkg::Pre-Invoke  {"mount -o remount,rw / ;};
DPkg::Post-Invoke {"mount -o remount    / ;};

Dieses ganze Setup funktioniert mit einer Ausnahme gut. Manchmal müssen während des Installations- / Aktualisierungsprozesses einige Dienste neu gestartet oder neue Dateien während des kurzen Fensters geöffnet werden, wenn my /bereitgestellt read-writewird. Diese Dateien werden mit writeBerechtigungen geöffnet . Nach Abschluss der Installation / Aktualisierung gibt mein Post-InvokeHook einen Fehler zurück, da er nicht erneut bereitgestellt /werden kann read-only.

Gibt es eine Möglichkeit, dieses Problem zu lösen? Das ist sehr ärgerlich, weil ich in dieser Situation normalerweise den Server neu starten muss, was unpraktisch ist.

BEARBEITEN

Unten finden Sie ein Protokoll meines letzten Paket-Upgrades, das zu dem beschriebenen Fehler geführt hat:

root@alpha# apt-get upgrade 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be upgraded:
  base-files curl libc-bin libc6 libcurl3 libcurl3-gnutls libmysqlclient18 libssl1.0.0 locales multiarch-support mysql-client mysql-client-5.5 mysql-common
  nscd openssl tzdata wget whois
18 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
Need to get 18.7 MB of archives.
After this operation, 264 kB of additional disk space will be used.
Do you want to continue [Y/n]? 
Fetched 18.7 MB in 0s (33.2 MB/s) 
Preconfiguring packages ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace base-files 7.1wheezy3 (using .../base-files_7.1wheezy4_amd64.deb) ...
Unpacking replacement base-files ...
Processing triggers for man-db ...
Processing triggers for install-info ...
Setting up base-files (7.1wheezy4) ...
Installing new version of config file /etc/debian_version ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace libc-bin 2.13-38 (using .../libc-bin_2.13-38+deb7u1_amd64.deb) ...
Unpacking replacement libc-bin ...
Processing triggers for man-db ...
Setting up libc-bin (2.13-38+deb7u1) ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace libc6:amd64 2.13-38 (using .../libc6_2.13-38+deb7u1_amd64.deb) ...
Unpacking replacement libc6:amd64 ...
Setting up libc6:amd64 (2.13-38+deb7u1) ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace libssl1.0.0:amd64 1.0.1e-2+deb7u1 (using .../libssl1.0.0_1.0.1e-2+deb7u4_amd64.deb) ...
Unpacking replacement libssl1.0.0:amd64 ...
Preparing to replace curl 7.26.0-1+wheezy7 (using .../curl_7.26.0-1+wheezy8_amd64.deb) ...
Unpacking replacement curl ...
Preparing to replace libcurl3:amd64 7.26.0-1+wheezy7 (using .../libcurl3_7.26.0-1+wheezy8_amd64.deb) ...
Unpacking replacement libcurl3:amd64 ...
Preparing to replace libcurl3-gnutls:amd64 7.26.0-1+wheezy7 (using .../libcurl3-gnutls_7.26.0-1+wheezy8_amd64.deb) ...
Unpacking replacement libcurl3-gnutls:amd64 ...
Preparing to replace mysql-common 5.5.33+dfsg-0+wheezy1 (using .../mysql-common_5.5.35+dfsg-0+wheezy1_all.deb) ...
Unpacking replacement mysql-common ...
Preparing to replace libmysqlclient18:amd64 5.5.33+dfsg-0+wheezy1 (using .../libmysqlclient18_5.5.35+dfsg-0+wheezy1_amd64.deb) ...
Unpacking replacement libmysqlclient18:amd64 ...
Preparing to replace multiarch-support 2.13-38 (using .../multiarch-support_2.13-38+deb7u1_amd64.deb) ...
Unpacking replacement multiarch-support ...
Processing triggers for man-db ...
Setting up multiarch-support (2.13-38+deb7u1) ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace tzdata 2013h-0wheezy1 (using .../tzdata_2013i-0wheezy1_all.deb) ...
Unpacking replacement tzdata ...
Setting up tzdata (2013i-0wheezy1) ...

Current default time zone: 'Europe/London'
Local time is now:      Sat Feb 15 11:35:41 CET 2014.
Universal Time is now:  Sat Feb 15 11:35:41 UTC 2014.
Run 'dpkg-reconfigure tzdata' if you wish to change it.

(Reading database ... 20511 files and directories currently installed.)
Preparing to replace wget 1.13.4-3 (using .../wget_1.13.4-3+deb7u1_amd64.deb) ...
Unpacking replacement wget ...
Preparing to replace locales 2.13-38 (using .../locales_2.13-38+deb7u1_all.deb) ...
Unpacking replacement locales ...
Preparing to replace whois 5.0.23 (using .../whois_5.1.1~deb7u1_amd64.deb) ...
Unpacking replacement whois ...
Preparing to replace mysql-client 5.5.33+dfsg-0+wheezy1 (using .../mysql-client_5.5.35+dfsg-0+wheezy1_all.deb) ...
Unpacking replacement mysql-client ...
Preparing to replace mysql-client-5.5 5.5.33+dfsg-0+wheezy1 (using .../mysql-client-5.5_5.5.35+dfsg-0+wheezy1_amd64.deb) ...
Unpacking replacement mysql-client-5.5 ...
Preparing to replace nscd 2.13-38 (using .../nscd_2.13-38+deb7u1_amd64.deb) ...
[ ok ] Stopping Name Service Cache Daemon: nscd.
Unpacking replacement nscd ...
Preparing to replace openssl 1.0.1e-2+deb7u1 (using .../openssl_1.0.1e-2+deb7u4_amd64.deb) ...
Unpacking replacement openssl ...
Processing triggers for install-info ...
Processing triggers for man-db ...
Setting up libssl1.0.0:amd64 (1.0.1e-2+deb7u4) ...
Setting up libcurl3:amd64 (7.26.0-1+wheezy8) ...
Setting up curl (7.26.0-1+wheezy8) ...
Setting up libcurl3-gnutls:amd64 (7.26.0-1+wheezy8) ...
Setting up mysql-common (5.5.35+dfsg-0+wheezy1) ...
Setting up libmysqlclient18:amd64 (5.5.35+dfsg-0+wheezy1) ...
Setting up wget (1.13.4-3+deb7u1) ...
Setting up locales (2.13-38+deb7u1) ...
Generating locales (this might take a while)...
  en_DK.UTF-8... done
  en_US.UTF-8... done
Generation complete.
Setting up whois (5.1.1~deb7u1) ...
Setting up mysql-client-5.5 (5.5.35+dfsg-0+wheezy1) ...
Setting up mysql-client (5.5.35+dfsg-0+wheezy1) ...
Setting up nscd (2.13-38+deb7u1) ...
[ ok ] Starting Name Service Cache Daemon: nscd.
Setting up openssl (1.0.1e-2+deb7u4) ...
mount: / is busy

Die letzte Zeile ( mount: / is busy) ist der Fehler, den apt beim erneuten Mounten /zurückgegeben hat read-only.

AKTUALISIEREN:

Der von vorgeschlagene Befehl Graemezeigt keine Dateien an:

# lsof / | awk 'NR==1 || $4~/[0-9][uw]/'
COMMAND     PID       USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME

Suchen Sie nach einer Möglichkeit, um zu verhindern, dass die Dateien geöffnet read-writewerden oder der Server neu gestartet werden muss ro, während Sie erneut bereitstellen können , oder um die blockierenden Pakete zu finden und zu ändern? Oder wäre entweder als Lösung akzeptabel?
Anthon

Im Idealfall möchte ich verhindern, dass die Dateien überhaupt geöffnet werden rw. Aber jede Lösung, mit der ich roohne Neustart erneut einsteigen kann, ist auch gut.
Martin Vegter

Stoppen Sie die beleidigenden Dienste, montieren Sie sie erneut und starten Sie sie erneut?
Frostschutz

@martin hast du schon einen überblick über die beleidigenden dienste? Ich mag das von Ihnen vorgestellte Setup und werde es in einer VM versuchen, aber es wäre schön zu wissen, dass Sie auf Ihrem System keine nicht standardmäßigen Einstellungen ausführen, die meine Experimente nur teilweise relevant machen würden.
Anthon

@Anthon Ich weiß nicht, welche die beleidigenden Dienste sind. Aber siehe meine EDIT oben zur Verdeutlichung. Mein Server ist auch eine VM. Es handelt sich um eine minimale Installation, bei der nur wenige Dienste ausgeführt werden.
Martin Vegter

Antworten:


2

Ich vermute, dass es sich nicht nur um Dienste handelt, sondern auch um die Tatsache, dass andere Dateisysteme wie / home und / var im Root-Dateisystem eingebunden sind. Abgesehen davon ist die beste Lösung, die ich ausgraben konnte, hier beschrieben:

https://sites.google.com/site/linuxpendrive/rorootfs

Suchen Sie nach dem Abschnitt Wie installiere / deinstalliere ich Pakete auf einem schreibgeschützten Dateisystem? Kurz gesagt, müssen Sie das Zieldateisystem erneut bereitstellen und dann in den neuen Mount chrooten, bevor Sie den Paketmanager verwenden.

Der in einer der anderen Antworten skizzierte Vorschlag geht davon aus, was passiert, wenn das Root-Dateisystem für Paketaktualisierungen erneut bereitgestellt wird. Daher funktioniert diese Lösung möglicherweise nicht mit Debian, wenn Debian ein anderes Verhalten aufweist als angenommen. Aber hey, es ist einen Versuch wert, denke ich ...


1

Um einer endgültigen Antwort auf diese Frage näher zu kommen, müssen wir sehen, welche Dateien den mount: / is busyFehler verursachen. Sie könnten dies tun mit:

lsof / | awk 'NR==1 || $4~/[0-9][uw]/'

Siehe meine Antwort auf die andere Frage des OP - lsof: show files open as read-write - für die Vorbehalte dazu. Es kann sein, dass Sie dies in ein separates Skript und das Skript in den passenden Hook einfügen müssen, um etwas zu sehen.

Mein Verdacht ist, dass Dateien unter /etcgeöffnet bleiben, sobald die Dienste gestartet werden. Einige Programme / Daemons aktualisieren ihre Konfiguration dynamisch. NetworkManagerund cupsdsind zwei Beispiele. Aktualisierungen, bei cupsdenen cupsdnach neuen Druckern gesucht wird (im Gegensatz zu einem dpkgKonfigurationsskript), können Ihr Problem verursachen. Ich empfehle , dass Sie setzen /etcauf ein beschreibbares Dateisystem, auch wenn es nicht die Ursache des Problems ist.

Eine andere Möglichkeit besteht darin, dass der Dateisystempuffer gerade auf die Festplatte geleert wird, wenn Sie versuchen, die erneute Bereitstellung durchzuführen. Ich bin nicht sicher, wofür das Verhalten mounthier ist, ob es blockiert werden soll, bis die E / A abgeschlossen ist, oder ob es fehlschlägt und die Festplatte als ausgelastet meldet. Der erste scheint wahrscheinlicher, aber ich sehe keine syncAufrufe in der Ausgabe von strace(obwohl möglicherweise der mountSystemaufruf dies tut). Auf syncjeden Fall kann es funktionieren, vor dem Remount ein a durchzuführen, wenn lsofoben nichts angezeigt wird , z.

DPkg::Post-Invoke { "sync; mount -o remount /"; };

das ist merkwürdig. Ihr lsofBefehl listet keine Dateien auf
Martin Vegter

1
Interessant ist auch, dass speicherabgebildete Dateien beim Schreiben kopiert werden können. Ich weiß nicht, wie sich dies auf die Montage auswirkt, und ich bin mir nicht sicher lsofund zeige dies sogar. Hast du versucht lsofmit deinem Haken zu laufen ? Wie wäre es mit dem syncZeug?
Graeme
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.