私はLinuxに初めて触れました。ファイルを読み取り専用に設定してもファイルを削除できます。ファイルの削除は、ファイルが含まれているフォルダの権限によって異なるという内容をオンラインで読みました。
明確にするために、読み取り専用ファイル「abc.txt」を含むディレクトリテスト(すべての権限を含む)があるとします。このファイルは読み取り専用ですが、簡単に削除できます。
それでは、次の状況を考えてみましょう。テスト中の「sub」というサブディレクトリがあります。このディレクトリは読み取り専用です。このサブディレクトリを削除しようとすると、このディレクトリを削除できないというエラーが発生します。
Linuxでは、ディレクトリもファイルと見なされます。ただし、読み取り専用ファイルは読み取り専用ディレクトリとは異なる動作をします。
その理由は何ですか?
答え1
これはUnixがそのように定義されており、POSIXではこれらの動作が必要なためです。 Linux は Unix と POSIX との互換性を試みます。
どんな内容なのか誤解があるかもしれません。文書はい(UnixとWindowsではまったく同じではありません)。ところで、彼らは多くの人にとって重要ですシステムコール(に記載システムコール(2))、複数のシステムコールが提供されます。ファイル記述子ファイルパス(参照:パス解像度(7))。他のオペレーティングシステムと比較すると、ファイル(Linux、Unix、またはPOSIXシステムの場合)は一つ名前(または道):一部のファイルには名前がなく、一部のファイルには複数の名前がありますが、実際にはほとんどのファイルには1つの名前があります。
ファイルは次のようになります。抽象的な提供するためにユーザースペース(そしてアプリケーション-含む便利プログラム - 実行済みプロセス)頼るオペレーティングシステムカーネル。システムコールは、プログラム(およびそれを実行するプロセス)がカーネルと対話する唯一の方法です。
ディスクはファイルについて知りません(ただし、オペレーティングシステムは知っています)。ディスクにはバイトブロックのみが含まれます。オペレーティングシステムはこれをファイルとして理解します。
ファイル(UnixとLinuxの場合)はインデックスノード。また、見ることができますインデックスノード(7)。 inodeにはファイルのメタデータが含まれています(次のコマンドを使用して照会できます)。統計(2)etc
fstat
...) - タイプ、作成時間、権限、所有権、サイズなどが含まれます。 - ファイルデータ(バイトシーケンス)を含みます(またはより一般的に指します)。
ただし、読み取り専用ディレクトリを削除しても問題はありません。
ㅏ目次特別な種類のファイルです(通常のファイルとディレクトリに加えて、次のような他の種類のファイルもあります)。先入選出(7)-S、シンボリックリンク(7)-sなど)。これには、文字列を inode にマッピングする事前マッピングが含まれます。これが発生する方法は、各ファイルシステムの種類によって異なります。使用ディレクトリを開く(3)(そして後でclosedir
)そしてディレクトリを読む(3)読んでください。
....フォルダが配置されているフォルダの権限...
誤解。フォルダはLinuxには存在しません。GUI人工生産時々あなたがマークしたデスクトップ環境)、あなたはおそらくディレクトリについて話しているでしょう。ファイルシステムさまざまな種類のファイル(ディレクトリとシンボリックリンクを含む)が含まれています。
与えられた inode は次に現れます。一部ディレクトリ(ファイル一部パスがあれば、すべて同じ「権限」に似た「役割」を持ちます。使用リンク(2)システムコール - おそらく、ln(1)コマンド - ファイルに追加のパスを追加するために使用されます。使用切断(2)ファイルパスを削除するシステムコールです。場合によっては、どのディレクトリにも表示されず、inodeが存在する可能性があります。一般的な場合(一時ファイルの実装)は、-egを使用してファイルを生成する場合です。作成(2)またはopen
その時unlink
(または削除(3))ファイルの直後にあります(たとえば、同じプロセスにありますが、おそらくそうではありません)。
inodeにアクセスできなくなると(開かれたファイル記述子がなく、一部のディレクトリには記載されていないため)、カーネルはinode(および関連するデータブロック)を削除します。
ファイルを「削除」するとき(例:部屋(1)ユーティリティ)、/bin/rm
プログラム(およびコマンドを実行するプロセス)は単に使用しますunlink
(そして名前とinodeの間のいくつかのマッピングを含むディレクトリに書き込みます)。その inode に「ポイント」がなくなったら、実際に削除されます。カーネルがディレクトリに書き込んでいるので、プロセスに書き込み権限が必要です。また、見ることができますバウチャー(7)。
ディレクトリが必要です目次(2)生産される予定であり、目次(2)(親から)削除されました:以下を使用する場合切断(2)削除すると失敗しますEISDIR
。しかし、目次(2)カーネルではファイル階層が空でなければならないため、ディレクトリは空でなければなりません。方向性非循環グラフと循環参照いかなる方法でも禁止参照カウント)。mkdir
システムコールはすべてディレクトリrmdir
マジック .
とエントリを処理します。..
ただし、読み取り専用ディレクトリを削除しても問題はありません。これが親ディレクトリに依存しないのはなぜですか?
これは一般的に本当です(しかし粘り強いビットカタログにはいくつかの具体的な意味があります。
編集に関する質問
修正された質問では、あなたは次のように主張します(間違っているか、いくつかの重要な詳細がありません)。
sub
それでは、次の状況を考えてみましょう。 underというサブディレクトリがありますtest
。このディレクトリは読み取り専用です。このサブディレクトリを削除しようとすると、このディレクトリを削除できないというエラーが発生します。
私はあなたの主張を再現できません(一部提供してくださいMCVE)。読みやすくするために、名前の代わりにtestdir
目次を検討しています。subdir
(しかし、これは何も変わりませんが、あなたの名前はtest
簡単に混同されます。テスト(1))
% /bin/mkdir testdir
% /bin/mkdir testdir/subdir
% /bin/ls -la testdir
total 12
drwxr-xr-x 3 basile basile 4096 Apr 24 13:09 .
drwxr-xr-x 6 basile basile 4096 Apr 24 13:08 ..
drwxr-xr-x 2 basile basile 4096 Apr 24 13:09 subdir
% /bin/chmod a-w testdir/subdir
% /bin/ls -la testdir
total 12
drwxr-xr-x 3 basile basile 4096 Apr 24 13:09 .
drwxr-xr-x 6 basile basile 4096 Apr 24 13:08 ..
dr-xr-xr-x 2 basile basile 4096 Apr 24 13:09 subdir
% /bin/rmdir testdir/subdir
% /bin/ls -la testdir
total 8
drwxr-xr-x 2 basile basile 4096 Apr 24 13:14 .
drwxr-xr-x 6 basile basile 4096 Apr 24 13:08 ..
覚えてください目次(1)(これは目次(2)システムコール)を使用するには、削除されたディレクトリが空である必要があり、一部のファイル(ドットで始まる名前)は、シェルまたは削除されたls
ディレクトリ内のすべてのファイルを一覧表示することによってブロックされる可能性があります。ls -a
あなたは読むことができますオペレーティングシステム:3つの簡単な部分
答え2
いいえ、親ディレクトリが読み取り専用の場合、ディレクトリは削除できません。自分で試してみてください。
$ cd /tmp
$ mkdir -p /tmp/readonly1/readonly2
$ chmod 555 /tmp/readonly1/readonly2 /tmp/readonly1 # dr-xr-xr-x
$ rmdir /tmp/readonly1/readonly2
rmdir: failed to remove '/tmp/readonly1/readonly2': Permission denied
強制削除も役に立ちません。
$ rm -rf /tmp/readonly1/readonly2
rm: cannot remove '/tmp/readonly1/readonly2': Permission denied
$ rm -rf /tmp/readonly1
rm: cannot remove '/tmp/readonly1/readonly2': Permission denied
$ chmod 755 /tmp/readonly1/readonly2 # drwxr-xr-x
$ rm -rf /tmp/readonly1
rm: cannot remove '/tmp/readonly1/readonly2': Permission denied
readonly1
ただし、ディレクトリを書き込み可能にした後は、そのサブディレクトリを削除できますreadonly2
。
$ chmod 555 /tmp/readonly1/readonly2 # dr-xr-xr-x
$ chmod 755 /tmp/readonly1 # drwxr-xr-x
$ rmdir /tmp/readonly1/readonly2
$ rmdir /tmp/readonly1 #... or just rm -rf /tmp/readonly1 all at once
$ ls /tmp/readonly1
ls: cannot access '/tmp/readonly1': No such file or directory