Я пытаюсь создать 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