「ln -d」が成功したファイルシステムはありますか?

「ln -d」が成功したファイルシステムはありますか?

マンページからなぜなら:

-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>?または、ファイルシステム固有のドライバに到達する前に、カーネルによってこの動作がブロックされますか?

注:実際には、どのコンピュータでもこれを行う予定はありません。ただ気になるだけです。

答え1

最初の注意:このコマンドには、およびその他のオプションはlnありません。これは移植不可能なGNUismです。-d-F--directory

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

元の質問に戻って:

一般的なUNIXシステムでは、ディレクトリへのハードリンクが可能かどうかはファイルシステムドライバによって決定されます。

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

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

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

Linuxに関して私の推測では、Linuxブロックが親カーネル層のディレクトリにハードリンクを作成しようとしているようです。この仮定の理由は、Linus Torvaldsがgit cloneハードリンクされたディレクトリをサポートするプラットフォームでルートとして呼び出されたときにディレクトリを破棄するGIT用のコードを書いたからです。

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

したがって、TorvaldsがLinuxの仕組みを知っていると仮定し、Linuxがハードリンクされたディレクトリをサポートしている場合、Torvaldsはunlink(2)ディレクトリをrootとして呼び出してもエラーは返されませんが、ディレクトリが破損することに注意してください。つまり、Linuxでは、ファイルシステムドライバがハードリンクされたディレクトリを実装することはできません。

答え2

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 呼び出しはありません。ディレクトリはハードリンクを使用して作成されます(特権タスクとして)。上記の問題を解決するためにシステムコールを追加すると、これらすべてが消えました。しかし、これらのシステムはまだ文書で参照されており、これらのシステムのメンテナンス者はもはや覚えていません。問題のオプションは、以前のバージョン(1990年代半ばのfileutilsA&Pとの合併によって形成されました)にありました。この機能のソースを明らかにするのに役立つ可能性がある変更ログの一部:textutilsshellutilscoreutils

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にはありません(参照:基本的な理由を部分的に説明します)。代わりに、機能は次の新しいコマンド(GNU coreutilsでも提供されています)に移動されました。link。コマンド自体の説明はあいまいです。説明を読んでください。関数呼び出し標準を活用してください。ただし、この規格は、必須権限に関する免責事項を明示する以外に、命令の作業条件を明確にしません。これを行うには、標準の外部でシステム依存機能を使用する必要があります。

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

そこはい一般的なディレクトリ数(2つ+サブディレクトリ)よりも多くのハードリンクを使用するシステム。

OSX は共通ディレクトリへの複数のハードリンクを使用します。文書。この使用をサポートしていませんln(参照マニュアルページ)。 ~によるとタイムマシンが魔法を発揮する方法これは、Time Machineバックアップツールで使用するバージョンを提供するために行われます。

追加資料:

関連情報