このエントリーをはてなブックマークに追加


Linux環境でファイルのバイナリ差分を作成・適用する(bsdiff)

バイナリ差分の作成や適用できるbsdiffを紹介します。


関連記事

バイナリ差分とは

Linuxではファイルの差分というのは、
一般的にdiffコマンドによる2つのテキストファイルの差異を抽出したものを指します。
これはパッチファイルとも呼ばれます。

差分ファイルのよくある利用方法としては、
ソフトウェアのソースコードから変更した部分のみを取り出し、
別の場所にある古いバージョンのソースコードに対して、
patchコマンドを使ってその変更部分を反映したりします。

テキスト以外のファイル、つまり実行プログラムファイルや画像・音声・動画ファイル、
アーカイブファイルなど、バイナリファイルの差分を取ることはあまり行われません。

これは元々UNIX(Linux)の世界では、ソフトウェアはソースコードを手元の環境で
コンパイルして実行ファイルを作ることが普通だったためです。
たとえ同じソフトウェアを動かしていても、OSやCPUなどはそれぞれ異なっていれば、
バイナリファイルとしては当然まったく別のファイルになります。
そうなるとバイナリ差分の出番はありません。
画像などその他のファイルもバイナリ差分での配布が有効である状況はそんなにはないでしょう。

しかし、巨大なバイナリファイルで変更の差分が少々であることが判っているならば、
バイナリ差分を取って、それのみを変更先へ送りたいこともあるでしょう。
ライブアップデートを行うブラウザなどのプロダクトでは、
内部的にバイナリ差分を使っているものもあるようです。

Linuxにはバイナリ差分を取るコマンドとして、bsdiffがあります。

bsdiffのインストール

以下にUbuntuとCentOSにbsdiffコマンドをインストールする手順を記します。

ubuntu

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) を設定しています ...
#

CentOS

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を実行します。

% 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でファイルのバイナリ差分を取得・適用する方法についてでした。



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-03-20 (金) 22:27:42