`ln -d`が成功するファイルシステムはありますか?


11

lnのマンページから:

-d, -F, --directory
  allow the superuser to attempt to hard link directories (note: will 
  probably fail due to system restrictions, even for the superuser)

これを実際に許可するファイルシステムドライバーはありますmount --bind <src> <dest>か、それとも唯一のオプションですか?または、この種の動作は、ファイルシステム固有のドライバーに到達する前にカーネルによってブロックされていますか?

注:私は実際にはどのマシンでもこれを実行するつもりはありません。

回答:


6

最初のノート:lnコマンドのようなオプションを持っていない-d-F--directory、これは非ポータブルGNUismです。

あなたが探している機能は、link(1)コマンドによって実装されます。

元の質問に戻ります:

典型的なUNIXシステムでは、ディレクトリへのハードリンクが可能かどうかの決定は、ファイルシステムドライバーで行われます。

Solaris UFSドライバはディレクトリのハードリンクをサポートしていますが、ZFSドライバはサポートしていません。

Solaris上のUFSがハードリンクをサポートする理由は、AT&Tがこの機能に興味を持っていたためです。BSDのUFSはハードリンクディレクトリをサポートしていません。

ZFSがハードリンクされたディレクトリをサポートしない理由は、Jeff Bonwickがその機能を好まないためです。

Linuxに関しては、Linuxは上位カーネルレイヤーのディレクトリにハードリンクを作成する試みをブロックすると思います。この仮定の理由は、Linus Torvaldsがgit cloneハードリンクディレクトリをサポートするプラットフォームでrootとして呼び出されたときにディレクトリを細断処理す​​るGITのコードを書いたためです。

ハードリンクされたディレクトリの作成をサポートするファイルシステムは、unlink(1)空でないディレクトリをルートとして削除することもサポートする必要があることに注意してください。

したがって、TorvaldsがLinuxの動作を知っていると想定し、Linuxがハードリンクディレクトリをサポートしていた場合、Torvaldsはunlink(2)rootであるディレクトリを呼び出すとエラーが返されず、そのディレクトリを細断処理す​​ることを知っているはずです。言い換えると、Linuxがファイルシステムドライバーにハードリンクディレクトリの実装を許可することはほとんどありません。


3

OPの質問の言及mount --bind。簡単に確認すると、マウントされているディレクトリのリンク数は変更されません。ハードリンクは常にリンクカウントを変更しls -ldます。これはを使用して確認できます。

通常(ほとんどのUnixライクなシステム)、ディレクトリへのハードリンクの数は、その名前に接続されているディレクトリの数になります。たとえば、

  • ".." (親ディレクトリ)
  • "." (ディレクトリ自体)
  • サブディレクトリ

(通常)より有益な情報ページを読んだ場合、他の人が行ったようにあなたは発見するかもしれません:

Oh great, one spends hours tying to find what is wrong only to
discover,
$ info ln
On all existing implementations, you cannot make a hard link to a
directory, and hard links cannot cross filesystem boundaries.  (These
restrictions are not mandated by POSIX, however.)

Therefore, kindly say everywhere you say super-user only,
instead say "few systems, super-user only".

それは現在言葉で書かれています

ほとんどのシステムでは、ディレクトリへのハードリンクの作成が禁止されています。許可されている場合は、スーパーユーザーしか実行できません(サイクルを作成すると他の多くのユーティリティに問題が発生するため、注意が必要です)。ハードリンクはファイルシステムの境界を越えることはできません。(ただし、これらの制限はPOSIXでは必須ではありません。)

ディレクトリへのハードリンクの作成(および削除)は、ディレクトリがリンクされていない場合にファイルが失われるのを防ぐための制限付きの機能です。Cオペレーティングシステムインターフェイスでのリンク/リンク解除操作は対称的であるため、通常、ディレクトリへのリンクはmkdir / rmdir呼び出しでのみ行われます。

GNU coreutilsの多くは、実際の博物館の一部がまだ使用されている20〜30年前に作成(および文書化)されたことに留意してください。ハードリンクに関してで述べたように、もともとmkdir / rmdir呼び出しはありませんでした。ディレクトリは(特権操作として)ハードリンクを使用して作成されました。言及された問題を解決するためにシステムコールが追加されたとき、それらすべてはなくなりました。しかし、ドキュメントはメンテナの記憶を超えてこれらのシステムを引き続き参照しています。問題となったオプションは前任者でしたfileutils(1990年代半ばにtextutilsと結合されてshellutilsを形成しましたcoreutils)。変更ログのいくつかの項目は、機能の起源を明確にするのに役立ちます。

Mon Jul 23 16:57:44 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * cp.c (copy): Make +update operate silently, like +one-file-system.
        * ln.c: Add -F as synonym for -d, for SunOS compatibility.

Wed Feb 21 11:13:26 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * ln.c (error): New function.
        (main, do_link): Call error instead of fprintf and exit. 
        (main): Recognize new -d +directory option to allow superuser to
        make hard links to dirs, like the BSD ln -f option.
        (do_link): Don't allow hard links to dirs (they are hard to
        get rid of -- rmdir and unlink don't do it), unless -d was given.
        (usage): Mention -d +directory option.

たとえば、この機能を適用できる骨董品の1つがSunOSであったことがわかります。対応するマニュアルページはこれを言った:

OPTIONS
       -f     Force a hard link to a directory -- this option is  only   avail-
              able to the super-user.

       -s     Create a symbolic link or links.

SYSTEM V OPTIONS
       -f     Force  files to be linked without displaying permissions, asking
              questions or reporting errors.

       -F     Force a hard link to a directory -- this option is  only  avail-
              able to the super-user.

       -s     Create a symbolic link or links.

ドキュメントに記載されているように、この機能(および対応するオプションはPOSIXにはありません(およびその理由を説明するRationaleセクションを参照してください)。むしろ、この機能は(GNU coreutilsによって提供される)という新しいコマンドに移動されましたlink。の説明コマンド自体はあいまいです。標準を使用するには、関数呼び出しの説明を読む必要があります。ただし、標準では、コマンドが機能する条件を明確にしていません。そのためには、標準外のシステム依存機能に移動する必要があります。

ディレクトリへのリンクは、ほとんどの従来の実装ではスーパーユーザーに制限されています。これは、この機能によってファイル階層にループが発生したり、ファイルシステムが破損したりする可能性があるためです。POSIX.1-2008のこの巻では、これを禁止しlink()、禁止することにより、その哲学を継続しunlink()ています。他の関数は、実装者がそのような拡張を設計した場合にそれを行うことができます。

あります、通常の数(2つのプラスサブディレクトリ)を超えてのディレクトリにハードリンクを使用するシステムが。

OSXは、通常のファイルのディレクトリへの複数のハードリンクを使用します。これは、この使用をサポートしていませんlnマニュアルページを参照)。Time Machineの魔法のしくみによれば、これはTime Machineバックアップ機能に使用されるバージョンを提供するために行われます。

参考文献:


3
これは質問にまったく答えていないようです。
マイケルホーマー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.