bzip2圧縮したファイルを破壊して修復する


映画『破壊の繭とディアンシー』(2014)

ポケモン映画で一番面白かったです。
破壊を司る伝説のポケモン、イベルタルと、生命を司る、伝説のポケモン、ゼルネアスが登場します。
新しい家を建てるには、古い家を取り壊さなければなりません。破壊は再生のために必要なこともありますね。

今回は破壊と復旧です。bzip2で圧縮したファイルを破壊して復旧してみます。

まず適当にテキストファイルを作ってbzip2圧縮します。

takk@deb8:~$ seq 10 > a.txt
takk@deb8:~$ cat a.txt
1
2
3
4
5
6
7
8
9
10
takk@deb8:~$ bzip2 a.txt
takk@deb8:~$ ls
a.txt.bz2

このようなバイナリの値になっています。

takk@deb8:~$ od -tx1 -Ax a.txt.bz2
000000 42 5a 68 39 31 41 59 26 53 59 6a a9 30 de 00 00
000010 05 c8 00 00 10 7f e0 20 00 21 a0 1a 34 20 1a 69
000020 a1 d4 d5 e1 de 45 06 1e 2e e4 8a 70 a1 20 d5 52
000030 61 bc
000032
takk@deb8:~$ 

これを破壊しようと思いますが、オリジナルを破壊すると差分が取れなくなるため、コピーしておきます。

takk@deb8:~$ cp a.txt.bz2 test.bz2

コピーしたファイルを、1bitだけ破壊してみます。

takk@deb8:~$ dd of=test.bz2 bs=1 seek=48 conv=notrunc
c1+0 レコード入力
1+0 レコード出力
1 バイト (1 B) コピーされました、 8.05224 秒、 0.0 kB/秒
takk@deb8:~$ od -tx1 -Ax test.bz2
000000 42 5a 68 39 31 41 59 26 53 59 6a a9 30 de 00 00
000010 05 c8 00 00 10 7f e0 20 00 21 a0 1a 34 20 1a 69
000020 a1 d4 d5 e1 de 45 06 1e 2e e4 8a 70 a1 20 d5 52
000030 63 bc
000032
takk@deb8:~$ 

インデックス0x30の0x61を0x63に変更することで、1bitだけ破壊しました。

差分があるか確認します。

takk@deb8:~/tmp3$ cmp a.txt.bz2 test.bz2
a.txt.bz2 test.bz2 異なります: バイト 49、行 1
takk@deb8:~/tmp3$ 

差分ありです。

では、伸張(解凍)します。

takk@deb8:~$ bunzip2 test.bz2

bunzip2: Data integrity error when decompressing.
	Input file = test.bz2, output file = test

It is possible that the compressed file(s) have become corrupted.
You can use the -tvv option to test integrity of such files.

You can use the `bzip2recover' program to attempt to recover
data from undamaged sections of corrupted files.

bunzip2: Deleting output file test, if it exists.
takk@deb8:~$ 

壊れてるので解凍できないですね。

では復旧させます。上でbzip2recoverが使えると言ってますので、使ってみます。

takk@deb8:~$ bzip2recover test.bz2
bzip2recover 1.0.6: extracts blocks from damaged .bz2 files.
bzip2recover: searching for block boundaries ...
   block 1 runs from 80 to 318
bzip2recover: splitting into blocks
   writing block 1 to `rec00001test.bz2' ...
bzip2recover: finished
takk@deb8:~$ 

復旧ファイルrec00001test.bz2ができました。

オリジナルとの差分を確認しましょう。

takk@deb8:~$ cmp a.txt.bz2 rec00001test.bz2 
takk@deb8:~$ 

何も表示されないため、差分なしです。

では、復旧後ファイルを伸張(解凍)してみます。

takk@deb8:~$ bunzip2 rec00001test.bz2 
takk@deb8:~$ ls
a.txt.bz2  rec00001test  test.bz2
takk@deb8:~$ cat rec00001test 
1
2
3
4
5
6
7
8
9
10
takk@deb8:~$ 

解凍できました。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA