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-Invoke
und erstellt Post-Invoke
apt hook
, damit apt
das System automatisch für das Schreiben erneut bereitgestellt werden kann, wenn Pakete installiert oder aktualisiert werden, und es erneut bereitgestellt werden kann, read-only
wenn 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-write
wird. Diese Dateien werden mit write
Berechtigungen geöffnet . Nach Abschluss der Installation / Aktualisierung gibt mein Post-Invoke
Hook 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 Graeme
zeigt keine Dateien an:
# lsof / | awk 'NR==1 || $4~/[0-9][uw]/'
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
read-write
werden oder der Server neu gestartet werden mussro
, 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?rw
. Aber jede Lösung, mit der ichro
ohne Neustart erneut einsteigen kann, ist auch gut.Antworten:
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 ...
quelle
Um einer endgültigen Antwort auf diese Frage näher zu kommen, müssen wir sehen, welche Dateien den
mount: / is busy
Fehler verursachen. Sie könnten dies tun mit: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
/etc
geöffnet bleiben, sobald die Dienste gestartet werden. Einige Programme / Daemons aktualisieren ihre Konfiguration dynamisch.NetworkManager
undcupsd
sind zwei Beispiele. Aktualisierungen, beicups
denencupsd
nach neuen Druckern gesucht wird (im Gegensatz zu einemdpkg
Konfigurationsskript), können Ihr Problem verursachen. Ich empfehle , dass Sie setzen/etc
auf 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
mount
hier 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 keinesync
Aufrufe in der Ausgabe vonstrace
(obwohl möglicherweise dermount
Systemaufruf dies tut). Aufsync
jeden Fall kann es funktionieren, vor dem Remount ein a durchzuführen, wennlsof
oben nichts angezeigt wird , z.quelle
lsof
Befehl listet keine Dateien auflsof
und zeige dies sogar. Hast du versuchtlsof
mit deinem Haken zu laufen ? Wie wäre es mit demsync
Zeug?