Não é possível preservar os links físicos. Por quê?

4

Estou tentando criar um Makefile que automatize a remasterização da distribuição do Knoppix.

Estou tentando copiar o sistema de arquivos do dispositivo de loop comprimido somente leitura para o sistema de arquivos normal para poder modificá-lo e compactá-lo para substituir o antigo. É disso que se trata a remasterização do Knoppix. Eu tenho que preservar todos os detalhes sobre o sistema de arquivos recriar estrutura de link duro de um sistema de arquivos no outro sistema de arquivos. O ls -li que eu colei é o mesmo arquivo em dois sistemas de arquivos diferentes para mostrar que a fonte tinha hardlinks e o destino os perdeu.

$ 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

Isto é obviamente possível - se o rsync é capaz de preservar hardlinks entre hosts diferentes, ele deve ser capaz de fazê-lo entre os arquivos no mesmo host.

Por alguma estranha razão, isso não está funcionando usando nenhum dos três métodos que eu saiba que deveria fazer o trabalho e estou intrigado com o que está errado. Eu passei quase um dia de trabalho para criar o script, testá-lo e esta parece ser uma última peça que o impede de funcionar completamente.

Os métodos são:

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

Eu tenho um conjunto de testes integrado ( make changes ) e uma parte dele está contando md5sums de ambos os sistemas de arquivos e o diff está vazio - o que significa que o conteúdo de cada arquivo entre o sistema de arquivos é exatamente o mesmo. No entanto, o diff entre permissões e números de hard link mostra que todo arquivo que estava referindo-se a inode compartilhado (hard-linked) agora é um inode separado que não é o que eu queria. Todos os três métodos estão fazendo a mesma coisa de maneira errada, o que é realmente suspeito e estou ficando sem ideias.

Para sua análise, aqui vem o Makefile completo:

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
    
por dpc.pw 27.08.2010 / 09:50

2 respostas

2

Use um formato de arquivo como cpio ou tar para preservar os links físicos. Veja cpio(1) e tar(1) .

Além disso, cp só preserva links físicos se você usa -l ou -a .

[EDIT] Todas as ferramentas no Unix detectam links físicos observando o número do inode (primeiro número na saída de ls -li ). Se o número for diferente, nenhuma ferramenta poderá recriar os links físicos.

Para corrigir o problema, sugiro criar checksums MD5, classificá-los e depois filtrar por duplicatas ( uniq -d ). Você não precisará criar somas de verificação em todos os lugares porque a maioria dos links físicos estarão em bin diretórios.

Depois, você pode manter o primeiro arquivo e vincular o resto.

    
por 27.08.2010 / 10:34
0

Use rsync -a -H .

  • -a preserva praticamente todos os exceto hardlinks.
  • -H diz ao rsync para preservar hardlinks. Eu usei isso várias vezes.

Verifique a página do manual do rsync para mais informações.

Você também pode usar tar:

tar --preserve-permissions --preserve-order --check-links -jc /path/to/your/folder /path/to/your/backup_file.tar.bz2
    
por 02.04.2014 / 11:00