パッケージをアップグレードした後、再マウント/読み取り専用に戻すことができません


13

Debian Stretchを使用しています。ルートパーティションがマウントされていread-onlyます。私はパッケージをインストールまたはアップグレードする場合にのみ、され/に再マウントread-write(aptのフックを使用することによって)、その後にバックを再マウント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ファイルはリストされません。

私はへの変更が表示されない+|-Lman lsof、それが働いて停止した理由を説明します。

lsof + L1がリンク解除された開いているファイルをリストしないのはなぜですか?

/が読み取り専用に再マウントされないようにするファイルをリストするにはどうすればよいですか?

更新

私は停止することができるすべてのプロセスを停止している、とだけ持っているinitgetty、まだ実行されているが、私はまだない再マウントすることができます/しますro


リンクされていない開いているファイルだけが障害ではありません。探しwuFDの列lsof出力、またはのためFの出力でfuser -vm /、例えば。ただし、完全なリストを提供することはできません。needrestartパッケージをインストールすることもできます。
フェレンクワグナー

愚かな質問ですが、lsof asを実行していrootますか?
キウィ

1
Kiwy-はい、lsofをルートとして実行しています。
マーティンVegter

1
fuser -m / ルートを使用しているものがわかりませんか?
ルイFリベイロ

1
@Marcus Linsner-systemdを使用していません。initを使用しています。
マーティンヴェグター

回答:


2

/が読み取り専用に再マウントされないようにするファイルをリストするにはどうすればよいですか?

A)パッケージにfuser含まれていpsmiscます。これは私がfuser輝いていると思うユースケースであり、より便利ですlsof

# 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コメント付きで注意が必要です。の場合systemdinitそれfuserが表示され、他の考慮事項があります。でsystemd実行している、それが(再)、彼らはただで識別されて殺されてきた場合でも、あなたの後ろのプロセスを開始することができますfusersystemdは従来のものよりずっと進んでいsysvinitます。

B)説明のUPDATEは、システムには...のみがinitあり、gettyまだ実行中であることを示しています...

システムが使用systemdしていない、使用しているというコメントが表示されinitます。ストレッチで、systemd です init。コメントは明示的に言っていませんでしたsysvinitので、私は問題のシステムがデフォルトストレッチsystemdを使用しているかもしれないと思っていますinit。または、この記事につまずく他の人々が、stretchを使用している場合systemd、この部分が便利だと思います。

Debian Wikiによれば、

システムの初期化プロセスは、initデーモンによって処理されます。squeeze以前のリリースでは、このデーモンはsysvinitパッケージによって提供されており、代替はサポートされていません。喘鳴、デフォルトのinitデーモンはまだですsysvinitが、systemdにの「技術プレビュー」はご利用いただけません。ジェシーストレッチ、デフォルトのinitシステムはあるsystemdが、はsysvinitへの切り替えはサポートされています。

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

systemd実行している、それは問題なく再マウントすることができるように/解放するために取るべきいくつかの追加のステップがあります。

または(両方ともソケットに依存している)のsystem.slice開いているファイルを保持している可能性があります。または、場合はそれが復活することができます実行されているにリースを書き込むの/ var / ...(&/ varが/など、常に独自のデバイスではありません) &あなたは殺すかもしれませんが、それはすぐに戻って起動します。 systemd-journald.servicesystemd-udevd.serviceNetworkManagerdhclientfuserdhclientNetworkManager

道徳は、「欲しい」/(そしてさらにそうすることができる)多くのものが自動化されていることですsystemd

確かに、実行可能な場合はsystemd、実行レベル1に相当するものが一致しますrescue.target(およびrunlevel1.targetへのシンボリックリンクですrescue.target)。

1)システムを分離することから始めます rescue.target

# systemctl isolate rescue.target

ルートパスワードの入力を求められます。画面の指示に従ってください。

2)レスキューシェルで、/が必要なものを見つけます。

# systemctl show -p Wants /

一般的に、それはですsystem.slice。欲しいものをすべて停止します。例えば

# systemctl stop system.slice

3)この時点で、再マウントは報告されmount: / is busy、機能するmount -o remount,ro / はずです。そうでない場合は、でもう一度確認してくださいfuser

4)FWIW; またumount、別のデバイスがネストされたマウントなどの別のマウントのサブディレクトリにマウントされている場合、または失敗した場合も失敗することがあります。たとえば、/ var /または/ boot /が別のデバイスにある(およびマウントされている)umount /場合は失敗します。しかしは、まだこのケースで動作するはずです。mount -o remount,ro /

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

lsof + L1がリンク解除された開いているファイルをリストしないのはなぜですか?

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

man lsof(8)の詳細...

+ | -L [l]

このオプションは、ファイルリンクカウントのリストを有効( '+')または無効( '-')にします。たとえば、ソケットやほとんどのFIFOおよびパイプでは使用できません。

次の番号なしで+ Lを指定すると、すべてのリンクカウントがリストされます。-Lが指定されている場合(デフォルト)、リンクカウントはリストされません。

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


0

あなたが持っている/procマウント?

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

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

/proc既に削除されている開いているファイルについては、ダングリングシンボリックリンクが残っています。また、ファイルの参照パスの名前が「(deleted)」で終わるように変更されます。

どのようなlsof +L1行いは、のような迅速なワンライナーとは本質的に違いはありません。

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

そのため、同様のワンライナーを使用して、ルートファイルシステムの再マウントを妨げる可能性のある開いているすべてのファイルを一覧表示できます(機能している場合/proc)。

しかし、/procマウントした/した場合、私が考えることができる唯一の他の原因はバグです...とにかく、私の現在のDebian Stretchシステム上のFYI。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
    [...]

はい、/procマウントしました。私が持っていないかもしれない理由を私はあなたの推論に従っていません。とにかく、stat -c%N /proc/[0-9]*/fd/* | grep deleted何も表示されません。
マーティンヴェグター

0

この問題は1回しか再現できず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多くの場合、ルートファイルシステムの一部です。しかし、一度やった後、同じマシンで再び再現することはできませんでした...

これで問題を解決できますか?


いいえ、-nmount で使用しても違いはありません。
マーティンヴェグター

0

システムの可視性がなければ、問題が何であるかを正確に伝えることは非常に困難です。コメントと以前の回答は良い出発点です。

とはいえ、マウント/読み取り専用のprereqについて説明しているdebian wikiを最後まで行きます。

ドキュメントへのリンクはこちら:https : //wiki.debian.org/ReadonlyRoot

ここで大きなものを紹介します:

1-/の下に読み取り/書き込みが必要な特定の場所があります。ドキュメントに基づいて、次のようになります。

debian ro root

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

2-/ etcには、シンボリックリンクを作成するか、その他の変更を実装する必要がある特別なファイルが多数あります(リンクされた記事で詳しく説明されています)。これらは、Linuxサーバーが実行しているアプリケーションに基づいて適用される場合と適用されない場合があります。一部のファイルはマシン上にも存在しない場合がありますが、すべてをドキュメントに含めました。プロセスのPIDを強制終了した場合でも、これらの変更を行うことを強くお勧めします。以下はdebian wikiから直接のパスです:

  • 調整する
  • init.d / alsa-utils
  • / etc / courier / shared / index
  • cups状態ファイル、classes.conf、cupsd.conf、printers.conf subscriptions.conf
  • /etc/lvm/lvm.conf
  • mtab(mountに-nフラグを指定して対処しようとしたように見えます)
  • network / run(squeezeのifupおよびifdownで使用されます。stretchには適用されない場合があります、ymmv)
  • nologin
  • resolv.conf
  • passwdファイルとshadowファイルの両方
  • samba / dhcp.conf
  • 吸う
  • udev

上記をすべて確認し、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"; };
}; 

エラーに基づいて、ドキュメントに基づいて最後に確認できるのは以下のものです。

「パッケージのアップグレード後、mountがファイルシステムの読み取り専用のマウントを拒否し、「/はビジーです」と表示される問題に直面する可能性があります。これは、ファイルがプロセスによってまだ使用されている削除されたファイルが原因です。ファイルはパッケージdebian-goodiesのツールcheckrestart(1)を使用するか、次のコマンドを使用します。多くの場合、これらはアップグレードされたライブラリを使用するデーモンです。ファイルを解放するには再起動する必要があります。

ドキュメントで提供されるコマンド:

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

ファイルシステムの正確な構成、パーティショニング、およびストレージデバイスの構成がわからなければ、従うべきことを他に多く与えることは困難です。最初に戻って、ドキュメントの前提条件を再確認します(そして上記で概説しました)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.