回答:
カーネルAPIを使用しないでください。そのようなインターフェイスが存在する場合、スーパーユーザーに限定する必要があります。そうしないと、だれでも検索アクセス権のないディレクトリ内のファイルにアクセスできます。
ただしdebugfs
、ファイルシステムで(マウントされていない場合)使用して実行できます(ブロックデバイスへの書き込みアクセス権がある場合)。
debugfs -w / dev / block / device
(/dev/block/device
ファイルシステムが存在する実際のブロックデバイスに置き換えます)。
次に、のプロンプトでdebugfs
入力します
stat < 123 >(山括弧で、123を実際のinode番号に置き換えます)ファイルが存在し(inodeのリンクカウントが0より大きい)、ディレクトリではないことを確認します。
すべて問題なければ、次を入力します。
ln < 123 > path / to / newfileハードリンクを作成します(パスはファイルシステムのルートに相対的であることに注意してください)。に続く:
mi < 123 >リンクカウントをインクリメントするには(Enter現在の値に1を追加するリンクカウントを除くすべてのフィールドを押します)。
ユースケースに応じて、最初に1つのディレクトリ内のすべてのファイル候補をハードリンクして収集し、次に特に関心のあるファイルをハードリンクする別の方法があります。
といった
mkdir -pm 0700 by-inode/{0..999}
find <path> ! -type d -printf "%i/%p\0" |
while IFS=/ read -rd '' i n; do
ln "$n" "by-inode/$((i/1000))/$i"
done
(iノード番号がすべて1,000,000未満であると仮定し、必要に応じてさらにディレクトリを作成します)。
その後、iノードは1000単位でグループ化され、by-inode/
ツリーに収集されます。そこから、必要に応じてそれらをリンクできます。
ただし、その下<path>
にあるファイルを削除しても、その余分なハードリンクのために領域が再利用されないことに注意してください。