iノード(ext4)へのハードリンクを作成する方法は?


17

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

を使用sudo find / -inum 123546してファイルを見つけてからハードリンクを作成できましたが、それは私のアプリケーションにとっては遅すぎるでしょう。

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


1
密接な関係:そのiノードを介してファイルを削除または名前変更します(どちらも直接行うことも同様に不可能です)。
ジル 'SO-悪であるのをやめる'

回答:


23

カーネル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を追加するリンクカウントを除くすべてのフィールドを押します)。


6
このようなインターフェイスは、ファイルのリンクカウントがゼロ以外であることも確認する必要があります。そうしないと、カーネルの不変条件に違反するためにIIRCが拒否された、まだ開いている削除済みファイルを復元できます。
ジル 'SO-悪であるのをやめる'


1
@PhilipCouling、ディレクトリの実行許可ビットは検索許可に変換されます。私はすでにディレクトリで言ったので、への検索アクセス権を持っていません
ステファンシャゼル

3
@OrangeDog、検索許可はPOSIX標準で使用される用語です。
ステファンシャゼラス

1
@mosvy:そのチェックはカーネルから削除できます。ただし、VFS自体にホースを使用しないようにするには、VFSのいくつかの場所を修正する必要があります。私は数年前に私の論文に取り組んでいたときにそれをやった。
ジョシュア

3

ユースケースに応じて、最初に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>にあるファイルを削除しても、その余分なハードリンクのために領域が再利用されないことに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.