「Parchive」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(翻訳)
 
(→‎使用方法: 情報を更新)
 
(3人の利用者による、間の4版が非表示)
5行目: 5行目:
 
{{Related|アプリケーション一覧/セキュリティ#ハッシュチェッカー}}
 
{{Related|アプリケーション一覧/セキュリティ#ハッシュチェッカー}}
 
{{Related articles end}}
 
{{Related articles end}}
Parchive (Parity archive) は PAR2 ファイルを使ってファイルを検証・修復するツールです。様々な種類のファイルで使うことができます。
+
[https://github.com/Parchive/par2cmdline Parchive] (Parity archive) は PAR2 ファイルを使ってファイルを検証・修復するツールです。様々な種類のファイルで使うことができます。
   
 
==インストール==
 
==インストール==
   
[[公式リポジトリ]]から {{Pkg|par2cmdline}} パッケージを[[インストール]]してください。インストールすると {{ic|par2}}, {{ic|par2create}}, {{ic|par2verify}}, {{ic|par2repair}} コマンドが使えるようになります。
+
{{Pkg|par2cmdline}} パッケージを[[インストール]]してください。インストールすると {{ic|par2}}, {{ic|par2create}}, {{ic|par2verify}}, {{ic|par2repair}} コマンドが使えるようになります。
   
 
==使用方法==
 
==使用方法==
17行目: 17行目:
 
例えば、大切なファイルの30パーセント分のリカバリ情報を計算したい場合:
 
例えば、大切なファイルの30パーセント分のリカバリ情報を計算したい場合:
   
$ par2create -r30 <file>
+
$ par2create -r30 ''file''
   
 
上記のコマンドで Parchive は {{ic|&lt;file&gt;.par2}} インデックスファイルを作成しますが、インデックスファイルは修復するのに必ずしも必要というわけではありません。インデックスファイルに加えて、複数のファイルに分かれたリカバリブロックが作成されます。例えばリカバリブロックの数が592個であれば、以下のようにファイルが作られます:
 
上記のコマンドで Parchive は {{ic|&lt;file&gt;.par2}} インデックスファイルを作成しますが、インデックスファイルは修復するのに必ずしも必要というわけではありません。インデックスファイルに加えて、複数のファイルに分かれたリカバリブロックが作成されます。例えばリカバリブロックの数が592個であれば、以下のようにファイルが作られます:
47行目: 47行目:
 
インデックスファイルはなくても Parchive が勝手に処理してくれるため無視してかまいません。データブロックを完全にするために場合によっては {{ic|-N}} パラメータを指定すると良いこともあります。
 
インデックスファイルはなくても Parchive が勝手に処理してくれるため無視してかまいません。データブロックを完全にするために場合によっては {{ic|-N}} パラメータを指定すると良いこともあります。
   
  +
==ヒントとテクニック==
==Tips and tricks==
 
 
===ファイルのバッチ保護===
 
===ファイルのバッチ保護===
   
74行目: 74行目:
 
ファイルをバッチ保護するスクリプトは以下のようになります:
 
ファイルをバッチ保護するスクリプトは以下のようになります:
   
{{Tip|1={{ic|bin/}} フォルダ検索パスに含める必要があります: {{ic|1=$ export PATH=$PATH:$HOME/bin/}}。ホームディレクトリの init ファイルに追加することで永続的に設定することが可能です。}}
+
{{Tip|1={{ic|bin/}} フォルダーが検索パスにあることを確認する必要があります:
  +
$ export PATH=$PATH:$HOME/bin/
  +
この行をホームディレクトリの init ファイルに追加して、永続的にします。}}
   
  +
{{hc|~/bin/batchprotect.sh|2=#!/bin/bash
{{Note|1=マッチしたエントリだけが保護されます。{{ic|$(find $(pwd))}} を使うことで再帰的に実行することも可能です。}}
 
  +
OIFS="$IFS"
 
  +
IFS=$'\n'
{{hc|$HOME/bin/batchprotect.sh|2=#!/bin/bash
 
  +
list=$(find . -type f {{!}} shuf)
 
  +
numleft=$(echo "$list" {{!}} wc -l)
while [ ! -z "$1" ] ; do
 
if [ ! -d "$1" ] ; then
+
for file in $list ; do
  +
ending=$(echo "$file" {{!}} sed 's/\(.*\)\.\(.*\)$/\2/')
#entry is not a directory
 
  +
 
  +
#include this block if you want to have 5% recovery data
ending=$(echo "$1" {{!}} sed 's/\(.*\)\.\(.*\)$/\2/')
 
  +
if [ ! -e "$file-5p.par2" ] && [ "$ending" != "par2" ] && [ "$ending" != "sig" ] && [ "$(stat --format=%s "$file")" != 0 ]; then
 
  +
echo "$numleft original files left"
#include this block if you want to have 5% recovery data
 
  +
par2create -q -n1 -r5 "$file"
if [ ! -e "$1-5.par2" -a $ending != "par2" -a $ending != "sig" ]; then
 
  +
rm "$file".par2
par2create -n1 -r5 "$1"
 
rm "$1".par2
+
mv "$file".vol*par2 "$file"-5p.par2
  +
fi
mv "$1".vol*par2 "$1"-5.par2
 
  +
fi
 
  +
#include this block if you want to have 100% recovery data
 
  +
if [ ! -e "$file-100p.par2" ] && [ "$ending" != "par2" ] && [ "$ending" != "sig" ] && [ "$(stat --format=%s "$file")" != 0 ]; then
#include this block if you want to have 100% recovery data
 
  +
echo "$numleft original files left"
if [ ! -e "$1-100.par2" -a $ending != "par2" -a $ending != "sig" ]; then
 
par2create -n1 -r100 "$1"
+
par2create -q -n1 -r100 "$file"
rm "$1".par2
+
rm "$file".par2
mv "$1".vol*par2 "$1"-100.par2
+
mv "$file".vol*par2 "$file"-100p.par2
fi
 
 
#include this block if you want to check for normal AND cryptographic integrity
 
if [ ! -e "$1.sig" -a $ending != "par2" -a $ending != "sig" ]; then
 
gpg --default-key C0FFEEBEEFC0FFEEBEEFC0FFEEDEADBEEF31415926 --detach-sign --yes "$1"
 
fi
 
 
fi
 
fi
  +
shift
 
  +
#include this block if you want to check for normal AND cryptographic integrity
  +
if [ ! -e "$file.sig" ] && [ "$ending" != "par2" ] && [ "$ending" != "sig" ]; then
  +
gpg --default-key C0FFEEBEEFC0FFEEBEEFC0FFEEDEADBEEF31415926 --detach-sign --yes "$file"
  +
fi
  +
  +
numleft=$((numleft-1))
 
done
 
done
  +
IFS="$OIFS"
 
}}
 
}}
   
{{ic|batchprotect.sh *}} を実行すればカレントディレクトリに含まれている全てのファイル Parchive 保護されます。署名によってデータ竄されていないことが保証されます。またgpg を使用するためチェックサムのリストを管理する必要はありません。
+
次に、{{ic|batchprotect.sh}} を呼び出して、現在のディレクトリ内のすべてのファイル Parchive によって再帰的に保護ます。切り離された署名は、誰もあなたのデータざんしていないことを確認するのに役立ちます。さらに、チェックサムのリストを維持する必要はありません。gpg もそれを行うことができるからです
   
===検証===
+
=== 検証 ===
   
$ par2verify &lt;file&gt;-5.par2
+
$ par2verify ''file''-5.par2
$ cfv &lt;file&gt;-5.par2
+
$ cfv ''file''-5.par2
$ gpg --verify &lt;file&gt;.sig
+
$ gpg --verify ''file''.sig
   
 
元のファイルのパスを変更した場合:
 
元のファイルのパスを変更した場合:
   
$ par2verify &lt;file&gt;-5.par2 /new/path/to/<fileRenamed>
+
$ par2verify -B / ''file''-5.par2 ''/new/path/to/fileRenamed''
$ gpg --verify &lt;file&gt;.sig /new/path/to/<fileRenamed>
+
$ gpg --verify ''file''.sig ''/new/path/to/fileRenamed''
   
 
{{ic|par2}}/{{ic|sig}} ファイルのパスを変更することもできます。
 
{{ic|par2}}/{{ic|sig}} ファイルのパスを変更することもできます。
 
===マルチスレッド===
 
 
{{Note|This is work in progress. Help is appreciated.}}
 
 
残念ながら Parchive はマルチスレッドをサポートしていません。tbb や OpenMP を使うことでマルチスレッド対応版をコンパイルすることができます。[[wikipedia:Parchive|Wikipedia のページ]]を見てください。ファイルのリストをシャッフルして、スクリプトを多重実行するという方法もあります。スクリプトは既に処理したファイルを無視するため、複数のインスタンスを同時に実行しても問題ありません。以下のようにしてください:
 
 
#!/bin/bash
 
SHUFFILE=$(mktemp -t batchprotect.XXXXXXXXXX)
 
echo "" > $SHUFFILE
 
 
while [ ! -z "$i" ] ; do
 
echo $i >> $SHUFFILE
 
shift
 
done
 
 
for i in "$(shuf $SHUFFILE)" ; do
 
...
 
 
ただし、ファイル名の空白によって動作に支障をきたす可能性があります。
 

2023年8月23日 (水) 21:08時点における最新版

関連記事

Parchive (Parity archive) は PAR2 ファイルを使ってファイルを検証・修復するツールです。様々な種類のファイルで使うことができます。

インストール

par2cmdline パッケージをインストールしてください。インストールすると par2, par2create, par2verify, par2repair コマンドが使えるようになります。

使用方法

par2create には入力ファイルを指定することができ、特定の数のデータブロックとして解釈されます。データブロックに基づいて par2createリード・ソロモン符号によるリカバリブロックを作成します。後から破損したデータブロックをリカバリブロックと交換することで元のデータを修復することができます。ファイルを完全に修復するには破損したデータブロックに応じた数のリカバリブロックが必要です。

例えば、大切なファイルの30パーセント分のリカバリ情報を計算したい場合:

$ par2create -r30 file

上記のコマンドで Parchive は <file>.par2 インデックスファイルを作成しますが、インデックスファイルは修復するのに必ずしも必要というわけではありません。インデックスファイルに加えて、複数のファイルに分かれたリカバリブロックが作成されます。例えばリカバリブロックの数が592個であれば、以下のようにファイルが作られます:

<file>.vol000+001.par2
<file>.vol001+002.par2
<file>.vol003+004.par2
<file>.vol007+008.par2
<file>.vol015+016.par2
<file>.vol031+032.par2
<file>.vol063+064.par2
<file>.vol127+128.par2
<file>.vol255+256.par2
<file>.vol511+081.par2

プラス記号の左の数字はファイルのリカバリブロックのインデックスで、プラス記号の右の数字がファイルに含まれているリカバリブロックの数です。

リンクレベルで整合性チェックが行われなかった初期バージョンでは破損したデータブロックの数に基づいてリカバリファイルを選択することで上記のファイルを使うことができました。ダウンロードしたファイルのデータブロックが43個破損している場合、数字を2進数に変換することで必要なリカバリファイルがすぐにわかります:

    32 16  8  4  2  1
43 = 1  0  1  0  1  1

ファイルを修復するには *+032.par2, *+008.par2, *+002.par2, *+001.par2 をダウンロードしてください。

必要なファイルだけをダウンロードすることで帯域幅を節約することができます。リカバリファイルをダウンロードしたら、以下のコマンドでダウンロードしたファイルの修復を行うことが可能です:

$ par2repair <file>*.par2

インデックスファイルはなくても Parchive が勝手に処理してくれるため無視してかまいません。データブロックを完全にするために場合によっては -N パラメータを指定すると良いこともあります。

ヒントとテクニック

ファイルのバッチ保護

ファイルの整合性を保証したいが、クライアントにリカバリファイルを配布したくはないという場合もあるでしょう。ヘリウム封入ハードディスクドライブ・瓦記録技術・センチメートル級面密度・伝達損失などが跋扈する時代、ビットが腐る可能性は決して低くありません。出来るかぎりデータのバックアップを行うべきですが、利用できるストレージの容量が膨大な昨今、ちょっとした保護を加えることは気楽です。par2 ファイルを作成することは、ファイルに対してアプリケーションプログラムを実行したりエラー出力を確認するよりも簡単にデータの整合性を確認してデータをリストすることができます。Bit rot は元のファイルとリカバリファイルのどちらでも発生する可能性があり、それでも元のファイルを修復することが可能です。

結果的には、ひとつのリカバリファイルに全てのリカバリパケットを含めて大丈夫です (-n1 パラメータ)。これによってリカバリデータの量も減ります。重要なのはどの程度冗長性をもたせるかということです。特に小さいファイル (1 MiB 以下) の場合、リカバリデータの量は元のファイルのサイズとあまり相関関係がありません:

元のデータ 割合 (%) リカバリデータ (インデックスを含まない)
184.8 KiB 5 287.8 KiB
184.8 KiB 100 743.1 KiB
3.4 MiB 5 458.8 KiB
3.4 MiB 30 1.5 MiB
3.4 MiB 100 4 MiB
1.7 GiB 5 87.6 MiB

5% がリカバリデータとしては合理的なサイズですが、本当に重要なファイルであれば 100% のリカバリデータを確保しても良いでしょう。100% のリカバリデータは間違って元のファイルを削除してしまったとしてもファイルを復元することができます。

ファイルをバッチ保護するスクリプトは以下のようになります:

ヒント: bin/ フォルダーが検索パスにあることを確認する必要があります:
$ export PATH=$PATH:$HOME/bin/
この行をホームディレクトリの init ファイルに追加して、永続的にします。
~/bin/batchprotect.sh
#!/bin/bash
OIFS="$IFS"
IFS=$'\n'
list=$(find . -type f | shuf)
numleft=$(echo "$list" | wc -l)
for file in $list ; do
	ending=$(echo "$file" | sed 's/\(.*\)\.\(.*\)$/\2/')
	
	#include this block if you want to have 5% recovery data
	if [ ! -e "$file-5p.par2" ] && [ "$ending" != "par2" ] && [ "$ending" != "sig" ] && [ "$(stat --format=%s "$file")" != 0 ]; then
		echo "$numleft original files left"
		par2create -q -n1 -r5 "$file"
		rm "$file".par2
		mv "$file".vol*par2 "$file"-5p.par2
	fi
	
	#include this block if you want to have 100% recovery data
	if [ ! -e "$file-100p.par2" ] && [ "$ending" != "par2" ] && [ "$ending" != "sig" ] && [ "$(stat --format=%s "$file")" != 0 ]; then
		echo "$numleft original files left"
		par2create -q -n1 -r100 "$file"
		rm "$file".par2
		mv "$file".vol*par2 "$file"-100p.par2
	fi
	
	#include this block if you want to check for normal AND cryptographic integrity 
	if [ ! -e "$file.sig" ] && [ "$ending" != "par2" ] && [ "$ending" != "sig" ]; then
		gpg --default-key C0FFEEBEEFC0FFEEBEEFC0FFEEDEADBEEF31415926 --detach-sign --yes "$file"
	fi
	
	numleft=$((numleft-1))
done
IFS="$OIFS"

次に、batchprotect.sh を呼び出して、現在のディレクトリ内のすべてのファイルを Parchive によって再帰的に保護します。切り離された署名は、誰もあなたのデータを改ざんしていないことを確認するのに役立ちます。さらに、チェックサムのリストを維持する必要はありません。gpg もそれを行うことができるからです。

検証

$ par2verify file-5.par2
$ cfv file-5.par2
$ gpg --verify file.sig

元のファイルのパスを変更した場合:

$ par2verify -B / file-5.par2 /new/path/to/fileRenamed
$ gpg --verify file.sig /new/path/to/fileRenamed

par2/sig ファイルのパスを変更することもできます。