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


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    / ;};

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

Чи є якийсь спосіб вирішити цю проблему? Це дуже дратує, тому що в цій ситуації мені зазвичай потрібно перезапустити сервер, що недоцільно.

EDIT

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

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або пошуку та зміни пакетів, що блокують? Або було б прийнятним як рішення?
Антон

В ідеалі я хотів би запобігти відкриттю файлів rw. Але будь-яке рішення, яке дозволить мені перерахувати roбез перезавантаження, також добре.
Мартін Вегтер

Припинити послуги, що порушують правопорушення, перерахуйте, запустити їх заново?
frostschutz

@martin Ви вже маєте огляд послуг, які порушують правопорушення? Мені подобається налаштування, яке ви представили, і спробую це в VM, але було б добре знати, що у вашій системі не працює щось не за замовчуванням, що зробить мої експерименти лише частково актуальними.
Антон

@Anthon Я не знаю, які саме послуги порушують. Але дивіться мою редакцію вище для уточнення. Мій сервер також VM. Це мінімальна установка, на якій працює лише кілька служб.
Мартін Вегтер

Відповіді:


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]/'

Дивіться мою відповідь на інше питання ОП - lsof: показуйте файли, відкриті як читання-запис - для застережень до цього. Можливо, вам потрібно покласти це в окремий сценарій, а сценарій поставити в підхожий гачок, щоб щось побачити.

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

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

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

це дивно. У вашій lsofкоманді не
вказано

1
Цікаво, що інша річ полягає в тому, що файли, відображені на пам'ять, можна копіювати. Я не знаю, як це впливає на монтаж, плюс я не впевнений lsofі навіть це показую. Ви спробували бігти lsofгачком? Як щодо syncречі?
Graeme
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.