251 lines
9.7 KiB
Plaintext
251 lines
9.7 KiB
Plaintext
|
||
PAR 2.0 の修復用データを作ってファイルの破損や消失に備えます
|
||
|
||
澤田 豊 による Parchive 2.0 クライアント
|
||
|
||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||
|
||
[ 簡単な解説 ]
|
||
|
||
複数のソース・ファイルからリカバリ・ファイルを作成して、
|
||
それらのファイルの一部が破損したり消失しても、
|
||
残されたソース・ファイルとリカバリ・ファイルから、
|
||
ファイルを修復する為のソフトです。
|
||
PAR 1.0 がファイル単位で修復するのに比べて、
|
||
PAR 2.0 はファイルを複数ブロックに分割してそのブロック単位で修復するので、
|
||
ファイルの一部が破損しても破損部分以外のブロックは無傷で取り出すことができます。
|
||
そのため、より複雑なエラーにも少ない冗長性で対処することができます。
|
||
|
||
リカバリ・ファイルも個々に独立したパケットで構成される構造なので、
|
||
部分的な破損に強くて、より有効に使うことができます。
|
||
ブロック・サイズが小さいほど局地的なエラーが他に影響しにくくなり、
|
||
修復に必要なリカバリ・ファイルも少なくて済みます。
|
||
しかし、失われたソース・ブロックを復元するためには
|
||
同数のパリティ・ブロックが必要になるという PAR の基本原理は同じです。
|
||
作成するパリティ・ブロックの数が復元できる量で、
|
||
ブロック・サイズはその復元する単位になります。
|
||
|
||
PAR 2.0 はファイル名にディレクトリも含むことができるので、
|
||
複数のフォルダに散らばったファイルをそのまま修復することができたりと、
|
||
PAR 1.0 に比べてより多くのファイルを柔軟に修復できて使い勝手はよくなってます。
|
||
その反面、大きなファイルや多数のブロックを処理すると、
|
||
メモリー消費が増えたり計算にやたらと時間がかかります。
|
||
機能的には PAR 2.0 の方が上位版ですが、構造が複雑で対応ソフトがほとんどなく、
|
||
高性能なパソコンでないと実用的な処理速度を得られないかもしれません。
|
||
特に非力なパソコンではシンプルで軽快な PAR 1.0 の方が向いてることもあるので、
|
||
環境や用途に応じて使い分けてください。
|
||
|
||
|
||
|
||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||
|
||
[ 特徴や仕様など ]
|
||
|
||
Parity Archive 2.0 の本家 par2cmdline や QuickPar に比べて、
|
||
リカバリ・ファイルにコメントを付けることができます。
|
||
ユニコードを読み書きするのでマルチバイト文字にも対応してます。
|
||
サイズが 0の空ファイルにも対応してます。
|
||
par2cmdline はサブ・ディレクトリをファイル名として認識し、
|
||
QuickPar は無視しますが、このアプリケーションは
|
||
フォルダやサブ・ディレクトリなどのディレクトリ構造を復元することができます。
|
||
|
||
QuickPar は末尾にゴミが付いた状態で半端なブロックの直前のブロックが破損すると
|
||
そのブロックを認識できなくなりますが、このアプリケーションではきちんと判定します。
|
||
また、ブロック・サイズが小さくて同一ファイル内で内容が重複してると、
|
||
破損ブロック以降に後のブロックを先に検出する現象が起きて、
|
||
その後で本来の順番のブロックを認識できなくなってしまう問題がありますが、
|
||
このアプリケーションでは検出した順番に関わらずきちんと認識します。
|
||
破損部分の検査で 1バイトずつ一致するブロックを調べていくため時間はかかりますが、
|
||
破損したファイルからより多くの利用可能なブロックを検出するかもしれません。
|
||
|
||
QuickPar は破損ファイルを修復する際に、特定の破損ブロックの位置と修復に使う
|
||
パリティ・ブロックの組み合わせによっては、パリティ・ブロックの数が足りていても
|
||
修復できないことがあります。そういう時は、修復に使うパリティ・ブロックを
|
||
手作業で変更するというめんどうな作業が必要になります。
|
||
このアプリケーションでは問題のあるパリティ・ブロックを除いて自動的に
|
||
再度修復できるか試みてくれるので楽です。
|
||
|
||
失われたソース・ブロックと同じ内容のブロックが存在して利用できるかを
|
||
チェックサムを使って検索し、見つかった場合は直接コピーします。
|
||
そのため、同じ内容のソース・ブロックが複数含まれる時は、
|
||
修復時の計算量が減ると共に少ないパリティ・ブロックでも修復できます。
|
||
部分的に同じ内容のファイルが含まれるなら、QuickPar よりも修復できる可能性が高いです。
|
||
|
||
ブロック・サイズが 4バイトの場合は、
|
||
破損したソース・ブロックのチェックサムから内容を逆算するので、
|
||
パリティ・ブロックを全く使わないで修復することができます。
|
||
ブロック・サイズが 8バイトの場合の処理は、
|
||
1ブロックを逆算するのに何十分もかかるので実装していません。
|
||
ソース・コード上にはあるので希望があれば 8バイト用も追加できます。
|
||
|
||
扱うファイルの合計サイズが空きメモリー量の半分以下ならば、
|
||
他の PAR 2.0 クライアントよりもずっと高速に修復します。
|
||
マルチ・コア CPU に対応してマルチ・スレッドで行列演算と
|
||
リード・ソロモン符号の計算をするので、CPU コアが 2個以上あると更に速くなります。
|
||
シングル・コアでも QuickPar の 2倍、
|
||
デュアル・コアだと QuickPar の 3倍ぐらいの速度がでます。
|
||
ただし、空きメモリーが少なかったりファイルが大きいと、
|
||
効率が悪くなって極端に処理速度が低下します。
|
||
|
||
日本語の開発環境で作ってるので、
|
||
日本語のファイル名やディレクトリに対応してます。
|
||
4GB 以上のファイルにも対応してますが、
|
||
検査や修復速度はファイル・アクセス速度に大きく依存します。
|
||
|
||
開発者向けに、
|
||
ソース・コードが公開されてるので、細かい仕様を自分で変更できます。
|
||
動作に不明な点やバグっぽい挙動があっても、自分で確認することができて安心です。
|
||
ソース・ファイルをファイル・リストで指定することができます。
|
||
ソース・ファイルとリカバリ・ファイルが異なる場所にあっても処理できます。
|
||
|
||
制限事項としては、
|
||
ブロック・サイズは 2 GB 未満にしか対応してません。
|
||
パリティ計算に含めないファイル (ノン・リカバリ・セット) の指定はできません。
|
||
ソース・ブロックは最大で 32768個までです。(ファイル数は 65536個まで)
|
||
作成できるパリティ・ブロックは最大で 65535個までです。
|
||
|
||
注意点はメモリー消費量が膨大なことです。
|
||
リカバリ・ファイルで修復する際には、リード・ソロモン符号の行列を変換する為に
|
||
「 ソース・ブロック数 * 失われたソース・ブロック数 * 2 」のメモリーを必要とします。
|
||
例えば、ブロック数を最大の 32768 にすると、25% のブロックを復元するには
|
||
32768 * 8192 * 2 = 500MB 以上のメモリーを必要とします。
|
||
普通は冗長性を大きくすることは無いし、全ブロックが破損することもまず無いので、
|
||
実際に使われるメモリーはもっと少ないですが、足りなければエラーになります。
|
||
|
||
ファイル・アクセス用バッファーは「 (ソース・ブロック数 + 2) * ブロック・サイズ 」
|
||
が基本の大きさになり、メモリーが足りない場合はブロックを断片化して処理します。
|
||
断片サイズは「 1KB~ブロック・サイズの半分 」です。
|
||
行列を格納する為のメモリーを優先して、空きメモリーが足りない場合には、
|
||
ファイル・アクセス用バッファーを減らしますが、それでも足りなければエラーが発生します。
|
||
また、ブロックの断片化が激しいと極端に処理速度が低下します。
|
||
|
||
リカバリ・ファイルやソース・ファイルの検査では、
|
||
メモリーが十分にあっても CPU 性能やファイル・アクセス速度などによっては、
|
||
大きなファイルの検査に何分も待つことになるかもしれません。
|
||
標準ではメモリー量が十分あれば詳細な検査を行い、足りなければ簡易検査になります。
|
||
破損してるかどうかの確認をしたいだけの場合や、破損の程度が小さい場合は、
|
||
簡易検査でも十分なので、オプションで詳細検査を無効にすることもできます。
|
||
|
||
動作環境は Windows Vista かそれ以降 (Windows 7, 8, 10, 11) が動くパソコンです。
|
||
Win32 API と VC ランタイムを使ってるので、
|
||
ソース・コードをコンパイルするには Visual Studio 2022 以降が必要です。
|
||
|
||
|
||
|
||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||
|
||
[ 参考文献や利用したソース・コード、ライブラリーなど ]
|
||
|
||
par2-specifications.pdf
|
||
Parity Volume Set Specification 2.0
|
||
|
||
Michael Nahas
|
||
Peter Clements
|
||
Paul Nettle
|
||
Ryan Gallagher
|
||
May 11th, 2003
|
||
|
||
|
||
|
||
par2cmdline-0.4-x86-win32.zip : README
|
||
par2cmdline is a PAR 2.0 compatible file verification and repair tool.
|
||
|
||
|
||
|
||
par2cmdline-0.4-x86-win32.zip : reedsolomon.cpp, crc.cpp, crc.h
|
||
|
||
// This file is part of par2cmdline (a PAR 2.0 compatible file verification and
|
||
// repair tool). See http://parchive.sourceforge.net for details of PAR 2.0.
|
||
//
|
||
// Copyright (c) 2003 Peter Brian Clements
|
||
|
||
|
||
|
||
phpar2_12src.zip : par2asm.cpp
|
||
|
||
// Paul Houle (paulhoule.com) March 22, 2008
|
||
|
||
|
||
|
||
par2cmdline-0.4-tbb-20081005.tar
|
||
|
||
// Modifications for concurrent processing, Unicode support, and hierarchial
|
||
// directory support are Copyright (c) 2007-2008 Vincent Tan.
|
||
|
||
|
||
par-v1.1.tar.gz : rs.doc
|
||
Dummies guide to Reed-Solomon coding.
|
||
|
||
|
||
|
||
Jerasure - A C/C++ Library for a Variety of Reed-Solomon and RAID-6 Erasure Coding Techniques
|
||
Revision 1.2A
|
||
May 24, 2011
|
||
|
||
James S. Plank
|
||
Department of Electrical Engineering and Computer Science
|
||
University of Tennessee
|
||
|
||
|
||
|
||
GF-Complete: A Comprehensive Open Source Library for Galois Field Arithmetic
|
||
Revision 1.03. January 1, 2015.
|
||
|
||
Copyright (c) 2013, James S. Plank, Ethan L. Miller, Kevin M. Greenan,
|
||
Benjamin A. Arnold, John A. Burnum, Adam W. Disney, Allen C. McBride
|
||
All rights reserved.
|
||
|
||
|
||
|
||
MD5
|
||
; MD5 hash generator -- Paul Houle (paulhoule.com) 4/16/2010
|
||
;
|
||
; This code is in the public domain. Please attribute the author.
|
||
|
||
|
||
|
||
crc_folding.c
|
||
* Compute the CRC32 using a parallelized folding approach with the PCLMULQDQ
|
||
* instruction.
|
||
* Copyright (C) 2013 Intel Corporation. All rights reserved.
|
||
|
||
|
||
|
||
https://github.com/animetosho/ParPar
|
||
ParPar is a high performance, multi-threaded PAR2 creation tool and library for node.js.
|
||
License
|
||
This module is Public Domain.
|
||
|
||
|
||
|
||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||
|
||
[ ライセンスなど ]
|
||
|
||
PAR 2.0 のフォーマットについては説明書や実装コードを見て、
|
||
互換性を維持してなるべく同じになるようにしてます。
|
||
他の人が書いたコードを流用してる部分の著作権はその人にあります。
|
||
それ以外の部分の著作権は 澤田 豊 にあります。
|
||
|
||
ライセンスは GPL というものに準拠します。
|
||
par2cmdline や phpar2 のコードを流用していて、それらが GPL で配布されてるからです。
|
||
GPL のライセンスの詳細はよくわからないのですが、
|
||
利用料を払うことなく使えてソース・コードを公開することが条件みたいです。
|
||
詳しいことは付属の英文ライセンス文を読むか、
|
||
日本語の解説でも探して読んでみてください。
|
||
|
||
|
||
|
||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||
|
||
[ 連絡先 ]
|
||
|
||
私はたまに (週一ぐらい) しかメール確認できませんし、
|
||
長期間 (一ヶ月ぐらい) インターネットを使えないこともあります。
|
||
基本的にサポートはメールで行うことになりますが、
|
||
返事がいつ戻ってくるかは気長にお待ちください。
|
||
|
||
名前は 澤田 豊 です。
|
||
メール・アドレスは tenfon (at mark) outlook.jp です
|
||
迷惑メール拒否の表記なので、実際のメールでは (at mark) を @ に換えてください。
|