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é.
wouudans laFDcolonne de lalsofsortie, ouFdans la sortie defuser -vm /, par exemple. Je ne peux cependant pas vous donner une liste exhaustive. Vous pouvez également installer le package needrestart .