質問

質問

質問

一部のマウントされたファイルシステムで実行した後、一部のumount -lプロセスがそのファイルシステムの一部のファイルの開かれたファイルハンドルを(少なくとも)保持するため、ファイルシステムが隠された状態でマウントされたままになることはどのくらい信頼できますか?これらのプロセスのリストを取得する方法は?

テスト設定

私はそのような状況を作るために次の手順を実行し、システムをナビゲートし、さまざまなコマンドを試しました(Linux 3.16カーネルを持つdebian jessieでbachを使用)。

sudo -i
cd $(mktemp -d) # get empty directory to play around with
# create empty file system with one file
dd if=/dev/zero of=disk bs=1M count=4
mkfs.ext4 disk
# mount the filesytem and create a file
mkdir mounted
mount disk mounted # uses /dev/loop0 in my case, actual device my vary
touch mounted/file
# fork of a process with an open file handle to file
bash -c 'cd mounted; exec 3<>file; while true; do sleep inf; done' &
# verify that the file is open in the background
lsof mounted/file
# lazy unmount
umount -l mounted
# even remove the mountpoint 
rmdir mounted

それでは、隠しインストールの/ dev / loop0で特定のファイルを開くすべてのプロセスを表示できるコマンドは何ですか?

失敗した試み

ラソフ

lsof -p <thepid>

まず、これにはプロセスID(ここで検索するもの)に関する事前の知識が必要であり、2番目に、開いているファイルが開いているように見えても、ファイルが隠されたマウントされた/fileファイルシステムに存在するという表示はありません。一般的なルートファイルシステム。

フューザー

フューザから有用な出力が得られません。マニュアルページの内容が混乱しているようです。

/sys/fs/ を確認してください。

この特定のテスト設定では、ファイルシステム(ext4)とデバイス(loop0)が知られています。ここでは、ファイルシステムが非表示のマウント状態からアンマウント状態に変更されたことを確認できます。

if [ -e /sys/fs/ext4/loop0/ ]; then
    echo "still not unmounted";
else
    echo "finally unmounted";
fi

ただし、これは開かれたファイルハンドルを持つプロセスのリストを提供しません。

手動で/procチェック

procでいくつかの情報が見つかりました。

mnt_id がシステム全体で一意であると仮定します。(この仮定が合っているかどうかわかりません!) 全て一覧表示することが可能です。隠されていないmnt_idsすべてのプロセスで:

find /proc/ -maxdepth 1 -type d -regex '/proc/[0-9]+' -exec "cat" "{}/mountinfo" ";" | cut -d " " -f 1 | sort -gu

次に、実際の状況をすべてリストします。開いているすべてのfdはmnt_idsを使用します。:

find /proc/ -regex '/proc/[0-9]+/fdinfo/[0-9]+' -exec cat "{}" ";" | grep mnt_id | cut -f 2 | sort -gu
# maybe gives some errors like 'Operation not permitted' or 'No such file or directory' because of inspecting it's own process and sub-process and possibly parallel things happening. probably this is an unreliable way of inspecting /proc.

もし2つのリストを比較するために洗練された方法が使用され、隠されたmnt_idsとそれを使用するfdとそのfdのプロセスIDを決定します。しかし、この結果にもかかわらず、隠されたmnt_idsのどれが隠されたマウントされた関心のあるファイルシステムに対応するかを確認する最後のステップはまだありません。

答え1

マウントポイントが隠されているため、umount -l影響を受けるファイルをまだ使用しているプロセスを特定する方法はありません。

リストを取得する唯一の方法は、関連するパスを見つけるためにlsofbeforeを使用することです。umount -l例: lsof | grep "/mountPoint/"

必要に応じて、この出力を使用してPIDを抽出して監視し続けることができます。

関連情報