ディレクトリハードリンクを強制的に作成しますか?

ディレクトリハードリンクを強制的に作成しますか?

ほとんどすべてのUNIXバージョンがディレクトリハードリンクを受け入れない理由を理解しています。実際、OS XのHFS +は私が知っている唯一のバージョンですが、自分で行うのは簡単ではありません。ただし、すべてのファイルシステムは理論的にハードリンクされたディレクトリをサポートします。これは、すべてのディレクトリには、1つ以上の追加のハードリンクが含まれており、親ディレクトリのサブディレクトリへの追加のハードリンクが含まれているためです。

今、私はハードリンクが誤用されると危険になる可能性があることに気づきました。ハードリンクはほとんどプログラムが確認できない循環構造を作って無限ループに陥ることができるからです。しかし、ハードリンクを使用してすべてのUNIXで動作するTime Machineスタイルのバックアップを作成したいと思います。リンクは単に以前のバックアップを指しているので、循環リンクのリスクがあってはならないので、この構造は危険ではないと思います。私の場合、現在rsyncを使用して既存のファイルへのハードリンクを作成しますが、これは特に大規模バックアップの場合、特にどのディレクトリが変更されていないかを既に知っている場合は遅くて無駄です。

これを念頭に置いて、UNIXバリアントでディレクトリハードリンクを強制的に生成する方法はありますか?lnおそらく利点はほとんどありません。これは、多くのUNIXバージョンがハードリンクされたディレクトリを防ぐために制限を課し、ハードリンクされlnたディレクトリをサポートするバージョンではこれが失敗する可能性があることを示しているからです。しかし、リスクを知り、自分のユースケースが安全であることを知っている人が実際にリンクを作成する方法はありますか?シェルスクリプトには適していますが、これを行うために小さなプログラムをコンパイルする必要がある場合は、そうすることができます。

答え1

これをしないでください。スペースを節約するためにハードリンクを使用するバックアップシステムが必要な場合は、rsyncを一緒に使用することをお勧めします--link-dest文書問題を起こさずにスペースを適切に節約します(ディレクトリ間のハードリンクのためにファイルシステムが破損し、誤ったinodeの数を報告する可能性があります+ fsckが失敗しました+通常DAGではないため意味がわかりません)。

答え2

対話的に使用できない場合は、パイプで接続して出力からプロンプトとエコーコマンドを削除するためにdebugfs使用できます。sed

echo 'link /foo /bar' | debugfs -w [device] | sed '$s/debugfs:  $//' | sed '1d'

答え3

これを行うために使用できますdebugfs。ファイルシステムがマウントされていない状態でを実行しますdebugfs -w /dev/device_name。次に、debugfsプロンプトでlink通常ディレクトリハードリンクを使用するのと同じ方法でこのコマンドを使用します。ln(たとえばlink /original_dir /new_linklinkdebugfsのコマンドは、システムコールlnとは異なり、linkディレクトリへのハードリンクの作成を許可します。完了したら と入力しますquit

しかし、他の人が述べたように、欲しくない実際にこれをやってください。これは問題を引き起こす可能性があります。私はあなたがディレクトリハードリンクを強制的に生成する方法を尋ねたので、そう言うだけです。

答え4

目次絶対にしてはいけないこれには追加のハードリンクがあります。もちろん生成することもできますが、深刻なファイルシステムの破損。

その理由は、ディレクトリが常にツリー構造を形成する必要があるためです。そうしないと、クリーンアップのためにディレクトリを正しく探索することは不可能です。はい、現在はうまくいきます。ただし、次の何らかの理由でfsck(8)を実行する必要がある場合は、何もしないか、せいぜい偽のリンクの1つを削除することができます。

いいえ、これは理論ではありません。ずっと前、Ultrixシステムにはいくつかの欠陥のためにいくつかのハードリンクされたディレクトリがありました。ファイルシステムを編集して整理するのは楽しいことではありません。

関連情報