web-dev-qa-db-ja.com

同じファイルシステム上のディレクトリへのハードリンク作成許可を回避する方法

symbolic and hard リンクの違いをよく知っています。 ディレクトリへのハードリンクの作成 の危険性も認識しています。

それにもかかわらず、私はinsistingハードリンクの作成についてディレクトリおよびそのすべてのサブディレクトリへ(同じパーティション上)。

ただし、次は機能しません。

root@fab-ux:/home/fab-user/Public
# ln --directory ../Documents/CV/ CV
ln: failed to create hard link ‘CV’ => ‘../Documents/CV/’: Operation not permitted

この愚かさを達成できるカーネル/ファイルシステム(EXT4で実行中)パラメーターはありますか?

はい、bindをマウントでき、cronジョブを介して個々のファイルをハードリンクできます。しかし、ポイントは、物理的に1つのディレクトリだけの便利さandすべてのファイルとパブリックディレクトリ内の特定のハードリンクディレクトリのみをクラウドにアップロードすると、クラウドソフトウェアはシンボリックリンクを検出し、それらをサポートしませんそして最も重要なもの: Ubuntuを実行しています! OSXでもWindowsでもない:システムに[〜#〜] i [〜#〜]がしたいことをしたい!

1
Fabby

現在のカーネル(ファイルシステムの1つではなく、カーネルによる機能)にとどまっている限り、この制限を回避する方法はほとんどありません。

ハードリンクの制限

ファイルシステムでのループを防ぎ、_.._(親ディレクトリ)の解釈を一貫させるために、現代の多くのオペレーティングシステムはディレクトリへのハードリンクを許可していません。 UNIX System Vはそれらを許可しましたが、そのようなリンクを作成する権限を持っているのはスーパーユーザーだけです。

The Open Group Base Specifications Issue 7 (抜粋)

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


link()のような通常のファイルであるoldpathをチェックしないシステムコールはもうないので、唯一の方法は linkat() と同じような関数を作成することですご希望の方法。

4
cmks

Linuxではディレクトリへのハードリンクを作成できません。 OSXはこれをタイムマシンで使用できますが、Linuxでは使用できないと聞きました。最も近い方法はcp -lは、元のディレクトリをミラーリングする新しいディレクトリツリーを作成しますが、すべての通常ファイルをハードリンクします。

1
psusi