Impossible de remonter / revenir en lecture seule après la mise à niveau du package

13

J'utilise Debian Stretch. Ma partition racine est montée read-only. Ce n'est que lorsque j'installe ou mets à niveau des packages, est /remonté vers read-write(en utilisant apt hook), puis remonté vers ro.

Parfois, après la mise à niveau du package, je ne parviens pas à remonter /en lecture seule:

mount -o remount,ro /
mount: / is busy

Sur les anciennes versions de Debian (Wheezy), je pouvais lister les fichiers ouverts qui ont été dissociés avec lsof:

 lsof +L1

ou, plus précisément, les fichiers qui empêchent /d'être remontés sur ro:

{ lsof +L1 ; lsof|sed -n '/SYSV/d; /DEL|(path /p;' ; } | grep -Ev '/(dev|home|tmp|var)'

Cependant, sur Debian Stretch, lsof +L1ne répertorie aucun fichier.

Je ne vois pas de changement à +|-Len man lsofce qui expliquerait pourquoi il a cessé de fonctionner.

Pourquoi lsof + L1 ne répertorie plus les fichiers ouverts qui ont été dissociés?

Comment puis-je répertorier les fichiers qui empêchent / d'être remontés en lecture seule?

MISE À JOUR

Je me suis arrêté tous les processus qui peuvent être arrêtés, et seulement initet gettytoujours en cours d' exécution, mais je ne peux toujours pas remonter /à ro.

Martin Vegter
la source
Les fichiers ouverts non liés ne sont pas le seul obstacle. Recherchez wou udans la FDcolonne de la lsofsortie, ou Fdans la sortie de fuser -vm /, par exemple. Je ne peux cependant pas vous donner une liste exhaustive. Vous pouvez également installer le package needrestart .
Ferenc Wágner
question stupide mais exécutez-vous lsof en tant que root?
Kiwy
1
Kiwy - oui, j'exécute lsof en tant que root.
Martin Vegter
1
ne fuser -m / dit pas ce qui utilise root?
Rui F Ribeiro
1
@Marcus Linsner - Je n'utilise pas systemd. J'utilise init.
Martin Vegter

Réponses:

2

Comment puis-je répertorier les fichiers qui empêchent / d'être remontés en lecture seule?

A) fuserse trouve dans l' psmiscemballage; c'est un cas d'utilisation où je trouve fuserbrille et est plus utile que lsof.

# fuser -v -m / 2>&1 | grep '[Ff]r.e'

Cela montrera tous les processus qui ont des fichiers ouverts sur / pour la lecture (f) et l'écriture (F). Les fichiers qui empêcheraient / d'être remontés en lecture seule sont ceux qui sont ouverts pour l'écriture (F).

Tuez les processus qui sont un exécutable en cours d'exécution avec les fichiers du répertoire racine ouverts pour l'écriture .

# for fupid in $(fuser -v -m / 2>&1 | grep Fr.e | awk '{print $2}'); do kill $fupid; done

C'est au-dessus des systemdcommentaires avec une mise en garde. Si systemdc'est initalors fuserle verra et il y a d'autres considérations. En systemdcours d'exécution, il peut (re) démarrer des processus derrière votre dos, même s'ils viennent d'être identifiés et tués avec fuser. systemdest beaucoup plus avancé que le traditionnel sysvinit.

B) La MISE À JOUR dans la description indique que le système a seulement ... initet gettyfonctionne toujours ...

Je vois le commentaire qui dit que le système n'utilise pas systemd, il utilise init. Sur l'étirement, systemd c'est init . Le commentaire n'a pas dit explicitement sysvinit, donc je suppose que le système en question utilise peut-être l'étirement par défaut systemdpour init. Ou que d'autres personnes qui tombent sur ce post, qui utilisent des étirements systemd, trouvent cette partie utile.

Selon le wiki Debian ,

Le processus d'initialisation du système est géré par le démon init. Dans Squeeze et les versions antérieures, ce démon est fourni par le package sysvinit et aucune alternative n'est prise en charge. Dans Wheezy , le démon init par défaut est toujourssysvinit , mais un "aperçu technologique" de systemd est disponible. Dans jessie et extensible , le système d'initialisation par défaut estsystemd , mais à commutation sysvinit est supporté.

Depuis jessie, seul systemd est entièrement supporté; sysvinit est principalement pris en charge, mais les paquets Debian ne sont pas requis pour fournir des scripts de démarrage sysvinit. runit est également packagé, mais n'a pas reçu le même niveau de test et de support que les autres, et n'est actuellement pas pris en charge comme PID 1.

Avec l' systemdexécution, il y a quelques étapes supplémentaires qui doivent être prises pour libérer / afin qu'il puisse être remonté sans problème.

Il contient probablement system.slicedes fichiers ouverts pour systemd-journald.serviceou systemd-udevd.service(qui ont tous deux des dépendances de socket). Ou, s'il NetworkManagerest en cours d'exécution, il peut réapparaître, dhclientce qui écrit les baux dans / var / ... (& / var / n'est pas toujours son propre appareil), etc. fuserpourrait trouver & you kill dhclientmais le NetworkManagerredémarrer immédiatement.

La morale est que beaucoup de choses sont automatisées qui pourraient «vouloir» / (et encore plus avec systemd).

Pour être sûr, si c'est faisable, l' systemdéquivalent du niveau d'exécution 1 correspond à rescue.target(et runlevel1.targetest un lien symbolique vers rescue.target).

1) Commencez par isoler le système rescue.target

# systemctl isolate rescue.target

Il devrait vous inviter à saisir le mot de passe root; suivez les instructions à l'écran.

2) À la coque de sauvetage, découvrez ce que veut /.

# systemctl show -p Wants /

En règle générale, c'est system.slice; arrêter tout ce qui veut /. par exemple

# systemctl stop system.slice

3) À ce stade, le remontage ne doit pas signaler mount: / is busyet mount -o remount,ro / doit fonctionner. Sinon, vérifiez à nouveau avec fuser.

4) FWIW; J'ai également vu des moments où umountéchoue quand / si un autre périphérique est monté sur un sous-répertoire d'un autre montage, c'est-à-dire des montages imbriqués. Par exemple, umount /échouerait si / var / ou / boot / se trouve sur un autre périphérique (et monté). Bien que mount -o remount,ro /devrait toujours fonctionner dans ce cas.

lsblk peut être utile pour visualiser les montages imbriqués.

Pourquoi lsof + L1 ne répertorie plus les fichiers ouverts qui ont été dissociés?

Parce qu'ils ne sont pas disponibles (sockets ou la plupart des FIFO et des tuyaux), ce ne sont plus des fichiers ouverts (le processus parent a fermé le descripteur de fichier), ou ils ont (toujours) un nombre de liens supérieur à 1.

man lsof (8) détails ...

+ | -L [l]

Cette option active ('+') ou désactive ('-') la liste des nombres de liens de fichiers, où ils sont disponibles - par exemple, ils ne sont pas disponibles pour les sockets, ou la plupart des FIFO et des tuyaux.

Lorsque + L est spécifié sans numéro suivant, tous les décomptes de liens sont répertoriés. Lorsque -L est spécifié (par défaut), aucun nombre de liens ne sera répertorié.

Lorsque + L est suivi d'un nombre, seuls les fichiers dont le nombre de liens est inférieur à ce nombre seront répertoriés . (Aucun numéro ne peut suivre -L.) Une spécification du formulaire '' + L1 '' sélectionnera les fichiers ouverts qui ont été dissociés. Une spécification du formulaire +aL1 <file_system>sélectionnera les fichiers ouverts non liés sur le système de fichiers spécifié.

Joseph Tingiris
la source
0

Avez-vous /procmonté?

Étant apparemment quelqu'un qui prend soin d'avoir /monté la plupart du temps en lecture seule, je peux imaginer que vous pourriez également choisir de ne pas monter procfs. Mais procfs est nécessaire pour lsoftrouver les fichiers ouverts.

Les fichiers ouverts par les processus sont exposés par le noyau via des liens symboliques dans procfs. Les répertoires /proc/<pid>/fdcontiennent un lien symbolique pour chaque fichier maintenu ouvert. Le nom des liens symboliques sont les numéros des descripteurs de fichiers et le chemin référencé par le lien symbolique est le chemin du fichier.

Les liens symboliques pendants restent dans /procles fichiers ouverts déjà supprimés. Et le chemin référencé du fichier est renommé pour se terminer par "(supprimé)".

Ce lsof +L1qui ne diffère essentiellement pas d'un simple doublure comme:

stat -c%N /proc/[0-9]*/fd/* | grep deleted

Ainsi, vous pouvez utiliser un one-liner similaire pour répertorier tous les fichiers ouverts qui peuvent empêcher le remontage du système de fichiers racine (à condition que cela fonctionne /proc).

Cependant, si vous l'avez fait / avez /procmonté, les seules autres causes auxquelles je peux penser sont les bogues ... Quoi qu'il en soit, pour info, sur mon système Debian Stretch actuel. lsof +L1fonctionne comme prévu.

bash# lsb_release -d
Description:    Debian GNU/Linux 9.5 (stretch)

bash# uname -a
Linux bwp-249-8 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u4 (2018-08-21) x86_64 GNU/Linux

bash# lsof -v
lsof version information:
    revision: 4.89
    [...]
Hkoof
la source
oui, je l'ai /procmonté. Je ne suis pas votre raisonnement pourquoi je ne pourrais pas. Quoi qu'il en soit, stat -c%N /proc/[0-9]*/fd/* | grep deletedne me montre rien.
Martin Vegter
0

Je n'ai pu reproduire ce problème qu'une seule fois et l'ai résolu en utilisant simplement mountl' option -n .

Citant l' homme monter :

-n, --no-mtab
      Mount without writing in /etc/mtab.  This is necessary for example when /etc is on a read-only filesystem.

Le mountprogramme lui-même ouvrant le (s) fichier (s) pour l' écriture dans le système de fichiers racine sonnait comme une explication plausible pour moi. Plus précisément , mountécrit /etc/mtabaprès tout , et /etcfait souvent partie du système de fichiers racine. Cependant je n'ai pas pu le reproduire sur la même machine après l'avoir fait une fois ...

Cela pourrait-il résoudre votre problème?

Hkoof
la source
non, l'utilisation -navec le support ne fait aucune différence.
Martin Vegter
0

Sans visibilité sur votre système, il est très difficile de vous dire exactement quel est le problème. Les commentaires et les réponses précédentes sont de bons débuts.

Cela dit, je reviendrais tout au long du wiki Debian qui décrit les prérequis pour le montage / lecture seule.

Le lien vers la documentation est ici: https://wiki.debian.org/ReadonlyRoot

Le grand je vais vous guider ici:

1 - il y a des emplacements spécifiques sous / qui doivent être lus en écriture. Sur la base de la documentation, cela ressemble à ceci:

racine ro debian

vos périphériques de bloc seront probablement différents, en fonction de la configuration de votre pile de stockage (partitions, lvm sans partition, etc.) mais l'idée principale est que vous avez besoin de ces 4 points de montage pour avoir leur système de fichiers monté suivant pour avoir l'option de montage RW.

2 - il existe un certain nombre de fichiers spéciaux dans / etc dont vous avez besoin pour créer un lien symbolique ou implémenter une autre modification (spécifiquement détaillée dans l'article lié). Celles-ci peuvent s'appliquer ou non en fonction des applications exécutées par votre serveur Linux. certains fichiers peuvent même ne pas exister sur votre machine, mais j'ai tout inclus dans les documents. Gardez à l'esprit, je recommande fortement d'apporter ces modifications MÊME SI vous avez tué le pid du processus. Voici les chemins directement depuis le wiki Debian:

  • adjtime
  • init.d / alsa-utils
  • / etc / courier / shared / index
  • tous les fichiers d'état cups, classes.conf, cupsd.conf, printers.conf subscriptions.conf
  • /etc/lvm/lvm.conf
  • mtab (auquel il semble que vous ayez essayé de répondre en donnant à mount l'indicateur -n)
  • network / run (utilisé par ifup et ifdown, in squeeze. peut ne pas s'appliquer à stretch, ymmv)
  • nologin
  • resolv.conf
  • les fichiers passwd et shadow
  • samba / dhcp.conf
  • sucer
  • udev

Une fois que vous avez vérifié tout ce qui précède et confirmé qu'ils sont conformes aux spécifications du wiki, la prochaine chose à vérifier est /etc/apt/apt.conf

DPkg {
// Auto re-mounting of a readonly /
Pre-Invoke { "mount -o remount,rw /"; };
Post-Invoke { "test ${NO_APT_REMOUNT:-no} = yes || mount -o remount,ro / || true"; };
}; 

en fonction de votre erreur, la dernière chose que vous pouvez vérifier sur la base de la documentation vient de ce qui suit:

"Après une mise à niveau des packages, vous pourriez être confronté au problème que le montage refuse de remonter le système de fichiers en vous disant" / est occupé ". Cela est dû aux fichiers supprimés, ils sont toujours utilisés par un processus. Pour savoir quels processus utilisent des fichiers supprimés, utilisez l'outil checkrestart (1) du package debian-goodies ou utilisez la commande suivante. Il s'agit souvent de démons utilisant des bibliothèques mises à niveau. Vous devez les redémarrer pour que les fichiers soient libérés. "

commande fournie dans le doc .:

{lsof +L1; lsof|sed -n '/SYSV/d; /DEL\|(path /p;'} |grep -Ev '/(dev|home|tmp|var)'

Sans connaître la configuration exacte de votre système de fichiers, le partitionnement et la configuration du périphérique de stockage, il est difficile de vous donner beaucoup d'autres choses à suivre. Je commencerais par revenir en arrière et revérifier vos prérequis dans la documentation (et décrits ci-dessus).

le devant du bus
la source