web-dev-qa-db-ja.com

ハードリンクを保持できません。どうして?

Knoppixディストリビューションのリマスターを自動化するMakefileを作成しようとしています。

ファイルシステムを読み取り専用の圧縮ループデバイスから通常のファイルシステムにコピーして変更し、圧縮して古いファイルシステムを置き換えようとしています。それがKnoppixのリマスタリングのすべてです。ファイルシステムに関するすべての詳細を保持して、一方のファイルシステムからもう一方のファイルシステムにハードリンク構造を再作成する必要があります。私が貼り付けたls-liは、2つの異なるファイルシステム内の同じファイルであり、ソースにハードリンクがあり、宛先でハードリンクが失われていることを示しています。

$ 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が異なるホスト間のハードリンクを保持できる場合、同じホスト上のファイルステム間でそれを実行できるはずです。

いくつかの奇妙な理由で、これは仕事をするべきだと私が知っている3つの方法のどちらも使用して機能しておらず、何が悪いのか戸惑っています。スクリプトの作成とテストにほぼ1日を費やしましたが、これが完全に機能しなくなる最後のピースのようです。

方法は次のとおりです。

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)そしてその一部は両方のファイルシステムからのmd5sumをカウントしており、差分は空です。つまり、ファイルシステム間のすべてのファイルの内容はまったく同じです。ただし、アクセス許可とハードリンク番号の違いは、共有(ハードリンク)iノードを参照していたすべてのファイルが個別のiノードになったことを示しています。これは私が望んでいたものではありません。 3つの方法すべてが同じことを間違って行っており、それは本当に疑わしいものであり、私はアイデアを使い果たしています。

あなたのレビューのために、ここに完全な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
dpc.pw

ハードリンクを保持するには、cpioやtarなどのアーカイブ形式を使用します。 cpio(1)およびtar(1)を参照してください。

また、cpは、-lまたは-aを使用する場合にのみハードリンクを保持します。

[編集] Unixのすべてのツールは、iノード番号(ls -liの出力の最初の番号)を調べることによってハードリンクを検出します。番号が異なる場合、どのツールもハードリンクを再作成できません。

この問題を修正するには、MD5チェックサムを作成し、それらを並べ替えてから、重複をフィルタリングすることをお勧めします(uniq -d)。ほとんどのハードリンクはbinディレクトリにあるため、どこにでもチェックサムを作成する必要はありません。

次に、最初のファイルを保持し、残りをハードリンクすることができます。

2
Aaron Digulla

使用する rsync -a -H

  • -aほとんどすべてを保持します除くハードリンク。
  • -Hハードリンクを保持するようにrsyncに指示します。私はこれを何度も使用しました。

詳細については、rsyncのマニュアルページを確認してください。

Tarを使用することもできます。

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