アップグレード後にパッケージを再インストールしたり、読み取り専用に戻すことはできません。

アップグレード後にパッケージを再インストールしたり、読み取り専用に戻すことはできません。

私はDebianストレッチを使用しています。私のルートパーティションがマウントされましたread-only。パッケージをインストールまたはアップグレードするときにのみ(aptフックを使用して)再/インストールread-writeしてから再度ro

/パッケージをアップグレードした後、読み取り専用で再インストールできないことがあります。

mount -o remount,ro /
mount: / is busy

以前のバージョンのDebian(Wheezy)では、リンクされていない開いているファイルを一覧表示できますlsof

 lsof +L1

/または、より具体的には、ファイルがroに再マウントされないようにします。

{ lsof +L1 ; lsof|sed -n '/SYSV/d; /DEL|(path /p;' ; } | grep -Ev '/(dev|home|tmp|var)'

ただし、Debian Stretchではlsof +L1ファイルはリストされません。

+|-L動作が停止した理由を説明する変更は表示されませんman lsof

lsof +L1がリンクされなくなったオープンファイルをリストしないのはなぜですか?

ブロック/再マウントされたファイルを読み取り専用としてリストする方法は?

修正する

可能なすべてのプロセスを停止initし、まだ実行中ですが、gettyまだ。/ro

答え1

ブロック/再マウントされたファイルを読み取り専用としてリストする方法は?

A)パッケージにありfuserます。これが 。psmiscfuserlsof

# fuser -v -m / 2>&1 | grep '[Ff]r.e'

これにより、/で読み取り(f)および書き込み(F)用に開いているファイルを含むすべてのプロセスが表示されます。読み取り専用でブロック/再マウントされたファイルは、書き込み(F)用に開かれたファイルです。

次のプロセスを終了します。実行ファイルが実行中で、ルートファイルが書き込み用に開いています。。 、すなわち。

# for fupid in $(fuser -v -m / 2>&1 | grep Fr.e | awk '{print $2}'); do kill $fupid; done

これはsystemdコメントの上にありますが、警告があります。もしそうなら、それは見え、他の考慮事項があるでしょうsystemd。実行すると、プロセスが識別されたばかりで終了した場合でも、後からプロセスを(再)起動できます。伝統的なものよりはるかに進化しました。initfusersystemdfusersystemdsysvinit

B)修正する説明にはシステムのみ...initそしてgettyまだ走っています。...

systemdシステムが使用されていないというコメントが表示されますinit。ストレッチをしながら、systemd はい init。コメントには明示的に記載されていないため、sysvinit問題のシステムがデフォルトのsystemdStretchを使用している可能性があるとしますinit。あるいは、この記事を誤って発見した人はストレッチを使用しており、systemdこのセクションが役に立つと思います。

~によるとDebian Wiki

システム初期化プロセスは、initデーモンによって処理されます。 squeeze以前のバージョンでは、このデーモンはsysvinitパッケージによって提供され、代替はサポートされていません。存在するゆるい、デフォルトのinitデーモンはまだsysvinitしかし、systemdの「技術プレビュー」を使用することができます。存在する提示そして緊張、基本初期化システムは次のとおりです。systemdしかし、sysvinitへの切り替えをサポートしています。

jessie以降、systemdのみが完全にサポートされています。ほとんどの場合、sysvinitはサポートされていますが、Debianパッケージはsysvinit起動スクリプトを提供する必要はありません。 runitもパッケージとして提供されていますが、まだ他のプログラムと同じレベルのテストとサポートを受けておらず、現在PID 1をサポートしていません。

実行中にsystemd問題なく再インストールできるように、いくつかの追加手順を無料で実行する必要があります。

ファイルをsystem.slice保存または開くことができます(両方ともソケットの依存関係があります)。または、実行している場合は再作成してリースを作成できます。systemd-journald.servicesystemd-udevd.serviceNetworkManagerdhclient/var/...(&/var/常に自分のデバイスではない)などが fuserそれを見つけて終了することはできますが、dhclientすぐにNetworkManager起動します。

教訓は、多くのものが自動化されており、「欲しい」ことができるということです/(その場合はもっとそうですsystemd)。

systemd確実に機能する場合は、ランレベル1に対応する項目が一致し、シンボリックリンクになります。rescue.targetrunlevel1.targetrescue.target

1)まずシステムを取り外します。rescue.target

# systemctl isolate rescue.target

ルートパスワードの入力を求められたら、画面の指示に従います。

2) リカバリシェルで必要な/を探します。

# systemctl show -p Wants /

通常、必要なsystem.sliceすべてを停止します。例えば

# systemctl stop system.slice

3) この時点で再マウントする必要があります。いいえmount: / is busymount -o remount,ro / しなければならない働くそうでない場合は、もう一度確認してくださいfuser

umount4) FWIW;他のデバイスが別のインストールのサブディレクトリにインストールされている場合(たとえば、ネストされたインストール)でも、このエラーが発生することを確認しました。たとえばumount //var/または/スタート/別のデバイスにあります(すでにインストールされています)。この場合でもまだmount -o remount,ro /動作します。

lsblkネストされたインストールを視覚化するのに役立ちます。

lsof +L1がリンクされなくなったオープンファイルをリストしないのはなぜですか?

使用できないため(ソケットまたはほとんどのFIFOとパイプ)、ファイルが開かれていないか(親プロセスがファイル記述子を閉じる)、リンク数が1より大きい。

男性LSof(8)詳細...

+|-L[エル]

このオプションは、ファイルリンク数のリストを有効にする(「+」)または無効にする(「-」)。可能であれば使用できます。たとえば、ソケットやほとんどのFIFOやパイプでは機能しません。

次の番号なしで+ Lを指定すると、すべてのリンク数が一覧表示されます。 -L(デフォルト)を指定すると、リンク数はリストされません。

+Lの後に数字が来ると、リンク数がこの数より少ないファイルのみをリストします。。 (-Lの後に数字は続くことはできません。)「+ L1」形式の指定は、リンクされていない開いているファイルを選択します。フォームの仕様は、+aL1 <file_system>指定されたファイルシステムでリンクされていないオープンファイルを選択します。

答え2

あなたは/procふりをしていますか?

/明らかに、ほとんどの場合、読み取り専用マウントに注意を払う人としてprocfsをマウントしないことを選択することができると想像できます。ただし、lsof開いているファイルを見つけるにはprocfsが必要です。

プロセスによって開かれたファイルは、procfsのシンボリックリンクを介してカーネルによって公開されます。これらのディレクトリには、/proc/<pid>/fd開いている各ファイルへのシンボリックリンクが含まれています。シンボリックリンクの名前はファイル記述子番号で、シンボリックリンクが参照するパスはファイルパスです。

/proc削除された開いたファイルの場合は、吊り下げられたシンボリックリンクが残ります。ファイルの参照パス名が「(削除済み)」で終わるように変更されました.

lsof +L1本質的に、次のクイックシングルライナーと変わりません。

stat -c%N /proc/[0-9]*/fd/* | grep deleted

したがって、次の1行のコードを使用してリストを作成できます。みんなルートファイルシステムの再インストールを妨げる可能性があるファイルを開きます(正しく機能している場合/proc)。

しかし、インストールした場合、/proc私が考えることができる唯一の理由はエラーです...とにかく、参考までに現在Debian Stretchシステムにあります。lsof +L1期待どおりに動作します。

bash# lsb_release -d
Description:    Debian GNU/Linux 9.5 (stretch)

bash# uname -a
Linux bwp-249-8 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u4 (2018-08-21) x86_64 GNU/Linux

bash# lsof -v
lsof version information:
    revision: 4.89
    [...]

答え3

この問題は一度だけ再現でき、次のように解決mountしました。-Nオプション。

引用するマンシャン:

-n, --no-mtab
      Mount without writing in /etc/mtab.  This is necessary for example when /etc is on a read-only filesystem.

mountファイル自体が開きます。書くルートファイルシステムでは、私は合理的な説明のように聞こえます。結局のところ、特定のmount書き込みは/etc/mtab通常/etcルートファイルシステムの一部です。ところが一度やったら、同じマシンで再現ができなくなりました。

これはあなたの問題を解決しますか?

答え4

システムについて何も知らないと、問題が何であるかを正確に話すことは困難です。コメントと前回答が良いスタートです。

つまり、インストール/読み取り専用の前提条件を説明するDebian Wikiを確認します。

ドキュメントリンクは次のとおりです。https://wiki.debian.org/ReadonlyRoot

結論は次のとおりです。

1 - /の下には、読み書きする必要がある特定の場所があります。文書によると、

Debian ro ルート

ブロックデバイスは、ストレージスタックの構成(パーティション化、パーティション化されていないlvmなど)によって異なりますが、主なアイデアは、後続のマウントされたファイルシステムマウントオプションのRWを持つためにこれら4つのマウントポイントが必要であることです。

2 - / etcにはシンボリックリンクを作成するか、他の変更を実装する必要がある特別なファイルがたくさんあります(リンクされた記事で詳しく説明されています)。これは、Linuxサーバーが実行されているアプリケーションによっては適用されない場合があります。一部のファイルはお使いのコンピュータには存在しない可能性がありますが、すべてのコンテンツをドキュメントに含めました。プロセスのPIDを終了した場合でも、これらの変更を実行することをお勧めします。これはDebian Wikiから直接インポートされたパスです:

  • 時間を調整してください
  • init.d/alsa-utils
  • /etc/courier/shared/index
  • すべてのカップステータスファイル、classes.conf、cupd.conf、printers.conf、subscriptions.conf
  • /etc/lvm/lvm.conf
  • mtab(マウントに-nフラグを追加してこの問題を解決しようとしたようです)
  • ネットワーク/実行 (ifup および ifdown で使用、スクイズ中。
  • ログインできません
  • 構成ファイルの解析
  • パスワードとシャドウファイル
  • サンバ/dhcp.conf
  • 吸う
  • ウデブ

上記のすべてを確認し、Wikiの仕様に準拠していることを確認してから、次に確認するのは/etc/apt/apt.confです。

DPkg {
// Auto re-mounting of a readonly /
Pre-Invoke { "mount -o remount,rw /"; };
Post-Invoke { "test ${NO_APT_REMOUNT:-no} = yes || mount -o remount,ro / || true"; };
}; 

エラーによって文書に基づいて確認できる最後の内容は次のとおりです。

「パッケージのアップグレード後、マウントが読み取り専用モードでファイルシステムの再マウントを拒否し、「/が使用中です」というメッセージが表示される問題が発生する可能性があります。これは、プロセスが削除されたファイルを引き続き使用しているために発生しますどのプロセスが削除されたファイルを削除するには、debian-goodies パッケージの checkrestart(1) ツールを使用するか、次のコマンドを使用します。

ドキュメントに提供されているコマンド:

{lsof +L1; lsof|sed -n '/SYSV/d; /DEL\|(path /p;'} |grep -Ev '/(dev|home|tmp|var)'

正確なファイルシステム構成、パーティション、ストレージデバイス構成を知らないと、追加情報を提供することは困難です。まず、ドキュメントの前提条件(および上記の前提条件)をもう一度確認します。

関連情報