inode(ext4)へのハードリンクを作成するには?

inode(ext4)へのハードリンクを作成するには?

ファイルのインデックスノード(inode)を知っていても、そのパス(またはそのパス)がわからない場合は、そのinodeに直接ハードリンクを作成できますか?

を使用してファイルを検索し、sudo find / -inum 123546ハードリンクを生成することができますが、これは私のアプリケーションと比較して遅すぎます。

私はext4ファイルシステムを使用しています。

答え1

AFAIK、カーネルAPIは使用されません。そのようなインターフェースが存在する場合は、スーパーユーザーに制限する必要があります。それ以外の場合は、誰でも検索アクセス権を持たないディレクトリ内のファイルにアクセスできます。

ただしdebugfs、ファイルシステムで(アンマウント後)これを使用してこれを実行できます(ブロックデバイスへの書き込みアクセス権があると仮定)。

デバッグファイル-w/dev/ブロック/デバイス

(変える/dev/block/deviceファイルシステムが常駐する実際のブロックデバイスと共に)。

その後、プロンプトにdebugfs入力します。

統計<123>
(山括弧を使用して、123を実際のinode番号に置き換えます)ファイルが存在するか(inodeのリンク数が0より大きい)ディレクトリではないことを確認してください。

すべてが順調に進んだら、次のように入力します。

ln<123>パス/ターゲット/新しいファイル
ハードリンクを作成します(パスはファイルシステムのルートに相対的です)。以下は:

m<123>
リンク数を増やします(Enterリンク数を除くすべてのフィールドにアクセスするには、このボタンを押します。現在の値に1を加える必要があります)。

答え2

ユースケースに応じて、別のアプローチは、まずハードリンクを介してディレクトリ内のすべての候補ファイルを収集し、次に特に関心のあるファイルをハードリンクすることです。

例えば

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

(inode番号がすべて1,000,000未満であると仮定し、必要に応じてより多くのディレクトリを作成します。)

その後、inodeは1000のグループにまとめられ、by-inode/ツリーに集められます。ここで必要に応じて接続できます。

これは、以下のファイルを削除しても、追加の<path>ハードリンクによってスペースが解放されないことを意味します。

関連情報