Hardlinks können nicht beibehalten werden. Warum?

2071
dpc.pw

Ich versuche, ein Makefile zu erstellen, das die Remastering-Verteilung von Knoppix automatisiert.

Ich versuche, das Dateisystem vom schreibgeschützten Gerät mit komprimierter Schleife in das normale Dateisystem zu kopieren, um es ändern zu können und es dann zu komprimieren, um das alte zu ersetzen. Darum geht es bei Knoppix Remastering. Ich muss alle Details über das Dateisystem beibehalten, um die Hardlink-Struktur von einem Dateisystem auf dem anderen Dateisystem wiederherzustellen. Das von mir eingefügte ls -li ist dieselbe Datei in zwei verschiedenen Dateisystemen, um zu zeigen, dass die Quelle Hardlinks hatte und das Ziel sie verloren hat.

$ ls -li */bin/dnsdomainname 10419 -rwxr-xr-x 4 root root 12992 2010-01-19 10:40 KNOPPIX_V6.2.1CD-2010-01-31-EN.cloop/bin/dnsdomainname 10641687 -rwxr-xr-x 1 root root 12992 2010-01-19 10:40 KNOPPIX_V6.2.1CD-2010-01-31-EN.tree/bin/dnsdomainname 

Dies ist offensichtlich möglich - wenn der rsync in der Lage ist, Hardlinks zwischen verschiedenen Hosts beizubehalten, sollte es in der Lage sein, dies zwischen Dateisystemen auf demselben Host durchzuführen.

Aus irgendeinem seltsamen Grund funktioniert dies nicht mit einer der drei Methoden, von denen ich weiß, dass sie den Job erledigen sollten, und ich bin verwirrt, was falsch ist. Ich habe fast einen Arbeitstag verbracht, um das Skript zu erstellen, es zu testen, und dies scheint ein letztes Stück zu sein, das es davon abhält, vollständig zu funktionieren.

Die Methoden sind:

sudo nice tar -C $(NAME).cloop -cf - . | sudo nice tar -C $(NAME).tree -xvpf - sudo cp -av --preserve=all $(NAME).cloop $(NAME).tree sudo rsync -x -a -H --progress --delete $(NAME).cloop/ $(NAME).tree 

Ich habe eine Testsuite integriert ( make changes) und ein Teil davon zählt md5sums aus beiden Dateisystemen und der Unterschied ist leer - was bedeutet, dass der Inhalt jeder Datei zwischen den Dateisystemen exakt gleich ist. Der Unterschied zwischen Berechtigungen und Festverknüpfungsnummern zeigt jedoch, dass jede Datei, die auf gemeinsam genutzte (fest verknüpfte) Inodes verweist, nun eine separate Inode ist, die ich nicht wollte. Alle drei Methoden machen dasselbe falsch, was wirklich verdächtig ist und mir gehen die Ideen aus.

Für Ihre Rezension folgt hier das vollständige Makefile:

SITE=ftp://sunsite.icm.edu.pl/pub/Linux/distributions/knoppix/ NAME=KNOPPIX_V6.2.1CD-2010-01-31-EN PWD=$(shell pwd)  .PHONY: all clean test test-orig  all: $(NAME)-cherry88.iso  $(NAME).iso: wget -c -O $(NAME).iso.download $(SITE)/$(NAME).iso && mv $(NAME).iso.download $(NAME).iso  clean: if [ ! -z "`mount | grep "$(PWD)/$(NAME).cloop"`" ]; then sudo umount $(NAME).cloop && rm -f $(NAME).cloop.mount || test 1=1; fi if [ ! -z "`mount | grep "$(PWD)/$(NAME)"`" ]; then sudo umount $(NAME) && rm -f $(NAME).mount || test 1=1; fi  $(NAME).mount: $(NAME).iso mkdir -p $(NAME) if [ -z "`mount | grep "$(PWD)/$(NAME)"`" ]; then sudo mount -o loop $(NAME).iso $(NAME); fi touch $(NAME).mount  $(NAME).cloop.iso: $(NAME).mount nice extract_compressed_fs $(NAME)/KNOPPIX/KNOPPIX - > $(NAME).cloop.iso touch $(NAME).cloop.iso  $(NAME).cloop.mount: $(NAME).cloop.iso mkdir -p $(NAME).cloop if [ -z "`mount | grep "$(PWD)/$(NAME).cloop"`" ]; then sudo mount -o loop $(NAME).cloop.iso $(NAME).cloop; fi touch $(NAME).cloop.mount  $(NAME).cdtree.touch: $(NAME).mount sudo mkdir -p $(NAME).cdtree sudo rm -Rf $(NAME).cdtree #sudo nice tar -C $(NAME) --exclude=KNOPPIX/KNOPPIX -cf - . | sudo nice tar -C $(NAME).cdtree -xvpf - sudo nice cp -av --preserve=all $(NAME) $(NAME).cdtree #sudo rsync -x -a -H --progress --delete $(NAME)/ $(NAME).cdtree touch $(NAME).cdtree.touch  $(NAME).tree.touch: $(NAME).cloop.mount sudo mkdir -p $(NAME).tree sudo rm -Rf $(NAME).tree #sudo nice tar -C $(NAME).cloop -cf - . | sudo nice tar -C $(NAME).tree -xvpf - sudo cp -av --preserve=all $(NAME).cloop $(NAME).tree #sudo rsync -x -a -H --progress --delete $(NAME).cloop/ $(NAME).tree touch $(NAME).tree.touch 
4

2 Antworten auf die Frage

2
Aaron Digulla

Verwenden Sie ein Archivformat wie cpio oder tar, um harte Links zu erhalten. Siehe cpio(1)und tar(1).

Außerdem cpbewahrt nur harte Links, wenn Sie verwenden -loder -a.

[EDIT] Alle Tools unter Unix erkennen feste Links anhand der Inode-Nummer (erste Nummer in der Ausgabe von ls -li). Wenn die Anzahl unterschiedlich ist, kann kein Werkzeug die festen Verknüpfungen neu erstellen.

Um das Problem zu beheben, empfehle ich, MD5-Prüfsummen zu erstellen, sie zu sortieren und dann nach Duplikaten ( uniq -d) zu filtern . Sie müssen nicht überall Prüfsummen erstellen, da sich die meisten harten Links in binVerzeichnissen befinden.

Dann können Sie die erste Datei beibehalten und den Rest fest verknüpfen.

Ich mach das. Sie haben nicht den vollständigen Text gelesen, oder? :) dpc.pw vor 13 Jahren 0
Sorry, ich habe das `--preserve = all` in cp verpasst. Ich mache mir Sorgen, dass Rsync nicht funktioniert. Dies geschieht normalerweise nur, wenn die Liste der Dateien nicht alle Hardlinks enthält (dh, wenn nur eine der vier Kopien tatsächlich kopiert wird). Was passiert, wenn Sie diese vier Dateien manuell mit `cp -avl` kopieren? Sind die Inode-Nummern (erste Nummer von 'ls -li') der Quelle identisch? Wenn ja, dann muss es funktionieren, denn so bestimmt `cp` die harten Links. Aaron Digulla vor 13 Jahren 0
Irgendwelche Wege, um alle Dateien zu finden, die den gleichen Inode teilen? dpc.pw vor 13 Jahren 0
`finden. -in N` Wie auch immer. Obwohl 'ls -l' berichtet, hat die Datei auf dem iso-9660-Dateisystem Hardlinks, aber alle Inode-Nummern sind unterschiedlich. Hier liegt die Wurzel des Problems. : / Falls ein "hardlink" -Tool gefunden wurde, das mit md5sum das Zeug findet und hardlinking, aber es gibt immer noch einige Dinge, die ein rekomprimiertes Bild vom Original unterscheiden. *Seufzer* dpc.pw vor 13 Jahren 1
0
monkinsane

Verwenden rsync -a -H.

  • -abehält so ziemlich alles außer hardlinks.
  • -Hweist rsync an, Hardlinks zu erhalten. Ich habe das schon oft benutzt.

Weitere Informationen finden Sie in der Manpage von rsync.

Sie könnten auch tar verwenden:

tar --preserve-permissions --preserve-order --check-links -jc /path/to/your/folder /path/to/your/backup_file.tar.bz2