パッケージのアップグレード後にファイルシステムを読み取り専用に再マウントできません


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

このセットアップ全体は、1つの例外を除いて適切に機能します。場合によっては、インストール/アップグレードプロセス中に、一部のサービスを再起動する必要があります。または、私の/マウント時の短いウィンドウで新しいファイルを開く必要があり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、再起動せずにに再マウントできるようにする解決策も良いです。
Martin Vegter、2014

問題のサービスを停止し、再マウントして、再度開始しますか?
frostschutz 14

@martin問題のあるサービスの概要をすでに知っていますか?私はあなたが提示した設定が好きで、VMでそれを試しますが、私の実験を部分的にしか関連させないような、システムでデフォルト以外の何かを実行していないことを知っているといいでしょう。
Anthon 2014

@Anthon問題のあるサービスがどれかわかりません。ただし、説明については、上記の編集を参照してください。私のサーバーはVMでもあります。これは最小限のインストールであり、実行中のサービスはほとんどありません。
Martin Vegter 14

回答:


2

私の推測では、これは単なるサービスではなく、/ homeや/ varなどの他のファイルシステムがルートファイルシステム内にマウントされているという事実です。それはさておき、私が掘り下げることができる最良の解決策はここに概説されています:

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

読み取り専用ファイルシステムでパッケージをインストール/アンインストールする方法」というセクションを探してください簡単に言うと、パッケージマネージャーを使用する前に、ターゲットファイルシステムを再マウントしてから、新しいマウントにchrootする必要があります。

他の回答のいずれかで概説されている提案は、ルートファイルシステムがパッケージの更新のためにrwを再マウントしたときに何が起こるかを想定しているため、Debianが想定とは異なる動作を示す場合、このソリューションは実際にはDebianで機能しない可能性があります。しかし、ちょっと、それは一撃の価値があると思います...


1

この決定的な答えに近づくためには、mount: / is busyエラーの原因となっているファイルを確認する必要があります。あなたはこれを行うことができます:

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

これに関する警告については、OPの他の質問-lsof:読み取り/書き込みとして開いているファイルを表示 -への私の回答を参照してください。何かを見るために、これを別のスクリプトに入れ、スクリプトをaptフックに入れる必要があるかもしれません。

/etcサービスが開始された後、ファイルが開いたままになっているのではないかと疑っています。一部のプログラム/デーモンは、構成を動的に更新します。NetworkManagercupsd2つの例です。(構成スクリプトではなく)新しいプリンターをスキャンcupsする原因となる更新が問題の原因である可能性があります。問題の原因ではない場合でも、書き込み可能なファイルシステムを使用することをお勧めします。cupsddpkg/etc

別の可能性としては、再マウントを実行しようとしたときに、ファイルシステムバッファがまだディスクにフラッシュされている最中です。mountIOが完了するまでブロックするのか、失敗してディスクがビジーであると報告するのか、ここでの動作はわかりません。最初の方が可能性が高いようですがsync、出力には呼び出しが表示されませんstrace(おそらくmountシステムコールがこれを実行します)。とにかく、上記のように何も表示されないsync場合、再マウントの前にaを実行するとうまくいく場合がありlsofます。例:

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

これは奇妙です。あなたのlsofコマンドは、任意のファイルを一覧表示しません
マーティンVegter

1
興味深いのは、メモリマップファイルがコピーオンライトになる可能性があることです。これがマウントにどのように影響するのかはわかりませんlsof。さらに、これもわかりません。lsofフックで走ってみましたか?どの程度syncのもの?
Graeme 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.