Come posso elencare quei file che impediscono / di essere rimontati in sola lettura?
A) fusersi trova nel psmiscpacchetto; questo è un caso d'uso in cui trovo fuserbrillanti 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 systemdcommenti con un avvertimento. Se systemdè initallora fuserlo vedrà e ci sono altre considerazioni. Con la systemdcorsa, 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 ... inite gettyancora 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 systemdper 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' systemdesecuzione, ci sono alcuni passaggi aggiuntivi che dovrebbero essere presi per liberare / in modo che possa essere rimontato senza problemi.
È probabile system.sliceche contenga file aperti per systemd-journald.serviceo systemd-udevd.service(entrambi i quali hanno dipendenze socket). Oppure, se NetworkManagerè in esecuzione, può rigenerarsi dhclientche scrive i contratti di locazione in / var / ... (& / var / non è sempre il suo dispositivo), ecc. fuserPotrebbe trovare e uccidere, dhclientma lo NetworkManagerriavvia subito.
La morale è che molte cose sono automatizzate che potrebbero "volere" / (e ancora di più con systemd).
A dire il vero, se è fattibile, l' systemdequivalente 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 busye mount -o remount,ro / dovrebbe funzionare. In caso contrario, controllare di nuovo con fuser.
4) FWIW; Ho anche visto momenti in cui umountfallisce 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.
wounellaFDcolonnalsofdell'output o , ad esempio,Fnell'output difuser -vm /. Non posso darti un elenco esaustivo, comunque. Potresti anche voler installare il pacchetto needrestart .