Не мог сохранить жесткие ссылки. Почему?

Я пытаюсь создать Make-файл, который автоматизировал бы обновляющее распределение Knoppix.

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

$ 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 может сохранить hardlinks между различными хостами, он должен смочь сделать это на между filestems на том же хосте.

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

Методы:

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) и часть его считает md5sums от обеих файловых систем, и разность пуста - подразумевать, что содержание каждого файла между файловой системой является точно тем же. Однако разность между полномочиями и числами жесткой ссылки показывает, что каждый файл, который относился к общему (трудно связанному) inode, является теперь отдельным inode, который не является тем, что я хотел. Все эти три метода делают то же самое неправильно, которое действительно подозрительно, и у меня заканчиваются идеи.

Для Вашего обзора, здесь прибывает полный Make-файл:

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
задан 27.08.2010, 11:08

1 ответ

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

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

[РЕДАКТИРОВАНИЕ] Все инструменты на Unix обнаруживает жесткие ссылки путем рассмотрения inode числа (первое число в выводе ls -li). Если число отличается, то никакой инструмент не может воссоздать жесткие ссылки.

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

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

2
ответ дан 07.12.2019, 21:27

Теги

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