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 +L1
ne répertorie aucun fichier.
Je ne vois pas de changement à +|-L
en man lsof
ce 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 init
et getty
toujours en cours d' exécution, mais je ne peux toujours pas remonter /
à ro
.
w
ouu
dans laFD
colonne de lalsof
sortie, ouF
dans la sortie defuser -vm /
, par exemple. Je ne peux cependant pas vous donner une liste exhaustive. Vous pouvez également installer le package needrestart .root
?fuser -m /
dit pas ce qui utilise root?Réponses:
Comment puis-je répertorier les fichiers qui empêchent / d'être remontés en lecture seule?
A)
fuser
se trouve dans l'psmisc
emballage; c'est un cas d'utilisation où je trouvefuser
brille et est plus utile quelsof
.# 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
systemd
commentaires avec une mise en garde. Sisystemd
c'estinit
alorsfuser
le verra et il y a d'autres considérations. Ensystemd
cours 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 avecfuser
.systemd
est beaucoup plus avancé que le traditionnelsysvinit
.B) La MISE À JOUR dans la description indique que le système a seulement ...
init
etgetty
fonctionne toujours ...Je vois le commentaire qui dit que le système n'utilise pas
systemd
, il utiliseinit
. Sur l'étirement,systemd
c'estinit
. Le commentaire n'a pas dit explicitementsysvinit
, donc je suppose que le système en question utilise peut-être l'étirement par défautsystemd
pourinit
. Ou que d'autres personnes qui tombent sur ce post, qui utilisent des étirementssystemd
, trouvent cette partie utile.Selon le wiki Debian ,
Avec l'
systemd
exé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.slice
des fichiers ouverts poursystemd-journald.service
ousystemd-udevd.service
(qui ont tous deux des dépendances de socket). Ou, s'ilNetworkManager
est en cours d'exécution, il peut réapparaître,dhclient
ce qui écrit les baux dans / var / ... (& / var / n'est pas toujours son propre appareil), etc.fuser
pourrait trouver & you killdhclient
mais leNetworkManager
redé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
(etrunlevel1.target
est un lien symbolique versrescue.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 busy
etmount -o remount,ro /
doit fonctionner. Sinon, vérifiez à nouveau avecfuser
.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 quemount -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 ...
la source
Avez-vous
/proc
monté?É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 pourlsof
trouver 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>/fd
contiennent 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
/proc
les fichiers ouverts déjà supprimés. Et le chemin référencé du fichier est renommé pour se terminer par "(supprimé)".Ce
lsof +L1
qui ne diffère essentiellement pas d'un simple doublure comme: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
/proc
monté, 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 +L1
fonctionne comme prévu.la source
/proc
monté. Je ne suis pas votre raisonnement pourquoi je ne pourrais pas. Quoi qu'il en soit,stat -c%N /proc/[0-9]*/fd/* | grep deleted
ne me montre rien.Je n'ai pu reproduire ce problème qu'une seule fois et l'ai résolu en utilisant simplement
mount
l' option -n .Citant l' homme monter :
Le
mount
programme 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/mtab
après tout , et/etc
fait 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?
la source
-n
avec le support ne fait aucune différence.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:
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:
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
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 .:
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).
la source