Bash Force Copy über dieselbe Datei

7

Unser Systemadministrator hat ein Backup-System erstellt, das Snapshots der Festplatte erstellt.

Wenn ich versuche, eine ältere Version aus dem Snapshot wiederherzustellen:

cp /path/to/snapshots/foo.bar /path/to/folder/foo.bar

Ich erhalte eine Fehlermeldung:

cp: `/path/to/snapshots/foo.bar' and  `/path/to/folder/foo.bar' are the same file. 

Ich kann die Datei löschen und kopieren, wollte aber wissen, ob es eine Möglichkeit gibt, dies mit cp zu tun.

Ich weiß, dass die Dateien nicht verknüpft sind, weil:

  1. Ich kann den Inhalt der Quelle ändern und die Schnappschüsse bleiben unverändert (getestet)
  2. Ich kann die Quelle löschen und die Schnappschüsse sind zum Wiederherstellen da (getestet)
  3. Die Dateien werden im Rechencluster der Universität gespeichert. Wenn so etwas wahr wäre, wäre schon jemand gefeuert worden (oder zumindest angeschrien).

Trotzdem ist die inodeAnzahl der Dateien gleich

Der Cluster wird über Red Hat Linux implementiert und ich weiß nicht, was das Dateisystem ist

df Ergebnis:

Filesystem           1K-blocks      Used Available Use% Mounted on
<ipadress>:/vol/hpc/storage
                      67633152  67633152         0 100% /storage
<ipadress>:/vol/hpc/storage
                     2186805248 982498048 1204307200  45% /storage

stat Ergebnis:

  File: `/path/to/snapshots/foo.bar'
  Size: 404         Blocks: 8          IO Block: 4096   regular file
Device: 17h/23d Inode: 19750461    Links: 1
Access: (0644/-rw-r--r--)  Uid: (<num1>/  yotama9)   Gid: ( <num2>/ <groupname>)
Access: 2012-01-22 00:03:27.246852000 +0200
Modify: 2012-01-19 23:10:32.746397000 +0200
Change: 2012-01-19 23:10:32.746397000 +0200
  File: `/path/to/folder/foo.bar'
  Size: 404         Blocks: 8          IO Block: 4096   regular file
Device: 17h/23d Inode: 26335134    Links: 1
Access: (0644/-rw-r--r--)  Uid: (<num1>/  yotama9)   Gid: ( <num2>/ <groupname>)
Access: 2012-01-24 16:03:48.732453000 +0200
Modify: 2012-01-24 16:03:30.728900000 +0200
Change: 2012-01-24 16:03:30.728900000 +0200
Yotam
quelle
1
Sind Sie sicher, dass der Quellpfad kein Symlink zum Zielpfad ist?
Enzotib
6
Es scheint, dass die Dateien ein und dasselbe sind .. dh. das eine ist eine harte Verbindung des anderen. run ls -l -iauf beiden Dateien, um zu sehen, ob die inodeNummer gleich ist. Wenn die Inode- Nummer identisch ist, haben Sie keine Sicherung. es bedeutet, dass es nur 1 echte Datei und 1 Hardlink zu dieser Datei gibt,
Peter.O
Ich habe meine Frage bearbeitet, sie sind nicht fest verknüpft
Yotam
1
Natürlich sind sie. 1. Wie ändern Sie die Quelle? Möglicherweise verwendet Ihr Editor eine temporäre Datei und kopiert sie dann. Versuchen Sie es echo x >> foo.bar. Oder testen Sie, ob der Inode immer noch derselbe ist, nachdem Sie ihn auf Ihre Weise geändert haben. 2. Das ist die Idee. Sie löschen einen Link, der andere bleibt.
Angus
Welches Betriebssystem und welches Dateisystem sind betroffen? Was wissen Sie über die Einrichtung der Schnappschüsse? Was df /path/to/snapshot /path/to/source; ls -l /path/to/snapshot /path/to/source; stat /path/to/snapshot /path/to/sourcezeigt?
Gilles 'SO - hör auf böse zu sein'

Antworten:

4

Normalerweise sollen Dateisystemimplementierungen Anwendungsprogrammen garantieren, dass zu jedem Zeitpunkt auf einem bestimmten Computer jede Datei durch die Kombination ihrer Geräte-ID (das st_devFeld in der statStruktur ) und ihres Inodes (das st_inoFeld) eindeutig identifiziert werden kann . Die Geräte-ID gibt an, auf welchem ​​gemounteten Dateisystem sich die Datei befindet, und der Inode kennzeichnet eine Datei in einem bestimmten Dateisystem. cpbetrachtet zwei Dateien als identisch, wenn sie dieselbe Geräte-ID und denselben Inode haben.

Es ist möglich, mehr als ein Paar (Geräte-ID, Inode) für eine Datei zu haben, wenn auf andere Weise auf sie zugegriffen wird, z. B. durch einen NFS-Mount an localhost (solche Szenarien sind in der Regel exotisch).

Es sollte nicht möglich sein, dass verschiedene Dateien dieselben Paare (Geräte-ID, Inode) haben. Dies hängt jedoch von der Implementierung des Dateisystems ab. Wenn Sie den Inhalt der Quelle ändern können, ohne den Snapshot zu ändern, würde ich erwarten, dass der Snapshot eine andere Geräte-ID als die Quelle aufweist, aber es ist möglich, dass einige Implementierungen dies nicht tun.

Beachten Sie, dass Ihre Tests außer dem Ändern der Datei nichts beweisen. Durch das Löschen eines festen Links werden die anderen Namen der Datei nicht gelöscht. Das Kopieren von Dateien nur bei Bedarf ist für Snapshots üblich. Daher wäre es nicht ungewöhnlich, wenn die Datei im Snapshot genau mit der Datei außerhalb des Snapshots identisch wäre, solange der Dateiinhalt identisch bleibt. Die Inode-Nummer bleibt normalerweise gleich.

Stellen Sie beim Ändern der Datei sicher, dass Sie in dieselbe Datei schreiben und nicht eine Datei entfernen, und unmittelbar nachdem Sie eine andere Datei mit demselben Namen erstellt haben.

Wenn Sie zwei verschiedene Dateien (den Snapshot und die Quelle) mit derselben Geräte-ID und demselben Inode, aber unterschiedlichen Inhalten haben, werden die meisten Anwendungen glauben, dass sie gleich sind. Sie müssen einen Weg finden, um die Gleichheit der Dateien zu testen, der von der Snapshot-Technologie abhängt, oder den Inhalt beider Seiten prüfen oder das Ziel systematisch entfernen.

Gilles 'SO - hör auf böse zu sein'
quelle