「Parchive」の版間の差分
Kusakata.bot (トーク | 投稿記録) 細 (文字列「Tips and tricks」を「ヒントとテクニック」に置換) |
Kusanaginoturugi (トーク | 投稿記録) (校正(でき・出来)) |
||
(2人の利用者による、間の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}} コマンドが使えるようになります。 |
|
==使用方法== |
==使用方法== |
||
17行目: | 17行目: | ||
例えば、大切なファイルの30パーセント分のリカバリ情報を計算したい場合: |
例えば、大切なファイルの30パーセント分のリカバリ情報を計算したい場合: |
||
− | $ par2create -r30 |
+ | $ par2create -r30 ''file'' |
上記のコマンドで Parchive は {{ic|<file>.par2}} インデックスファイルを作成しますが、インデックスファイルは修復するのに必ずしも必要というわけではありません。インデックスファイルに加えて、複数のファイルに分かれたリカバリブロックが作成されます。例えばリカバリブロックの数が592個であれば、以下のようにファイルが作られます: |
上記のコマンドで Parchive は {{ic|<file>.par2}} インデックスファイルを作成しますが、インデックスファイルは修復するのに必ずしも必要というわけではありません。インデックスファイルに加えて、複数のファイルに分かれたリカバリブロックが作成されます。例えばリカバリブロックの数が592個であれば、以下のようにファイルが作られます: |
||
50行目: | 50行目: | ||
===ファイルのバッチ保護=== |
===ファイルのバッチ保護=== |
||
− | ファイルの整合性を保証したいが、クライアントにリカバリファイルを配布したくはないという場合もあるでしょう。ヘリウム封入ハードディスクドライブ・瓦記録技術・センチメートル級面密度・伝達損失などが跋扈する時代、ビットが腐る可能性は決して低くありません。 |
+ | ファイルの整合性を保証したいが、クライアントにリカバリファイルを配布したくはないという場合もあるでしょう。ヘリウム封入ハードディスクドライブ・瓦記録技術・センチメートル級面密度・伝達損失などが跋扈する時代、ビットが腐る可能性は決して低くありません。できるかぎり[[バックアッププログラム|データのバックアップ]]を行うべきですが、利用できるストレージの容量が膨大な昨今、ちょっとした保護を加えることは気楽です。{{ic|par2}} ファイルを作成することは、ファイルに対してアプリケーションプログラムを実行したりエラー出力を確認するよりも簡単にデータの整合性を確認してデータをリストすることができます。Bit rot は元のファイルとリカバリファイルのどちらでも発生する可能性があり、それでも元のファイルを修復することが可能です。 |
結果的には、ひとつのリカバリファイルに全てのリカバリパケットを含めて大丈夫です ({{ic|-n1}} パラメータ)。これによってリカバリデータの量も減ります。重要なのはどの程度冗長性をもたせるかということです。特に小さいファイル (1 MiB 以下) の場合、リカバリデータの量は元のファイルのサイズとあまり相関関係がありません: |
結果的には、ひとつのリカバリファイルに全てのリカバリパケットを含めて大丈夫です ({{ic|-n1}} パラメータ)。これによってリカバリデータの量も減ります。重要なのはどの程度冗長性をもたせるかということです。特に小さいファイル (1 MiB 以下) の場合、リカバリデータの量は元のファイルのサイズとあまり相関関係がありません: |
||
74行目: | 74行目: | ||
ファイルをバッチ保護するスクリプトは以下のようになります: |
ファイルをバッチ保護するスクリプトは以下のようになります: |
||
− | {{Tip|1={{ic|bin/}} フォルダ |
+ | {{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 |
||
− | + | 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" |
||
− | + | 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 -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 "$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 |
+ | 次に、{{ic|batchprotect.sh}} を呼び出して、現在のディレクトリ内のすべてのファイルを Parchive によって再帰的に保護します。切り離された署名は、誰もあなたのデータを改ざんしていないことを確認するのに役立ちます。さらに、チェックサムのリストを維持する必要はありません。gpg もそれを行うことができるからです。 |
− | ===検証=== |
+ | === 検証 === |
− | $ par2verify |
+ | $ par2verify ''file''-5.par2 |
− | $ cfv |
+ | $ cfv ''file''-5.par2 |
− | $ gpg --verify |
+ | $ gpg --verify ''file''.sig |
元のファイルのパスを変更した場合: |
元のファイルのパスを変更した場合: |
||
− | $ par2verify |
+ | $ par2verify -B / ''file''-5.par2 ''/new/path/to/fileRenamed'' |
− | $ gpg --verify |
+ | $ 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 |
||
− | ... |
||
− | |||
− | ただし、ファイル名の空白によって動作に支障をきたす可能性があります。 |
2024年7月10日 (水) 20:52時点における最新版
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/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
ファイルのパスを変更することもできます。