デフォルトのたとえ話:ディレクトリはフォルダではありません。

デフォルトのたとえ話:ディレクトリはフォルダではありません。

root次の権限を使用して、/ etc / passwdファイルをホームディレクトリにコピーできます。

-rw-r--r--. 1 root root 2751 Dec 24 21:26 /etc/passwd

私は同じことをすることはできません:

-rw-------. 1 root root 43591 Dec 27 18:32 /var/log/messages

では、読み取り権限があればothersコピーが可能になると思いますか?

ハードリンクを作成するために、ホームディレクトリにrootユーザーとしてfile1を作成し、一般ユーザーとしてハードリンクを作成しようとしました。できませんでした。

-rw-r--r--. 1 root root 0 Dec 27 18:39 file1

ハードリンクが生成されないようにするには?

file1 が置かれているディレクトリの権限は次のとおりです。 drwx------. 18 student student 4096 Dec 27 18:42 .

file1の名前をfile2に変更することができたので、コピーと同じように読み取り権限が原因でothersこれが起こるようです。

最後に、file2を別の場所に移動することはできません。なぜ?

編集:ハードリンクの権限を説明する質問がありましたが、他のユーザーのファイルとディレクトリをコピーして移動し、名前を変更するためにどの権限が必要かを理解していません。

ベストアンサー1

デフォルトのたとえ話:ディレクトリはフォルダではありません。

理解すべき基本概念は目次。これが重要です: Unixははいいいえ持つフォルダ、それは目次

これらの区別は重要です。フォルダ含むもの。ディレクトリリストもの。フォルダを考えると、間違ったたとえ話が浮かび上がります。オフィスビルのロビーにある会社のディレクトリを考えてみましょう。このディレクトリは会社のディレクトリではありません。含むオフィスそれリストそれらを。同様に、電話帳も同様です。含むあなたの友達リストそれらを。一方、(物理)フォルダは実際には含まれています保存される(物理)ファイル。

ファイルのシリアル番号

Unixでは、ファイルに名前がありません。ファイルは1つだけですファイルのシリアル番号(FSN)。 FSNは単一のファイルシステム内で一意です。同じファイルシステム上の2つのファイルは同じFSNを持たず、単一のファイルは存続期間中に単一のFSNのみを持ちます。しかし、ファイルの場所は次のとおりです。その他ファイルシステムは同じFSNを持つことができます。

インデックスノード

注:この用語に触れることもできます。インデックスノード。本質的に同じ意味です。ファイルのシリアル番号Unix 標準化のために設計された名前です。インデックスノード実際にはいくつかのファイルシステムの実装の詳細ですが、多くの最新のファイルシステムにはこれらの機能はありません。持つinodeはもう存在しませんが、まだFSNが必要です。また、多くの最新のUnicesは明らかにinodeのない外部ファイルシステムのマウントを可能にしています。これは純粋にUnixの仕事だからです(例えば、Linux上のFAT、exFAT、またはNTFSファイルシステムのマウント)。ただし、多くのファイルシステムAPIはFSNに基づいているため、これらの外部ファイルシステム用のUnixドライバはまだFSNを合成する必要があります。

目次

目次はい特殊ファイルその仲間名前到着FSN。非常に初期の非常に単純なUnixファイルシステムでは、ディレクトリは実際には次のファイル(テキストファイルに似ています)でした。

12345 foo
54321 hello.txt
34343 My 2021 taxes.xlsx

もちろん、最新のファイルシステムははるかに複雑ですが、概念的にこれは、今日最も複雑なファイルシステムでもまだ機能する方法です。

3つの基本概念

これらの3つの概念を理解したら、UnixファイルシステムとUnix権限について知っておくべきことすべてを学びました。

  • ファイルには名前がなく、ファイルのシリアル番号のみがあります。
  • ディレクトリはファイルです。
  • ディレクトリは名前をFSNに関連付けます。

私たちの電話システムがどのように機能するか考えてみましょう。私たちには数字しかありません。目次(電話帳、電話帳、または近代的には携帯電話の連絡先アプリ)名前をこの番号に関連付けます。

(ハード)リンク

間の関連名前そしてFSNと言う協会または時々ハードリンク(シンボリックリンク/ソフトリンクと混同される可能性がある場合)

3つの基本概念の結果

これら3つの概念を内面化すると、他のすべてが正しい位置にあるはずです。

他のディレクトリや同じディレクトリに同じFSNに対して複数の名前→FSNリンクを作成するのを防ぐ方法がないことが明らかになりました。つまり、同じファイルが複数の名前を持つことができ、複数のパスに存在する可能性があります。

明らかに、これは階層的なディレクトリ構造を引き起こします。ディレクトリは他のファイルと同様のファイルであるため、他のファイルと同様にFSNがあるため、ディレクトリ内のディレクトリを一覧表示できます。

明確ではありませんが、rmこのユーティリティを理解することは非常に重要です。いいえ実際に1つ削除文書!それを削除します協会つまり、ディレクトリ内のエントリを削除します。使用されたライブラリ関数とカーネルシステムコールはrm実際に呼び出されますunlink。実際にはできない実際にUnixからファイルを削除します。ファイルへのリンクがなく(つまり、ファイル名がゼロの場合)、ファイルに開かれたファイルハンドルがない場合、ファイルは自動的に削除されます。

これはまた、多くのWindowsユーザーを混乱させることも説明します。一部のアプリケーションでまだ開いているファイルをどのように削除できますか?アプリがどのようにクラッシュしないのですか?まあ、前の段落で学んだ内容に基づいて答えは簡単です。いいえ削除文書、削除のみされました名前。ファイルがまだ存在します。別の名前を持つこともできますが、これが姓であっても、アプリケーションがファイルを閉じるまでファイルは削除されません。実際に一時ファイルを作成して開き、すぐに再度「削除」することは、データを一時的に保存する必要がありますが、ファイルシステムを一時ファイルに複雑にしたくないUnixアプリケーションの一般的なデザインパターンです。

権限への概念の適用

ディレクトリがファイルであり、ディレクトリが名前と数字を連結することを理解すると、権限が明確になります。

  • 欲しいなら名前を変更する、あなたはする必要があります書くディレクトリの新しい名前を指定して削除します(これもフォーマットです。)書く) 古いので、w意識ライセンスが必要ですディレクトリへ、しかしファイルにアクセスできません。。実際、名前の変更は実際にはファイル自体とは関係ありません。名前これはいいえファイル自体の属性です。
  • 必要なディレクトリを一覧表示する読む内容があるため、rディレクトリに対する読み取り権限が必要です。
  • ハードリンクを作るのはただ書くディレクトリなので、wそのディレクトリに対する書き込み権限が必要です。など。

具体例

3つの重要な概念を考慮すると、次のすべての質問に答えることができます。

コピー

/etc/passwd次の権限を使用して、所有するファイルをホームディレクトリにコピーできます。root

-rw-r--r--. 1 root root 2751 Dec 24 21:26 /etc/passwd

私は同じことをすることはできません:

-rw-------. 1 root root 43591 Dec 27 18:32 /var/log/messages

では、読み取り権限があればothersコピーが可能になると思いますか?

いいですね。実際に「ファイルのコピー」とは何かを考えてみてください。意味は:誰作る新しいファイル(これは自動的に名前を付ける必要があることを意味します。協会ターゲットディレクトリのエントリ)、次を含みます。同じコンテンツ元のファイルとして。

これには2つの権限が必要です。

  • w新しく作成されたファイルへのハードリンクを作成するには、宛先ディレクトリへの書き込み権限が必要です。
  • 内容を読むには、ソースファイルに対するead権限が必要ですr。内容が読めない場合はどうすれば再作成できますか?

協会

ハードリンクを作成するために、file1ホームディレクトリにrootユーザーを作成し、一般ユーザーとしてハードリンクを作成してみました。できませんでした。

-rw-r--r--. 1 root    root       0 Dec 27 18:39 file1

ハードリンクの作成を妨げる標準のUnix権限モデルには何もありません。必要なのは、wディレクトリに対する意識権限だけです。ファイルに触れる必要がないため、ファイルに対する権限は関係ありません。

私はOS(macOS 12.1 "Monterey")のAPFSファイルシステムでこれをテストしましたが、うまくいきます。

fs.protected_hardlinks

ハードリンクが生成されないようにするには?

Unix権限システムには何もありません。ただし、Linuxを使用しているため、これを実行できないようにするLinux固有の設定オプションsysctlがありますfs.protected_hardlinks

から引用公式sysctlドキュメント[勇敢な強調鉱山]:

保護されたハードリンク

[… ]

""に設定すると、0ハードリンク生成の動作は制限されません。

1""に設定した場合ユーザーがソースファイルをまだ所有していない場合、またはソースファイルへの読み取り/書き込みアクセス権がない場合は、ハードリンクを作成できません。

(制限)に設定されているようです1/proc/sys/fs/protected_hardlinks確実に確認してください。

名前を変更する

file1 が置かれているディレクトリの権限は次のとおりです。

 drwx------. 18 student student 4096 Dec 27 18:42 .

file1名前をに変更することができたfile2ので、コピーと同様に読み取り権限がothers原因でこのようなことが起こるようです。

一つのために名前を変更するw、所有しているディレクトリに対するライト権限のみが必要です。ファイルの内容には絶対に触れないので、その権限は重要ではありません。

移動する

結局、file2他の場所に移動できなくなりました。なぜ?

何によって異なります、正確に、「移動」とはどういう意味ですか?正確に、「別の場所」を意味しますか?そして何を言いますか?正確に「できない」という意味です。

「移動」を解釈する方法は2つあります。

  1. 元のコンテンツを削除し、同じコンテンツを別の名前で再生成してください。
  2. ソースディレクトリからリンクを削除し、ターゲットディレクトリにリンクを作成します。

ユーティリティを使用すると、mv実際にこれらのことをすべて行うことができるので、見てみましょう。

#2名前の変更:wリンクを削除するにはソースディレクトリへの書き込み権限が必要です。リンクをw作成するには、宛先ディレクトリへの書き込み権限が必要です。ファイルに触れたりコンテンツにアクセスしたりする必要はまったくないため、権限は重要ではありません。実際、mvこれにはシステムコールが使用されます。rename

mv可能な場合はいつでも#2を試してください。

では2位はいつ?いいえ可能ですか?さて、FSNが唯一のものであることを覚えておいてくださいファイルシステム内で。返品、文書ただ存在するファイルシステム内で

したがって、#2は、ソースディレクトリとターゲットディレクトリが同じ場合にのみ可能であることを明確にする必要があります。同じファイルシステムで。異なるファイルシステムにあるmv場合コピーファイルをターゲットにコピーし、ソースファイルのリンクを解除します。これは、前述のように、wソースディレクトリへのライトアクセスとターゲットディレクトリへのライトアクセスに加えて、ソースファイルへのeadアクセスwも必要であることを意味します。r

実行権限

r注:これまではeadおよびrite権限のみを見てきましたが、eecute権限はw完全に無視されました。x

...一般的なファイルの場合

通常のファイルの場合、ecutex権限は非常に明確です。つまり、ファイルを実行する権限を付与します。 (いいえ、本当に?)しかし、ここで「実行」は特定の意味を持っています。 「実行のためにカーネルに渡す」を意味します。

特にいいえxファイルをスクリプトソルバーに渡すには実行権限が必要です。したがって、次のようにMyLanguageという仮想言語で呼び出されるスクリプトファイルがある場合myscript

#!/usr/bin/env mylanguage

print "Hello, World!"

だからあなたはするx次のように実行するには、ecute権限が必要です。

/path/to/myscript

しかし、あなたはそうでした。いいえx次のように実行するには、ecute権限が必要です。

mylanguage /path/to/myscript

言語ソルバーは、rスクリプトファイルの内容を読み取るには読み取り権限のみが必要です。

またはもっと正確に言えば、システムx電子許可を受ける必要はありませんがmylanguage、通訳が必要です。できるx、必要に応じてecute権限があることを確認してください。実際、一部の通訳者はこれを行い、一部はそうではありません。

...ディレクトリ用

xディレクトリに対するecute権限はどういう意味ですか?ここでは何が実行されていますか?

ディレクトリの場合、xecute権限は「入力」権限または「検索」権限として解釈されます。つまり、電子xecute権限を使用すると、ディレクトリから名前指定(FSN)を要求できます。

ディレクトリは、次のことを行う非常に単純なプログラムと考えることができます。名前パラメータとして使用して返すFSNでは、「e ecute Permission」というアイデアがx意味があります。しかし、それは本当に難しい考えです。 ecuteがディレクトリの「検索」または「入力」を意味することをx無視してください。xx

他の種類の特殊ファイル

ディレクトリは唯一の特別なファイルタイプではありません。他の5つがあります:

  • シンボリックリンク
  • 管路
  • ソケット
  • キャラクター特殊ファイル
  • 特殊ファイルのブロック

シンボリックリンク

これら5つのうち最も一般的になるのは次のとおりです。シンボリックリンクまたはシンボリックリンク

シンボリックリンクには基本的に以下が含まれます。。初期の非常に単純なUnixファイルシステムでは、シンボリックリンクは実際にパスを含むテキストファイルでした。それは今日でもまだあなたが見る方法に似ています。

これを理解したら、どこかにシンボリックリンクを作成するにはファイルを作成するだけでよいことが明らかになります。ファイルに入力したパスにアクセスする必要はありません。実際に道路が存在する必要はありません!

たとえば、ファイルを作成できると仮定すると、簡単にできます。

ln -s https://www.google.com/ google

完全に有効なシンボリックリンクです。google完全に有効な名前で完全に有効なパスです(「現在のディレクトリに指定されたディレクトリに指定されたディレクトリ」をhttps://www.google.com/意味します)。しかし、確かに存在する実際のファイルを指しているわけではありません。 、たとえwww.google.comhttps:できるする

mkdir -p https:/www.google.com

必要に応じて、次のようにどこかを指すようにすることができます。

cd google
# no error

おすすめ記事