プロセスでまだ使用されているファイルやディレクトリを移動または削除しても、Linuxは気にしないようです。それでは、プロセスが作業ディレクトリとして使用しているデバイスをアンマウントしようとすると、なぜ文句が発生するのですか?
例:
$ mkdir -p a b
$ sudo mount --bind a b
$ sh -c 'cd b; sleep 10' &
[1] 215679
$ sudo umount b
umount: /home/laktak/b: target is busy.
$
[1]+ Done sh -c 'cd b; sleep 10'
$ sudo umount b
$
関連項目:
$ mkdir c
$ sh -c 'cd c; sleep 10; pwd; cd ..' &
[1] 220382
$ rmdir c
$
$ pwd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
$
[1]+ Done sh -c 'cd c; sleep 10; pwd; cd ..'
答え1
これには明らかな違いがあります。 ext2/3/4ファイルシステムでファイル名でファイルを「削除」することは、ファイルデータが添付されたデータ構造であるinodeへの参照が削除されることを意味します(削除したファイル名)。 inはls
単にinodeへの参照です。)ファイルは、最後の参照が消えた場合にのみ「削除」されたと見なされます。興味がある場合は、「ハードリンク」の概念を見てください。ただし、ファイルを開くと、その操作はinodeへの参照も生成するため、ファイルが開いている限り実際には「削除」されず、ファイルを開いたプロセスは引き続きファイルを使用できます。
オープンディレクトリの場合も同様です。そのディレクトリにあるcd
他のシェルインスタンスからそのディレクトリを削除しても、そのディレクトリは存在し続けます。ただし、「ダウングレード」状態になり、他のプロセスからアクセスできなくなり、まだ存在するシェルインスタンスでもそのディレクトリに新しいファイルを作成できません。 (ちなみに、2番目の例で示した動作を再現することはできません。4.3bash
で同じコードを実行すると、pwd
ディレクトリ名がデフォルトのシェルインスタンスから削除されても正しく印刷されます。)
一方、デバイスのマウント解除は、含まれているファイルへのすべての接続を切断し、すべての変更をフラッシュする役割を果たすため、誰かがまだ「外」にある間、オペレーティングシステムはそれを拒否します。