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 trouve fuser
brille 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 systemd
commentaires avec une mise en garde. Si systemd
c'est init
alors fuser
le verra et il y a d'autres considérations. En systemd
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 avec fuser
. systemd
est beaucoup plus avancé que le traditionnel sysvinit
.
B) La MISE À JOUR dans la description indique que le système a seulement ... init
et getty
fonctionne 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 systemd
pour 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' 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 pour systemd-journald.service
ou systemd-udevd.service
(qui ont tous deux des dépendances de socket). Ou, s'il NetworkManager
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 kill dhclient
mais le NetworkManager
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
(et runlevel1.target
est 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 busy
et 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é.
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 .