Невозможно сохранить жесткие ссылки. Зачем?

1950
dpc.pw

Я пытаюсь создать Makefile, который бы автоматизировал ремастеринг дистрибутива Knoppix.

Я пытаюсь скопировать файловую систему из устройства со сжатым циклом только для чтения в обычную файловую систему, чтобы иметь возможность изменить ее, а затем сжать, чтобы заменить старую. Это то, чем занимается Knoppix remastering. Я должен сохранить все подробности о файловой системе, воссоздать структуру жестких ссылок из одной файловой системы в другой файловой системе. Вставленный мною ls -li - это один и тот же файл в двух разных файловых системах, чтобы показать, что в источнике были жесткие ссылки, а место назначения потеряло их.

$ 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 

Это, очевидно, возможно - если rsync способен сохранять жесткие ссылки между разными хостами, он должен иметь возможность делать это между файловыми элементами на одном хосте.

По какой-то странной причине это не работает с использованием ни одного из трех методов, которые, как я знаю, должны выполнять эту работу, и я озадачен тем, что не так. Я потратил почти рабочий день на создание сценария, его тестирование, и, похоже, это последний кусок, который мешает ему полностью работать.

Методы:

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 

У меня есть встроенный набор тестов ( make changes), и часть его подсчитывает суммы md5 из обеих файловых систем, а diff пуст - это означает, что содержимое каждого файла между файловыми системами одинаково. Однако разница между разрешениями и номерами жестких ссылок показывает, что каждый файл, который ссылался на общий (жестко связанный) индекс, теперь является отдельным индексом, а это не то, что я хотел. Все три метода делают одно и то же неправильно, что очень подозрительно, и у меня заканчиваются идеи.

Для вашего обзора, вот вам полный 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 ответа на вопрос

2
Aaron Digulla

Используйте формат архива, например, cpio или tar, чтобы сохранить жесткие ссылки. Смотрите cpio(1)и tar(1).

Кроме того, cpсохраняет жесткие ссылки, только если вы используете -lили -a.

[EDIT] Все инструменты в Unix обнаруживают жесткие ссылки, просматривая номер инода (первый номер в выводе ls -li). Если число отличается, то никакой инструмент не может воссоздать жесткие ссылки.

Чтобы решить эту проблему, я предлагаю создать контрольные суммы MD5, отсортировать их и затем отфильтровать на наличие дубликатов ( uniq -d). Вам не нужно будет создавать контрольные суммы везде, потому что большинство жестких ссылок будут в binкаталогах.

Затем вы можете сохранить первый файл и жестко связать остальные.

Я делаю это. Вы не прочитали полный текст, не так ли? :) dpc.pw 13 лет назад 0
Извините, пропустил `--preserve = all` в cp. Я беспокоюсь, что rsync не работает. Обычно это происходит только в том случае, если список файлов не включает все жесткие ссылки (т. Е. Фактически копируется только одна из четырех копий). Что произойдет, если вы скопируете эти четыре файла вручную с помощью `cp -avl`? Номера инодов (первое число `ls -li`) источника идентичны? Если это так, то это должно сработать, потому что именно так `cp` определяет жесткие ссылки. Aaron Digulla 13 лет назад 0
Любой восточный способ найти все файлы, разделяющие один и тот же индекс? dpc.pw 13 лет назад 0
найти. В любом случае. Кажется, что хотя `ls -l` сообщает, что файл в файловой системе iso-9660 имеет жесткие ссылки, все номера инодов различны. Здесь лежит корень проблемы. : / Если найден инструмент `hardlink`, который находит и связывает материал с помощью md5sum, но все же есть некоторые вещи, которые делают сжатое изображение отличным от оригинала. *вздох* dpc.pw 13 лет назад 1
0
monkinsane

Use rsync -a -H.

  • -a preserves pretty much everything except hardlinks.
  • -H tells rsync to preserve hardlinks. I've used this numerous times.

Check rsync's man page for further info.

You could also use tar:

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

Похожие вопросы