impossible de remonter le système de fichiers en lecture seule après la mise à niveau du package

10

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-Invokeet Post-Invoke apt hook, afin de aptpouvoir remonter automatiquement le système pour l'écriture, lorsque les packages sont installés ou mis à niveau, et le remonter à la read-onlyfin:

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 writeautorisations. Une fois l'installation / mise à niveau terminée, mon Post-Invokecrochet 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 Graemen'affiche aucun fichier:

# lsof / | awk 'NR==1 || $4~/[0-9][uw]/'
COMMAND     PID       USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
Martin Vegter
la source
Cherchez-vous un moyen d'empêcher l'ouverture des fichiers read-write, ou d'avoir à redémarrer le serveur tout en étant en mesure de remonter ro, ou de trouver et de modifier les packages de blocage? Ou serait-ce acceptable comme solution?
Anthon
Idéalement, je voudrais tout d'abord empêcher l'ouverture des fichiers rw. Mais toute solution qui me permettra de remonter rosans redémarrage est également bonne.
Martin Vegter
Arrêter les services incriminés, remonter, les redémarrer?
frostschutz
@martin avez-vous déjà un aperçu des services incriminés? J'aime la configuration que vous avez présentée et j'essaierai cela dans une machine virtuelle, mais ce serait bien de savoir que vous n'exécutez pas quelque chose de non par défaut sur votre système qui rendrait mes expériences seulement partiellement pertinentes.
Anthon
@Anthon Je ne sais pas quels sont les services incriminés. Mais voir mon EDIT ci-dessus pour des éclaircissements. Mon serveur est également une machine virtuelle. Il s'agit d'une installation minimale avec seulement quelques services en cours d'exécution.
Martin Vegter

Réponses:

2

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 ...

Rouben Tchakhmakhtchian
la source
1

Pour se rapprocher d'une réponse définitive à cela, nous devons voir quels fichiers sont à l'origine de l' mount: / is busyerreur. Vous pouvez le faire avec:

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

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 /etcrestent ouverts une fois les services démarrés. Certains programmes / démons mettent à jour leur configuration de manière dynamique. NetworkManageret cupsdsont deux exemples. Les mises à jour cupsqui provoquent la cupsdrecherche de nouvelles imprimantes (par opposition à un dpkgscript de configuration) peuvent bien être à l'origine de votre problème. Je vous recommande de mettre /etcsur 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 mountici, 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 aucun syncappel dans la sortie de strace(bien que peut-être l' mountappel système le fasse). Quoi qu'il en soit, cela peut fonctionner pour faire un syncavant le remontage si ce qui lsofprécède ne montre rien, par exemple:

DPkg::Post-Invoke { "sync; mount -o remount /"; };
Graeme
la source
cela est étrange. Votre lsofcommande ne répertorie aucun fichier
Martin Vegter
1
Intéressant, une autre chose est que les fichiers mappés en mémoire peuvent être copiés sur écriture. Je ne sais pas comment cela affecte le montage, plus je ne suis pas sûr lsofet même le montre. Avez-vous essayé de courir lsofavec votre crochet? Et les synctrucs?
Graeme