最初のメモ: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
のときにディレクトリをシュレッドする GIT 用のコードを書いたことです。 ハード リンク ディレクトリをサポートするプラットフォームで root として呼び出されました。
ハード リンク ディレクトリの作成をサポートするファイル システムは、unlink(1)
もサポートする必要があることに注意してください。 ルートとして空でないディレクトリを削除します。
したがって、Torvalds が Linux の仕組みを知っていると仮定すると、Linux がハード リンク ディレクトリをサポートしている場合、Torvalds は unlink(2)
の呼び出しを知っているはずです。 ルートであるときにディレクトリにアクセスすると、エラーは返されませんが、そのディレクトリはシュレッドされます。言い換えれば、Linux がファイル システム ドライバーがハード リンクされたディレクトリを実装することを許可する可能性は低いです。
OPの質問は mount --bind
に言及しています .簡単なチェックでは、マウントされているディレクトリのリンク数が変更されていないことが示されています。 常にハードリンクする ls -ld
を使用して確認できるリンク数を変更します .
通常 (ほとんどの Unix 系システム)、ディレクトリへのハードリンクの数は、その名前に接続されているディレクトリの数になります。たとえば、
".."
(親ディレクトリ)"."
(ディレクトリ自体)- サブディレクトリ
(通常) より有益な info を読むと、 ページ、他の人が行ったように発見するかもしれません:
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
にありました (これは textutils
と結合されました と shellutils
1990 年代半ばに 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 にありません (および 根拠 を参照してください) 理由を説明するセクション)。むしろ、この機能は link
と呼ばれる新しいコマンド (GNU coreutils によって提供される) に移動されました。 .コマンド自体の説明はあいまいです。標準を使用するには、関数呼び出しの説明を読む必要があります。ただし、標準では、必要な特権に関する免責事項を繰り越すことを除いて、コマンドが機能する条件を明確にしていません。そのためには、標準外のシステム依存機能に移動する必要があります:
ディレクトリへのリンクは、ほとんどの歴史的な実装ではスーパーユーザーに制限されています。これは、この機能によってファイル階層にループが発生したり、ファイル システムが破損したりする可能性があるためです。この巻の POSIX.1-2008 では、link()
を禁止することでその哲学を継承しています。 と unlink()
これを行うことから。実装者がそのような拡張機能を設計した場合、他の関数がそれを行うことができます。
ある 通常の数 (2 プラス サブディレクトリ) を超えるディレクトリへのハードリンクを使用するシステム。
OSX は、通常の ファイル のディレクトリへの複数のハードリンクを使用します . ln
を使用してこれをサポートしていません (マニュアルページを参照)。 How Time Machine Works its Magic によると、Time Machine バックアップ機能に使用されるバージョンを提供するためにこれを行います。
さらに読む:
- OS X Time Machine がディレクトリのハードリンクを作成するのはなぜですか?
- OS X でディレクトリへのハードリンクを作成する Unix コマンドは何ですか?