после обновления пакета невозможно перемонтировать файловую систему обратно в режим только для чтения

10

В моей системе Debian мой компьютер находится /на отдельном разделе и смонтирован read-only. Только /home/, /var/и /tmp/могут быть перезаписаны. Я также создал Pre-Invokeи Post-Invoke apt hook, чтобы aptможно было автоматически перемонтировать систему для записи, когда пакеты установлены или обновлены, и перемонтировать ее обратно, read-onlyкогда закончите:

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

Вся эта установка хорошо работает с одним исключением. Иногда во время процесса установки / обновления необходимо перезапустить некоторые службы или открыть новые файлы во время короткого окна, когда /смонтировано my read-write, эти файлы открываются с writeразрешениями. После завершения установки / обновления моя Post-Invokeловушка возвращает ошибку, поскольку она не может перемонтировать /обратно read-only.

Есть ли способ решить эту проблему? Это очень раздражает, потому что в этой ситуации мне обычно приходится перезагружать сервер, что нецелесообразно.

РЕДАКТИРОВАТЬ

Ниже приведен журнал моего последнего обновления пакета, в результате которого произошла описанная ошибка:

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

Последняя строка ( mount: / is busy) - это ошибка, возвращаемая apt при попытке перемонтировать /обратно в read-only.

ОБНОВИТЬ:

предложенная команда Graemeне показывает никаких файлов:

# lsof / | awk 'NR==1 || $4~/[0-9][uw]/'
COMMAND     PID       USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
Мартин Вегтер
источник
Вы ищете способ предотвратить открытие файлов read-writeили перезагрузку сервера при возможности перемонтирования roили поиска и изменения блокирующих пакетов? Или было бы приемлемо в качестве решения?
Anthon
В идеале я хотел бы предотвратить открытие файлов rwв первую очередь. Но любое решение, которое позволит мне перемонтировать roбез перезагрузки, тоже хорошо.
Мартин Вегтер
Остановить сервисы-нарушители, перемонтировать, запустить их снова?
frostschutz
@martin у вас уже есть обзор сервисов-нарушителей? Мне нравится настройка, которую вы представили, и я попробую ее на ВМ, но было бы неплохо знать, что вы не используете в своей системе что-то нестандартное, что сделало бы мои эксперименты только частично актуальными.
Антон
@ Антон, я не знаю, какие услуги нарушают. Но смотрите мой РЕДАКТИРОВАТЬ выше для уточнения. Мой сервер также является виртуальной машиной. Это минимальная установка с несколькими запущенными сервисами.
Мартин Вегтер

Ответы:

2

Я предполагаю, что это не просто сервисы, это тот факт, что у вас есть другие файловые системы, такие как / home и / var, смонтированные внутри корневой файловой системы. Кроме того, лучшее решение, которое я мог найти, изложено здесь:

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

Найдите раздел « Как установить / удалить пакеты в файловой системе только для чтения»? В двух словах, это включает в себя перемонтирование целевой файловой системы и последующую привязку к новому монтированию перед использованием менеджера пакетов.

Предложение, изложенное в одном из других ответов, делает предположения относительно того, что происходит, когда корневая файловая система перемонтируется rw для обновлений пакетов, поэтому это решение может фактически не работать в Debian, если Debian демонстрирует поведение, отличное от того, которое предполагается. Но, эй, стоит попробовать, я думаю ...

Рубен Чахмахтчян
источник
1

Чтобы приблизиться к окончательному ответу на этот вопрос, нам нужно увидеть, какие файлы вызывают mount: / is busyошибку. Вы можете сделать это с:

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

Посмотрите мой ответ на другой вопрос OP - lsof: показать файлы, открытые как чтение-запись - для уточнения этого. Может случиться так, что вам нужно поместить это в отдельный скрипт и поместить скрипт в хук apt, чтобы что-то увидеть.

Я подозреваю, что файлы /etcостаются открытыми после запуска служб. Некоторые программы / демоны обновляют свою конфигурацию динамически. NetworkManagerи cupsdдва примера. Обновления, cupsкоторые вызывают cupsdсканирование на новые принтеры (в отличие от dpkgсценария конфигурации), вполне могут быть причиной вашей проблемы. Я рекомендую вам установить /etcзаписываемую файловую систему, даже если она не является источником вашей проблемы.

Другая возможность состоит в том, что буфер файловой системы все еще находится в процессе сброса на диск, когда вы пытаетесь выполнить перемонтирование. Я не уверен, что поведение mountздесь, будь то блокировка до завершения ввода-вывода или сбой и сообщить диск как занятый. Первый кажется более вероятным, но я не вижу syncвызовов на выходе strace(хотя, возможно, mountсистемный вызов делает это). В любом случае, может потребоваться сделать syncперед перемонтированием, если lsofвышеприведенное ничего не показывает, например:

DPkg::Post-Invoke { "sync; mount -o remount /"; };
Graeme
источник
это странно. Ваша lsofкоманда не
выводит
1
Интересно, что еще одна вещь состоит в том, что отображенные в память файлы могут быть скопированы при записи. Я не знаю, как это влияет на монтаж, плюс я не уверен lsofи даже покажу это. Вы пробовали бегать lsofс крючком? Как насчет syncвещей?
Грэм