古いルートファイルシステムをアンマウントするには、 `pivot_root`の後に `exec`を実行する必要があるのはなぜですか?

古いルートファイルシステムをアンマウントするには、 `pivot_root`の後に `exec`を実行する必要があるのはなぜですか?

要約:

pivot_root new_root put_old

質問:

exec古いルートファイルシステム()をアンマウントするために実行中の実行可能ファイルを変更する必要があるのはなぜですかput_old

put_old新しいルートファイルシステム()内にないディレクトリに移動するとしますnew_root。それでも削除できますか?

chroot実行後もまだ必要な理由は何ですかpivot_rootnew_rootこれが新しいルートファイルシステムになりました。

pivot_root最後に、親プロセス(たとえばbash)がシェルから分岐した場合、そのルートディレクトリをどのように変更できますか?変更はpivot_rootプロセス自体にのみ影響しませんか?ページの「現在のプロセス」はman親プロセスを参照していますか、それともpivot_rootそれ自体を参照していますか?

はい:

mount /dev/hda1 /new-root
cd /new-root
pivot_root . old-root
exec chroot . sh <dev/console >dev/console 2>&1
umount /old-root

man pivot_root:

exec chroot後で古いルートを削除する必要がある場合は、実行中の実行可能ファイルを変更する必要があります。

ベストアンサー1

尋ねる:exec古いルートファイルシステム()をアンマウントするために実行中の実行可能ファイルを変更する必要があるのはなぜですかput_old

使用している場合は、ファイルシステムをアンマウントできず、実行中の実行可能ファイル(たとえばbash)、またはその共有ライブラリが古いルートファイルシステムにある場合は引き続き使用されます。


尋ねる:put_old新しいルートファイルシステム()内にないディレクトリに移動するとしますnew_root。それでも削除できますか?

これは許可されていませんput_old外の新しい根。 ~からシステムコールのマニュアルページ:

put_old以下でなければなりません。新しい根


尋ねる:chroot実行後もまだ必要な理由は何ですかpivot_rootnew_rootこれが新しいルートファイルシステムになりました。

もう必要ありません。オリジナルマニュアルページシステムコールは2019年に大幅に書き直されました[代替リンク]と更新されたマニュアルページ[アーカイブリンク][代替リンク]は行動と歴史的不確実性を説明しています。

pivot_root()同じマウント名前空間にある各プロセスまたはスレッドのルートディレクトリと現在の作業ディレクトリを次に変更します。新しい根以前のルートディレクトリを指す場合。

...

[この動作]は、カーネルスレッドがルートディレクトリと現在の作業ディレクトリで古いルートマウントを引き続き使用するのを防ぐために必要です[...]

...

歴史的記録

長年にわたり、マニュアルページには次のテキストが含まれています。

pivot_root()以前のルートディレクトリを使用するプロセスまたはスレッドの現在のルートディレクトリと現在の作業ディレクトリは、変更されたり変更されたりすることはありません。呼び出し元は、 pivot_root()ルートディレクトリまたは現在の作業ディレクトリが、以前のルートディレクトリにあるプロセスが両方の場合に正しく実行されていることを確認する必要があります。これを確認する簡単な方法は、ルートディレクトリと現在の作業ディレクトリを次に変更することです。 新しい根電話する前にpivot_root()

この記事は、カーネルでシステムコールの実装が完了する前に作成されており、おそらく最終リリースの前に実装が変更される可能性があることをユーザーに警告するようです。ただし、説明で説明されている動作は、このシステムコールが最初に実装されて以来、一貫性を保ち、今も変わりません。


尋ねる:pivot_root最後に、親プロセス(たとえばbash)がシェルから分岐した場合、そのルートディレクトリをどのように変更できますか?変更はpivot_rootプロセス自体にのみ影響しませんか?ページの「現在のプロセス」はman親プロセスを参照していますか、それともpivot_rootそれ自体を参照していますか?

pivot_root()運営しているからです。マウントネームスペース親プロセスと共有される呼び出しプロセスに関する情報。ユーティリティのマニュアルページ(ピボット_ルート(8))ではこれを明示的に述べていませんが、システムコールの更新されたマニュアルページ(ピボット_ルート(2))実際に(強調追加):

pivot_root()ルートマウントの変更マウントネームスペースから呼び出しプロセス。 [...]

pivot_root()ルートディレクトリと現在の作業ディレクトリの変更プロセスまたはスレッドごと同じマウントネームスペースで新しい根以前のルートディレクトリを指す場合。

おすすめ記事