Come posso elencare quei file che impediscono / di essere rimontati in sola lettura?
A) fuser
si trova nel psmisc
pacchetto; questo è un caso d'uso in cui trovo fuser
brillanti ed è più utile di lsof
.
# fuser -v -m / 2>&1 | grep '[Ff]r.e'
Ciò mostrerà tutti i processi che hanno file aperti su / per la lettura (f) e la scrittura (F). I file che impedirebbero / di essere rimontati in sola lettura sono quelli aperti per la scrittura (F).
Uccidete i processi che sono un essere corsa eseguibile con directory root file aperti per la scrittura ., Vale a dire
# for fupid in $(fuser -v -m / 2>&1 | grep Fr.e | awk '{print $2}'); do kill $fupid; done
Questo è sopra i systemd
commenti con un avvertimento. Se systemd
è init
allora fuser
lo vedrà e ci sono altre considerazioni. Con la systemd
corsa, può (ri) avviare i processi alle tue spalle, anche se sono stati appena identificati e uccisi fuser
. systemd
è molto più avanzato rispetto al tradizionale sysvinit
.
B) L' aggiornamento nella descrizione indica che il sistema ha solo ... init
e getty
ancora in esecuzione ...
Vedo il commento che dice che il sistema non sta usando systemd
, sta usando init
. Sul tratto, systemd
è init
. Il commento non ha detto esplicitamente sysvinit
, quindi presumo che il sistema in questione stia utilizzando il tratto predefinito systemd
per init
. O che le altre persone che inciampano in questo post, che usano stretch systemd
, trovino utile questa parte.
Secondo il Debian Wiki ,
Il processo di inizializzazione del sistema è gestito dal demone init. In squeeze e nelle versioni precedenti, quel demone è fornito dal pacchetto sysvinit e non sono supportate alternative. In wheezy , il demone init predefinito è ancorasysvinit
, ma è disponibile una "anteprima tecnologica" di systemd. In jessie e stretch , il sistema init predefinito èsystemd
, ma il passaggio a sysvinit è supportato.
Da jessie, solo systemd è completamente supportato; sysvinit è principalmente supportato, ma i pacchetti Debian non sono richiesti per fornire script di avvio sysvinit. runit è anche impacchettato, ma non ha ricevuto lo stesso livello di test e supporto degli altri e non è attualmente supportato come PID 1.
Con l' systemd
esecuzione, ci sono alcuni passaggi aggiuntivi che dovrebbero essere presi per liberare / in modo che possa essere rimontato senza problemi.
È probabile system.slice
che contenga file aperti per systemd-journald.service
o systemd-udevd.service
(entrambi i quali hanno dipendenze socket). Oppure, se NetworkManager
è in esecuzione, può rigenerarsi dhclient
che scrive i contratti di locazione in / var / ... (& / var / non è sempre il suo dispositivo), ecc. fuser
Potrebbe trovare e uccidere, dhclient
ma lo NetworkManager
riavvia subito.
La morale è che molte cose sono automatizzate che potrebbero "volere" / (e ancora di più con systemd
).
A dire il vero, se è fattibile, l' systemd
equivalente del livello di corsa 1 è abbinato a rescue.target
(ed runlevel1.target
è un collegamento simbolico a rescue.target
).
1) Inizia isolando il sistema a rescue.target
# systemctl isolate rescue.target
Dovrebbe essere richiesto di inserire la password di root; seguire le istruzioni sullo schermo.
2) Alla shell di salvataggio, scopri cosa vuole /.
# systemctl show -p Wants /
In genere lo è system.slice
; fermare tutto ciò che vuole /. per esempio
# systemctl stop system.slice
3) A questo punto, il rimontaggio non dovrebbe riportare mount: / is busy
e mount -o remount,ro /
dovrebbe funzionare. In caso contrario, controllare di nuovo con fuser
.
4) FWIW; Ho anche visto momenti in cui umount
fallisce quando / se un altro dispositivo è montato su una sottodirectory di un altro mount, ovvero montaggi nidificati. Ad esempio, umount /
fallirebbe se / var / o / boot / si trova su un altro dispositivo (e montato). Anche se mount -o remount,ro /
dovrebbe funzionare ancora in questo caso.
lsblk
può essere utile per visualizzare montaggi nidificati.
Perché lsof + L1 non elenca più i file aperti che sono stati scollegati?
Poiché non sono disponibili (socket o la maggior parte dei FIFO e pipe), non sono più file aperti (il processo principale ha chiuso il descrittore di file) o hanno (ancora) un conteggio dei collegamenti maggiore di 1.
man lsof (8) dettagli ...
+ | -L [l]
Questa opzione abilita ('+') o disabilita ('-') l'elenco dei conteggi dei collegamenti ai file, dove sono disponibili - ad esempio, non sono disponibili per socket o la maggior parte dei FIFO e pipe.
Quando viene specificato + L senza un numero seguente, verranno elencati tutti i conteggi dei collegamenti. Quando viene specificato -L (impostazione predefinita), non verranno elencati i conteggi dei collegamenti.
Quando + L è seguito da un numero, verranno elencati solo i file con un numero di collegamenti inferiore a quel numero . (Nessun numero può seguire -L.) Una specifica del modulo '' + L1 '' selezionerà i file aperti che sono stati scollegati. Una specifica del modulo +aL1 <file_system>
selezionerà i file aperti non collegati sul file system specificato.
w
ou
nellaFD
colonnalsof
dell'output o , ad esempio,F
nell'output difuser -vm /
. Non posso darti un elenco esaustivo, comunque. Potresti anche voler installare il pacchetto needrestart .