巨大なバイナリ・ファイルをlfhexで編集・比較する

 多くのバイナリ・エディタは、編集を始める前にファイル全体をメモリにコピーしようとする。そのため、表示または編集できるファイルのサイズがメモリ・サイズによって制限される。 lfhex は、コンピュータのメモリに入りきらない大きさのバイナリ・ファイルを編集するために設計されたエディタである。

lfhex_thumb.png
lfhex

 メモリよりも大きなバイナリ・ファイルを操作することは通常はないだろうが、万が一の場合にバイナリ・エディタがそのような大きなファイルに対応できるとわかっていれば安心だ。lfhexは、大量のメモリを必要とせずに巨大なファイルを速やかに読み込むことができる。たとえば、lfhexのマニュアルによれば、2GBのファイルを読み込むために必要なメモリは2MB未満である。

 Ubuntu、openSUSE、またはFedoraには、lfhexのパッケージが提供されていない。この記事を書くにあたって、64ビット版Fedora 8マシンでバージョン0.4のソースからlfhexをビルドした。このビルドには、qmake、makeの手順を使用する。qmakeの実行可能ファイルは、Qt 3.xではなくQt 4のものが必要だ。どのqmakeが実行されるか確認するには、「type -all qmake」を実行してbashに認識されるqmake実行可能ファイルを表示するのが一番簡単である。

 以下の手順では、デフォルトであればQt 3.xのqmakeが実行されるため、Qt 4のqmake実行可能ファイルへの完全なパスを使用して、強制的に正しいQtバージョンをビルドに使用した。”install”ターゲットは見つからなかったが、lfhexバイナリを/usr/local/binにコピーすることで、インストールの最終ステップは完了した。

$ type -all qmake
qmake is /usr/lib64/qt-3.3/bin/qmake
$ /usr/lib64/qt4/bin/qmake lfhex.pro
$ make
$ su -l
# cp lfhex /usr/local/bin/

 lfhexの表示は、バイナリ、8進数、16進数、またはASCIIに切り替えが可能だ。列ごとのバイト数も調整できる。また、複数レベルのundoとredoの機能がある。多数のバイナリ・ファイルを部分的に比較するために、多数のエディタ・ウィンドウを同時に開くことができる。

大きなファイルの編集パフォーマンス

 大きなファイルを使ってlfhexをテストするために、3.7GBのFedora-8-x86_64-DVD.isoファイルを、2GBのRAMがありスワップ・ファイルを使用しない仮想マシンで開いてみた。lfhexには、ほとんど瞬時にファイルが開かれた。スクロールバーを使ってISOファイル内を前後に滞りなく移動することができ、バイナリ・オフセットを使ったシークも高速に行うことができた。Fedora ISOファイルを開いている間、gnome-system-monitorには、lfhexが170MBの仮想メモリ、18.5MBの常駐メモリ、10.6MBの書き込み可能メモリ、8MBの共有メモリを消費していると表示された。

 残念ながら、現在の0.4バージョンのlfhexでは比較モードが無効になっている。0.4が初めてQt 4を使用するバージョンであるからのようだ。比較の機能はまだQt 4に移植されていない。Qt 3.xを使用するバージョン(0.3.7.2)は、大きなファイルのバイナリ比較がサポートされている。このバージョンを試す場合は、標準の「./configure; make; sudo make install」の手順でバージョン0.3.7.2をコンパイルし、インストールできる。

$ wget http://stoopidsimple.com/files/lfhex-0.3.7.2.tar.gz
$ ./configure
$ make
$ cp /usr/local/bin/lfhex /tmp/lfhex
$ cp /usr/local/bin/lfhex /tmp/lfhex.2
$ dd if=/dev/urandom of=/tmp/lfhex.2 bs=100 count=1 seek=24 conv=notrunc
$ ./bin/lfhex -c /tmp/lfhex /tmp/lfhex.2

 バイナリを比較するときのナビゲーションの速さをテストするため、同じ内容の100MBのファイルを2つ作成し、一方のファイルの先頭から24KBの位置にある1KBのデータ・ブロックだけ内容を変えておいた。

$ cd /tmp
$ dd if=/dev/urandom of=test1 bs=1024 count=102400
$ cp test1 test2
$ dd if=/dev/urandom of=test2 bs=1024 count=1 seek=24 conv=notrunc

 Intel Core 2 Quad Q6600 CPUの2つのコアで動作する仮想マシンで最初の変更の出現を検索したところ、lfhexは瞬時にその場所を検出した。ファイルの先頭から近い場所にあるため、予想どおりの結果である。一方、最後の変更の出現については、検索がファイルの末尾から開始されるため、変更箇所が見つかるまで10秒ほどかかった。100MB近いデータをファイルの先頭に向かって検索しなければならなかったためだ。

 lfhexには、挿入や削除の機能がない。大きな弱点である。この機能が実装されたら、たとえ処理速度に相応のペナルティが生じ、変更を取り消すこともできないとしても、バイナリ・ファイルの汎用的な編集にさらに便利なエディタになるだろう。また、設定を保存する機能があればなお良い。lfhexを開くたびに表示を8バイト単位に変更しなければならないのは、すぐにうんざりするだろう。

 とはいえ、巨大なバイナリ・ファイルを調べる必要がある場合にlfhexは検討に値する。ファイルを開いたときの読み込みの速さと待ち時間のない検索は、素晴らしい機能である。

Ben Martinは10年以上もファイルシステムに携わっている。博士号を取得し、libferris、ファイルシステム、検索ソリューションを中心としたコンサルティングサービスを提供している。

Linux.com 原文