nie można ponownie zamontować systemu plików z powrotem do tylko do odczytu po aktualizacji pakietu

10

W moim systemie Debian mam /na osobnej partycji i zamontowany read-only. Tylko /home/, /var/i /tmp/są zapisu. Stworzyłem również Pre-Invokea Post-Invoke apt hook, dzięki czemu aptmożna automatycznie ponownie zainstalować system do zapisu, gdy pakiety są instalowane lub uaktualniane, a read-onlypo zakończeniu:

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

Cała konfiguracja działa dobrze z jednym wyjątkiem. Czasami podczas procesu instalacji / aktualizacji niektóre usługi muszą zostać zrestartowane lub nowe pliki otwarte w krótkim oknie po /zamontowaniu mojego read-write, pliki te są otwierane z writeuprawnieniami. Po zakończeniu instalacji / aktualizacji jest kompletny, mój Post-Invokebłąd powraca hak, ponieważ nie można ponownie zamontować /z powrotem read-only.

Czy jest jakiś sposób na rozwiązanie tego problemu? Jest to bardzo denerwujące, ponieważ w tej sytuacji zwykle muszę ponownie uruchomić serwer, co jest niepraktyczne.

EDYTOWAĆ

Poniżej znajduje się dziennik mojej ostatniej aktualizacji pakietu, który spowodował opisany błąd:

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

Ostatnia linia ( mount: / is busy) to błąd zwrócony przez apt podczas próby ponownego podłączenia /do read-only.

AKTUALIZACJA:

polecenie sugerowane przez Graemenie wyświetla żadnych plików:

# lsof / | awk 'NR==1 || $4~/[0-9][uw]/'
COMMAND     PID       USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
Martin Vegter
źródło
Szukasz sposobu, aby zapobiec otwieraniu plików, ponownemu read-writeuruchomieniu serwera podczas ponownej instalacji rolub znalezieniu i zmianie pakietów blokujących? A może byłby do przyjęcia jako rozwiązanie?
Anthon
Idealnie, chciałbym rwprzede wszystkim zapobiec otwieraniu plików . Ale każde rozwiązanie, które umożliwi mi roponowne podłączenie bez restartu, jest również dobre.
Martin Vegter
Zatrzymać obrażające usługi, ponownie zamontować, uruchomić je ponownie?
frostschutz
@martin Czy masz już przegląd usług naruszających prawo? Podoba mi się konfiguracja, którą przedstawiłeś i spróbuję tego na maszynie wirtualnej, ale miło byłoby wiedzieć, że nie uruchamiasz w systemie czegoś innego niż domyślny, co sprawiłoby, że moje eksperymenty były tylko częściowo odpowiednie.
Anthon
@Anthon Nie wiem, które usługi są naruszające prawo. Ale zobacz mój EDIT powyżej, aby uzyskać wyjaśnienie. Mój serwer jest również maszyną wirtualną. Jest to minimalna instalacja z kilkoma uruchomionymi usługami.
Martin Vegter

Odpowiedzi:

2

Domyślam się, że to nie tylko usługi, to fakt, że masz inne systemy plików, takie jak / home i / var, zamontowane w głównym systemie plików. Poza tym, najlepsze rozwiązanie, jakie mogłem wykopać, zostało przedstawione tutaj:

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

Poszukaj sekcji zatytułowanej Jak instalować / odinstalowywać pakiety w systemie plików tylko do odczytu? Krótko mówiąc, polega to na ponownym zamontowaniu docelowego systemu plików, a następnie ponownym uruchomieniu chroot w nowym mount, przed użyciem menedżera pakietów.

Sugestia przedstawiona w jednej z pozostałych odpowiedzi zakłada, co się stanie, gdy główny system plików zostanie ponownie zamontowany rw w celu aktualizacji pakietów, więc to rozwiązanie może w rzeczywistości nie działać w Debianie, jeśli Debian zachowuje się inaczej niż zakładano. Ale hej, warto spróbować, myślę ...

Rouben Tchakhmakhtchian
źródło
1

Aby zbliżyć się do ostatecznej odpowiedzi na to pytanie, musimy sprawdzić, które pliki powodują mount: / is busybłąd. Możesz to zrobić za pomocą:

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

Zobacz moją odpowiedź na inne pytanie PO - lsof: pokaż pliki otwarte jako do odczytu i zapisu - z zastrzeżeniami do tego. Być może trzeba to umieścić w osobnym skrypcie i umieścić skrypt w apt hook, aby coś zobaczyć.

Podejrzewam, że pliki poniżej /etcpozostają otwarte po uruchomieniu usług. Niektóre programy / demony aktualizują konfigurację dynamicznie. NetworkManageri cupsdsą dwoma przykładami. cupsPrzyczyną problemu mogą być aktualizacje, które powodują cupsdskanowanie nowych drukarek (w przeciwieństwie do dpkgskryptu konfiguracyjnego). Zalecam /etczainstalowanie systemu plików z możliwością zapisu, nawet jeśli nie jest on źródłem problemu.

Inną możliwością jest to, że bufor systemu plików wciąż jest opróżniany na dysk podczas próby ponownego zamontowania. Nie jestem pewien, do czego mountsłuży zachowanie , czy ma to być blokowanie do czasu ukończenia IO, czy też awaria i zgłoszenie dysku jako zajętego. Pierwszy wydaje się bardziej prawdopodobny, ale nie widzę żadnych syncwywołań na wyjściu strace(chociaż możliwe, że mountwywołuje to wywołanie systemowe). W każdym razie może być syncwskazane wykonanie remontu, jeśli lsofpowyższe nie pokazuje niczego, np .:

DPkg::Post-Invoke { "sync; mount -o remount /"; };
Graeme
źródło
to jest dziwne. Twoje lsofpolecenie nie wyświetla żadnych plików
Martin Vegter
1
Interesujące jest to, że pliki mapowane w pamięci mogą być kopiowane podczas zapisu. Nie wiem, jak to wpływa na montaż, a poza tym nie jestem tego pewien, lsofa nawet tego nie pokazuję. Czy próbowałeś biegać lsofz hakiem? Co powiesz na syncrzeczy?
Graeme