rsync は正確なファイルにリンクしますか、それとも同じ名前のファイルだけにリンクしますか?

rsync は正確なファイルにリンクしますか、それとも同じ名前のファイルだけにリンクしますか?

最近交換したコンピューター(内蔵 HD から外付け HD)用に、小さな rsync バックアップ スクリプトを作成しました。

新しいコンピューターを入手したら、ファイルをコピーしました (古い内蔵 HD から新しい内蔵 HD へ)。ファイル構造、ファイル名などは同じです。

古い外付け HD に接続された新しいコンピューターでバックアップ スクリプトを実行できるかどうか疑問に思っています。

私が予測する潜在的な問題は、rsync が正確なファイルにリンクするのか、それともファイル名だけにリンクするのかということに関係しています。

ファイルシステムには、各ファイルに対して内部的に特定の識別子 (シリアル番号など) があり、名前を変更してもその番号は変更されないという記事を読んだことを覚えています。

したがって、rsync がディレクトリ構造内の特定の位置にあるファイル名ではなくその番号にリンクすると、すべてを重複して再コピーしたり、その他の奇妙な結果が生じたりして、外付け HD が完全に台無しになる可能性があります。

rsync はハード/ソフト リンクを使用して動作するというだけのことですが、私はその詳細やその意味を知るほどの専門家ではありません...

ご協力いただければ幸いです。

MacOS Ventura 13.4.1、APFS(ファイルシステム)

答え1

要約

心配する必要はありません。スクリプトでrsync --dry-run --verbose …実際に確認してみてください。問題がなければ、元のスクリプト ( なし--dry-run) をそのまま使用してください。


iノード番号

ファイルシステムには、各ファイルに対して内部的に特定の識別子 (シリアル番号など) があり、名前を変更してもその番号は変更されないという記事を読んだことを覚えています。

iノード番号。Unix/Linux のネイティブ ファイルシステムでは、この概念が一般的に使用されています (macOS は Unix です)。内部的に inode を使用しないファイルシステムは、inode を使用しているかのように表示されるため、同様の方法で処理できます。つまり、ファイルにはシリアル番号があり、ls -iそれを出力します。

つまり、rsync がファイル名だけではなくその番号にリンクする場合は…

rsyncinode番号を基準にせず、パス名(パス名はファイル名)。i ノード番号は、ファイルシステムの外部で何かを意味するようには設計されていません。また、ファイルシステムの種類を意味するわけでもありません。i ノード番号はファイルシステムの特定のインスタンスの内部にあり、別のファイルシステム (同じ種類であっても) の i ノード番号には関連付けられていません。

inode 番号を基準にしようとすると大混乱を引き起こす可能性があるというのは正しいrsync。そうではない。私の知る限りではinode番号でファイルにアクセスするための標準インターフェースがない. また、rsync新しいファイルを作成するときに特定の番号を要求することはできません。 inode を使用せず、使用しているように見えるだけのファイルシステムの場合、inode 番号は実行時に生成される可能性があり、多くの場合 (すべての場合?)、そのようなファイルシステムをアンマウントして再度マウントした後、まったく同じ番号がまったく同じファイルに関連付けられるという保証はありません。

これはすべて、プログラムがファイルシステム自体の中身を扱うのでない限り、inode 番号を気にする必要がないことを意味します。inode 番号はファイルシステムの内部にあります。プログラムは異なるレベルの抽象化で動作することを好むcprsync、または動作する必要があります。そして実際にそうしています。異なるレベルの抽象化とは、パス名を持つディレクトリ ツリーです。

inode 番号が「漏れて」、そのようなプログラムによって (安全に) 使用されるシナリオの 1 つは、プログラムがハードリンクを見つけようとする場合です。ハードリンクされたファイルは、1 つのファイル (inode 番号) につながる 2 つ以上のパス名です。プログラムは inode 番号を比較して、どのパス名が同じファイルにつながるかを判断できます。ハードリンクは単一のファイルシステム内でのみ機能します。偶然同じ inode 番号を持つが異なるファイルシステムに存在するファイルは関連がなく、プログラムはそれを考慮します。

たとえば、/オプションrsyncを使用できます:--hard-links-H

これはrsync、ソース内のハードリンクされたファイルを検索し、宛先の対応するファイルをリンクするように指示します。このオプションがない場合、ソース内のハードリンクされたファイルは、別々のファイルであるかのように扱われます。

[…]

rsync は転送セット内にあるファイル間のハードリンクのみを検出できることに注意してください。[…]

ソース:man 1 rsync

rsync -Hソースのハードリンクを見つけて、宛先にハードリンクを作成しようとします。しかし、宛先のinode番号はソースのinode番号とは何の関係もありません。rsync -Hソースのパス名が同じファイルシステム内の同じinode番号につながることに気付いた場合、宛先の対応するパス名を次のものにしようとします。いくつかの単一の inode 番号。つまり、ハードリンクされたファイルを作成しようとします。正確な番号は の範囲 (および機能) 外です。ハードリンクを作成するためのインターフェイス ( ) でも inode 番号ではなくパス名が使用されるrsyncため、ツールでは番号を気にする必要はありません。link(2)


バックアップ スクリプトを実行するだけでよいですか?

ファイルをコピーしました (古い内蔵 HD から新しい内蔵 HD へ)。ファイル構造、ファイル名などは同じです。古い外付け HD に接続された新しいコンピューターでバックアップ スクリプトを実行できるかどうか疑問に思っています。

あなたはできる。新しいソースの inode 番号は、古いソースの inode 番号とはまったく異なる場合があります (おそらく異なります) が、これはまったく問題ではありません。ソースのディレクトリ構造が同一であれば十分です。

覚えておいてください--dry-run/-n安全のためにスクリプトのコピーを作成し、それを使用してrsync --dry-run --verbose …、実行し、出力を分析します。ただし、発生する問題 (もしあれば) は、inode 番号とはまったく関係ありません。

関連情報