impossibile rimontare il filesystem in sola lettura dopo l'aggiornamento del pacchetto


10

Sul mio sistema Debian, ho il mio /su partizione separata e montato read-only. Solo /home/, /var/e /tmp/sono scrivibili. Ho anche creato un Pre-Invokee Post-Invoke apt hook, in modo che aptpossa rimontare automaticamente il sistema per la scrittura, quando i pacchetti vengono installati o aggiornati e rimontarlo al read-onlytermine:

DPkg::Pre-Invoke  {"mount -o remount,rw / ;};
DPkg::Post-Invoke {"mount -o remount    / ;};

L'intera configurazione funziona bene con un'eccezione. A volte durante il processo di installazione / aggiornamento è necessario riavviare alcuni servizi o aprire nuovi file durante la breve finestra quando /viene montato my read-write, questi file vengono aperti con writeautorizzazioni. Al termine dell'installazione / aggiornamento, il mio Post-Invokehook restituisce un errore perché non può essere /ripristinato su read-only.

C'è un modo per risolvere questo problema? Questo è molto fastidioso, perché in questa situazione di solito devo riavviare il server, il che non è pratico.

MODIFICARE

Di seguito è riportato un registro del mio ultimo aggiornamento del pacchetto, che ha provocato l'errore descritto:

root@alpha# apt-get upgrade 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be upgraded:
  base-files curl libc-bin libc6 libcurl3 libcurl3-gnutls libmysqlclient18 libssl1.0.0 locales multiarch-support mysql-client mysql-client-5.5 mysql-common
  nscd openssl tzdata wget whois
18 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
Need to get 18.7 MB of archives.
After this operation, 264 kB of additional disk space will be used.
Do you want to continue [Y/n]? 
Fetched 18.7 MB in 0s (33.2 MB/s) 
Preconfiguring packages ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace base-files 7.1wheezy3 (using .../base-files_7.1wheezy4_amd64.deb) ...
Unpacking replacement base-files ...
Processing triggers for man-db ...
Processing triggers for install-info ...
Setting up base-files (7.1wheezy4) ...
Installing new version of config file /etc/debian_version ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace libc-bin 2.13-38 (using .../libc-bin_2.13-38+deb7u1_amd64.deb) ...
Unpacking replacement libc-bin ...
Processing triggers for man-db ...
Setting up libc-bin (2.13-38+deb7u1) ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace libc6:amd64 2.13-38 (using .../libc6_2.13-38+deb7u1_amd64.deb) ...
Unpacking replacement libc6:amd64 ...
Setting up libc6:amd64 (2.13-38+deb7u1) ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace libssl1.0.0:amd64 1.0.1e-2+deb7u1 (using .../libssl1.0.0_1.0.1e-2+deb7u4_amd64.deb) ...
Unpacking replacement libssl1.0.0:amd64 ...
Preparing to replace curl 7.26.0-1+wheezy7 (using .../curl_7.26.0-1+wheezy8_amd64.deb) ...
Unpacking replacement curl ...
Preparing to replace libcurl3:amd64 7.26.0-1+wheezy7 (using .../libcurl3_7.26.0-1+wheezy8_amd64.deb) ...
Unpacking replacement libcurl3:amd64 ...
Preparing to replace libcurl3-gnutls:amd64 7.26.0-1+wheezy7 (using .../libcurl3-gnutls_7.26.0-1+wheezy8_amd64.deb) ...
Unpacking replacement libcurl3-gnutls:amd64 ...
Preparing to replace mysql-common 5.5.33+dfsg-0+wheezy1 (using .../mysql-common_5.5.35+dfsg-0+wheezy1_all.deb) ...
Unpacking replacement mysql-common ...
Preparing to replace libmysqlclient18:amd64 5.5.33+dfsg-0+wheezy1 (using .../libmysqlclient18_5.5.35+dfsg-0+wheezy1_amd64.deb) ...
Unpacking replacement libmysqlclient18:amd64 ...
Preparing to replace multiarch-support 2.13-38 (using .../multiarch-support_2.13-38+deb7u1_amd64.deb) ...
Unpacking replacement multiarch-support ...
Processing triggers for man-db ...
Setting up multiarch-support (2.13-38+deb7u1) ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace tzdata 2013h-0wheezy1 (using .../tzdata_2013i-0wheezy1_all.deb) ...
Unpacking replacement tzdata ...
Setting up tzdata (2013i-0wheezy1) ...

Current default time zone: 'Europe/London'
Local time is now:      Sat Feb 15 11:35:41 CET 2014.
Universal Time is now:  Sat Feb 15 11:35:41 UTC 2014.
Run 'dpkg-reconfigure tzdata' if you wish to change it.

(Reading database ... 20511 files and directories currently installed.)
Preparing to replace wget 1.13.4-3 (using .../wget_1.13.4-3+deb7u1_amd64.deb) ...
Unpacking replacement wget ...
Preparing to replace locales 2.13-38 (using .../locales_2.13-38+deb7u1_all.deb) ...
Unpacking replacement locales ...
Preparing to replace whois 5.0.23 (using .../whois_5.1.1~deb7u1_amd64.deb) ...
Unpacking replacement whois ...
Preparing to replace mysql-client 5.5.33+dfsg-0+wheezy1 (using .../mysql-client_5.5.35+dfsg-0+wheezy1_all.deb) ...
Unpacking replacement mysql-client ...
Preparing to replace mysql-client-5.5 5.5.33+dfsg-0+wheezy1 (using .../mysql-client-5.5_5.5.35+dfsg-0+wheezy1_amd64.deb) ...
Unpacking replacement mysql-client-5.5 ...
Preparing to replace nscd 2.13-38 (using .../nscd_2.13-38+deb7u1_amd64.deb) ...
[ ok ] Stopping Name Service Cache Daemon: nscd.
Unpacking replacement nscd ...
Preparing to replace openssl 1.0.1e-2+deb7u1 (using .../openssl_1.0.1e-2+deb7u4_amd64.deb) ...
Unpacking replacement openssl ...
Processing triggers for install-info ...
Processing triggers for man-db ...
Setting up libssl1.0.0:amd64 (1.0.1e-2+deb7u4) ...
Setting up libcurl3:amd64 (7.26.0-1+wheezy8) ...
Setting up curl (7.26.0-1+wheezy8) ...
Setting up libcurl3-gnutls:amd64 (7.26.0-1+wheezy8) ...
Setting up mysql-common (5.5.35+dfsg-0+wheezy1) ...
Setting up libmysqlclient18:amd64 (5.5.35+dfsg-0+wheezy1) ...
Setting up wget (1.13.4-3+deb7u1) ...
Setting up locales (2.13-38+deb7u1) ...
Generating locales (this might take a while)...
  en_DK.UTF-8... done
  en_US.UTF-8... done
Generation complete.
Setting up whois (5.1.1~deb7u1) ...
Setting up mysql-client-5.5 (5.5.35+dfsg-0+wheezy1) ...
Setting up mysql-client (5.5.35+dfsg-0+wheezy1) ...
Setting up nscd (2.13-38+deb7u1) ...
[ ok ] Starting Name Service Cache Daemon: nscd.
Setting up openssl (1.0.1e-2+deb7u4) ...
mount: / is busy

L'ultima riga ( mount: / is busy) è l'errore restituito da apt, quando si cerca di rimontare /di nuovo a read-only.

AGGIORNARE:

il comando suggerito da Graemenon mostra alcun file:

# lsof / | awk 'NR==1 || $4~/[0-9][uw]/'
COMMAND     PID       USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME

Stai cercando un modo per impedire l'apertura dei file read-writeo il riavvio del server mentre riesci a rimontare ro, o trovare e modificare i pacchetti di blocco? O sarebbe accettabile come soluzione?
Anthon,

Idealmente, vorrei impedire che i file vengano aperti rwin primo luogo. Ma anche qualsiasi soluzione che mi consentirà di rimontarlo rosenza un riavvio è buona.
Martin Vegter,

Interrompere i servizi offensivi, rimontare, riavviarli?
frostschutz,

@martin Hai già una panoramica dei servizi offensivi? Mi piace l'installazione che hai presentato e lo proverò in una macchina virtuale, ma sarebbe bello sapere che non stai eseguendo qualcosa di non predefinito sul tuo sistema che renderebbe i miei esperimenti solo parzialmente rilevanti.
Anthon,

@Anthon Non so quali siano i servizi offensivi. Ma vedi il mio EDIT sopra per chiarimenti. Anche il mio server è una macchina virtuale. È un'installazione minima con solo pochi servizi in esecuzione.
Martin Vegter,

Risposte:


2

La mia ipotesi è che non si tratti solo di servizi, è il fatto che hai altri filesystem, come / home e / var, montati all'interno del filesystem di root. A parte questo, la migliore soluzione che ho potuto scavare è delineata qui:

https://sites.google.com/site/linuxpendrive/rorootfs

Cerca la sezione intitolata Come installo / disinstallo i pacchetti su un file system di sola lettura? In poche parole, comporta la reinstallazione del filesystem di destinazione e quindi il chrooting nel nuovo mount, prima di utilizzare il gestore pacchetti.

Il suggerimento, delineato in una delle altre risposte, fa ipotesi su cosa succede quando il filesystem di root viene rimontato rw per gli aggiornamenti dei pacchetti, quindi questa soluzione potrebbe non funzionare su Debian, se Debian mostra un comportamento diverso da quello che si presume. Ma hey, vale la pena provare, penso ...


1

Per avvicinarci a una risposta definitiva, dobbiamo vedere quali file causano l' mount: / is busyerrore. Puoi farlo con:

lsof / | awk 'NR==1 || $4~/[0-9][uw]/'

Vedi la mia risposta all'altra domanda del PO - lsof: mostra i file aperti come lettura-scrittura - per le avvertenze a questo. Potrebbe essere necessario inserire questo in uno script separato e metterlo nello hook apt per vedere qualcosa.

Il mio sospetto è che i file sotto /etcrimangano aperti una volta avviati i servizi. Alcuni programmi / demoni aggiornano la loro configurazione in modo dinamico. NetworkManagere cupsdsono due esempi. Gli aggiornamenti alla cupscausa cupsddella ricerca di nuove stampanti (al contrario di uno dpkgscript di configurazione) potrebbero essere la causa del problema. Ti consiglio di mettere /etcsu un file system scrivibile, anche se non è la fonte del tuo problema.

Un'altra possibilità è che il buffer del filesystem sia ancora in fase di scaricamento su disco quando si tenta di eseguire il rimontaggio. Non sono sicuro di quale sia il comportamento mountqui, se si tratta di bloccare fino a quando IO non è completo o di fallire e segnalare il disco come occupato. Il primo sembra più probabile, ma non vedo syncchiamate nell'output di strace(anche se probabilmente la mountchiamata di sistema lo fa). In ogni caso, potrebbe essere utile eseguire una syncprima del rimontaggio se quanto lsofsopra non mostra nulla, ad esempio:

DPkg::Post-Invoke { "sync; mount -o remount /"; };

Questo è strano. Il tuo lsofcomando non elenca alcun file
Martin Vegter,

1
Interessante, un'altra cosa è che i file mappati in memoria possono essere copy-on-write. Non so come questo influisca sul montaggio, inoltre non ne sono sicuro lsofe non lo dimostrerò nemmeno. Hai provato a correre lsofcon il tuo gancio? E le synccose?
Graeme,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.