Sur mon système Debian, j'ai ma /
partition séparée et montée read-only
. Seulement /home/
, /var/
et /tmp/
sont inscriptibles. J'ai également créé un Pre-Invoke
et Post-Invoke
apt hook
, afin de apt
pouvoir remonter automatiquement le système pour l'écriture, lorsque les packages sont installés ou mis à niveau, et le remonter à la read-only
fin:
DPkg::Pre-Invoke {"mount -o remount,rw / ;};
DPkg::Post-Invoke {"mount -o remount / ;};
L'ensemble de cette configuration fonctionne bien, à une exception près. Parfois, pendant le processus d'installation / mise à niveau, certains services doivent être redémarrés ou de nouveaux fichiers ouverts pendant la courte fenêtre lorsque my /
est monté read-write
, ces fichiers sont ouverts avec des write
autorisations. Une fois l'installation / mise à niveau terminée, mon Post-Invoke
crochet renvoie une erreur car il ne peut pas être /
remonté read-only
.
Existe-t-il un moyen de résoudre ce problème? C'est très ennuyeux, car dans cette situation, je dois généralement redémarrer le serveur, ce qui n'est pas pratique.
ÉDITER
Vous trouverez ci-dessous un journal de ma dernière mise à niveau de package, qui a entraîné l'erreur décrite:
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
La dernière ligne ( mount: / is busy
) est l'erreur renvoyée par apt, en essayant de remonter /
revenir à read-only
.
METTRE À JOUR:
la commande suggérée par Graeme
n'affiche aucun fichier:
# lsof / | awk 'NR==1 || $4~/[0-9][uw]/'
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
read-write
, ou d'avoir à redémarrer le serveur tout en étant en mesure de remonterro
, ou de trouver et de modifier les packages de blocage? Ou serait-ce acceptable comme solution?rw
. Mais toute solution qui me permettra de remonterro
sans redémarrage est également bonne.Réponses:
Je suppose que ce n'est pas seulement des services, c'est le fait que vous avez d'autres systèmes de fichiers, comme / home et / var, montés à l'intérieur du système de fichiers racine. Cela mis à part, la meilleure solution que j'ai pu trouver est décrite ici:
https://sites.google.com/site/linuxpendrive/rorootfs
Recherchez la section intitulée Comment installer / désinstaller des packages sur un système de fichiers en lecture seule? En bref, cela implique de remonter le système de fichiers cible, puis de chrooter dans le nouveau montage, avant d'utiliser le gestionnaire de packages.
La suggestion, décrite dans l'une des autres réponses, fait des hypothèses sur ce qui se passe lorsque le système de fichiers racine est remonté rw pour les mises à jour de paquets, donc cette solution peut ne pas fonctionner réellement Debian, si Debian présente un comportement différent de celui supposé. Mais bon, ça vaut le coup, je pense ...
la source
Pour se rapprocher d'une réponse définitive à cela, nous devons voir quels fichiers sont à l'origine de l'
mount: / is busy
erreur. Vous pouvez le faire avec:Voir ma réponse à l'autre question du PO - lsof: afficher les fichiers ouverts en lecture-écriture - pour les mises en garde à ce sujet. Il se peut que vous deviez mettre cela dans un script séparé et mettre le script dans le crochet apt pour voir quelque chose.
Je soupçonne que les fichiers sous
/etc
restent ouverts une fois les services démarrés. Certains programmes / démons mettent à jour leur configuration de manière dynamique.NetworkManager
etcupsd
sont deux exemples. Les mises à jourcups
qui provoquent lacupsd
recherche de nouvelles imprimantes (par opposition à undpkg
script de configuration) peuvent bien être à l'origine de votre problème. Je vous recommande de mettre/etc
sur un système de fichiers accessible en écriture, même si ce n'est pas la source de votre problème.Une autre possibilité est que le tampon du système de fichiers soit toujours en cours de vidage sur le disque lorsque vous essayez de remonter. Je ne sais pas quel est le comportement
mount
ici, que ce soit pour bloquer jusqu'à ce que les E / S soient terminées ou pour échouer et signaler le disque comme occupé. Le premier semble plus probable, mais je ne vois aucunsync
appel dans la sortie destrace
(bien que peut-être l'mount
appel système le fasse). Quoi qu'il en soit, cela peut fonctionner pour faire unsync
avant le remontage si ce quilsof
précède ne montre rien, par exemple:la source
lsof
commande ne répertorie aucun fichierlsof
et même le montre. Avez-vous essayé de courirlsof
avec votre crochet? Et lessync
trucs?