Я пытаюсь создать 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
Используйте формат архива как cpio или tar для сохранения жестких ссылок. Посмотрите cpio(1)
и tar(1)
.
Кроме того, cp
только сохраняет жесткие ссылки, если Вы используете -l
или -a
.
[РЕДАКТИРОВАНИЕ] Все инструменты на Unix обнаруживает жесткие ссылки путем рассмотрения inode числа (первое число в выводе ls -li
). Если число отличается, то никакой инструмент не может воссоздать жесткие ссылки.
Для устранения проблемы я предлагаю создать контрольные суммы MD5, отсортировать их и затем отфильтровать для дубликатов (uniq -d
). Вы не должны будете создавать контрольные суммы везде, потому что большинство жестких ссылок будет в bin
каталоги.
Затем можно сохранить первый файл и жесткую ссылку остальными.