バイナリ差分の作成や適用できるbsdiffを紹介します。
Linuxではファイルの差分というのは、
一般的にdiffコマンドによる2つのテキストファイルの差異を抽出したものを指します。
これはパッチファイルとも呼ばれます。
差分ファイルのよくある利用方法としては、
ソフトウェアのソースコードから変更した部分のみを取り出し、
別の場所にある古いバージョンのソースコードに対して、
patchコマンドを使ってその変更部分を反映したりします。
テキスト以外のファイル、つまり実行プログラムファイルや画像・音声・動画ファイル、
アーカイブファイルなど、バイナリファイルの差分を取ることはあまり行われません。
これは元々UNIX(Linux)の世界では、ソフトウェアはソースコードを手元の環境で
コンパイルして実行ファイルを作ることが普通だったためです。
たとえ同じソフトウェアを動かしていても、OSやCPUなどはそれぞれ異なっていれば、
バイナリファイルとしては当然まったく別のファイルになります。
そうなるとバイナリ差分の出番はありません。
画像などその他のファイルもバイナリ差分での配布が有効である状況はそんなにはないでしょう。
しかし、巨大なバイナリファイルで変更の差分が少々であることが判っているならば、
バイナリ差分を取って、それのみを変更先へ送りたいこともあるでしょう。
ライブアップデートを行うブラウザなどのプロダクトでは、
内部的にバイナリ差分を使っているものもあるようです。
Linuxにはバイナリ差分を取るコマンドとして、bsdiffがあります。
以下にUbuntuとCentOSにbsdiffコマンドをインストールする手順を記します。
ubuntuでは以下のようにapt-getでインストールすることができます。
# apt-get install bsdiff パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 以下のパッケージが新たにインストールされます: bsdiff アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 5 個。 12.6 kB のアーカイブを取得する必要があります。 この操作後に追加で 86.0 kB のディスク容量が消費されます。 取得:1 http://jp.archive.ubuntu.com/ubuntu/ precise/universe bsdiff i386 4.3-10ubuntu1 [12.6 kB] 12.6 kB を 0秒 で取得しました (29.0 kB/s) 以前に未選択のパッケージ bsdiff を選択しています。 (データベースを読み込んでいます ... 現在 136445 個のファイルとディレクトリがインストールされています。) (.../bsdiff_4.3-10ubuntu1_i386.deb から) bsdiff を展開しています... man-db のトリガを処理しています ... bsdiff (4.3-10ubuntu1) を設定しています ... #
CentOS5やCentOS6では、EPELにパッケージが存在しています。
EPELのレポジトリを登録していれば、yum installでインストールできます。
# yum install bsdiff Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: ftp.iij.ad.jp * epel: buaya.klas.or.id * extras: ftp.iij.ad.jp * updates: centos.ustc.edu.cn Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package bsdiff.x86_64 0:4.3-7.el6 will be installed --> Finished Dependency Resolution Dependencies Resolved =================================================================================================================================================== Package Arch Version Repository Size =================================================================================================================================================== Installing: bsdiff x86_64 4.3-7.el6 epel 13 k Transaction Summary =================================================================================================================================================== Install 1 Package(s) Total download size: 13 k Installed size: 21 k Is this ok [y/N]: y Downloading Packages: bsdiff-4.3-7.el6.x86_64.rpm | 13 kB 00:00 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : bsdiff-4.3-7.el6.x86_64 1/1 Verifying : bsdiff-4.3-7.el6.x86_64 1/1 Installed: bsdiff.x86_64 0:4.3-7.el6 Complete! #
以下にbsdiffの使用方法を記します。
バイナリ差分を作成するには、以下のようにファイルを引数として指定して、bsdiffを実行します。
% bsdiff 元のファイル 変更したファイル 差分ファイル
実行すると「元のファイル」から「変更したファイル」への差分を、
新しく「差分ファイル」を作ってそこに書き込みます。
実際に実行してみます。
# ls -l total 14792 -rw-r--r-- 1 root root 6923904 May 14 11:00 wd32_10_20_2631_en.exe -rw-r--r-- 1 root root 8219728 May 14 10:58 wd32_11_00_2749_en.exe # md5sum * 8b036e95fbdaebb19c1af5683216934d wd32_10_20_2631_en.exe bbbeadaa5ed085b48e79ad83c2156255 wd32_11_00_2749_en.exe # bsdiff wd32_10_20_2631_en.exe wd32_11_00_2749_en.exe wb10-11.bsdiff # ls -l total 20404 -rw-r--r-- 1 root root 5743167 Sep 5 17:37 wb10-11.bsdiff -rw-r--r-- 1 root root 6923904 May 14 11:00 wd32_10_20_2631_en.exe -rw-r--r-- 1 root root 8219728 May 14 10:58 wd32_11_00_2749_en.exe #
wb10-11.bsdiffが作成されたバイナリ差分です。
今回の差分ファイルのサイズは「元ファイル」や「変更したファイル」より、
かろうじて小さい程度ですが、これは当然ですが対象とするデータの差異に依存します。
また、差分作成はメモリを多く使用する重い処理です。
bsdiffのmanには「元ファイルの17倍のサイズのメモリが必要」などとあります。
バイナリ差分を適用するには、bspatchコマンドを使用します。
bspatchコマンドはbsdiffパッケージに同梱されています。
bspatchの使い方は以下の通りです。
% bsdiff 元のファイル 新しいファイル 差分ファイル
実行すると「元のファイル」に「差分ファイル」を適用した内容を、
新しく「新しいファイル」を作ってそこに書き込みます。
実際に実行してみます。
# bspatch wd32_10_20_2631_en.exe hoge.exe wb10-11.bsdiff # ls -l total 28432 -rw-r--r-- 1 root root 8219728 Sep 5 17:43 hoge.exe -rw-r--r-- 1 root root 5743167 Sep 5 17:37 wb10-11.bsdiff -rw-r--r-- 1 root root 6923904 May 14 11:00 wd32_10_20_2631_en.exe -rw-r--r-- 1 root root 8219728 May 14 10:58 wd32_11_00_2749_en.exe # md5sum * bbbeadaa5ed085b48e79ad83c2156255 hoge.exe c6cd07e6ca8864b8cf940bf5276c48b3 wb10-11.bsdiff 8b036e95fbdaebb19c1af5683216934d wd32_10_20_2631_en.exe bbbeadaa5ed085b48e79ad83c2156255 wd32_11_00_2749_en.exe #
hoge.exeが、「元のファイル」にバイナリ差分が適用された「新しいファイル」です。
差分の元となったwd32_11_00_2749_en.exeと同じファイルであることが、
md5sumのハッシュ値から確認できます。
バイナリ差分作成とは異なり、差分適用は重い処理ではありません。
バイナリ差分は利用するシチュエーションは限られますが、
場合によってはプログラムのバージョンアップや、
大容量データの更新などで、作業の手間や通信コストを削減できる可能性があります。
以上、Linuxでファイルのバイナリ差分を取得・適用する方法についてでした。