FreeBSD Daily Topics

2011年6月2日Adobe Reader 9、カーネルモジュール使いFreeBSDで動作

ports

Adobe Reader 9

PDFを閲覧するアプリケーションはいくつかあります。動作の軽量さから選ぶならAdobe Readerよりも他のアプリケーションを選んだほうが良いと言えます。しかしながら、Adobe Readerでなければ実装されていない機能などもあり、Adobe Readerを動かす必要があるシーンがあることもまた事実です。

Ports Collectionに登録されているAdobe Readerの最新版はAdobe Reader 9(japanese/acroread9、print/acroread9、print/acroreadwrapper)です。これまでAdobe Reader 9はデフォルトのFreeBSDカーネルでは動作しませんでした。Ports Collectionに登録されているAdobe ReaderはLinux向けに提供されているものです。Linuxバイナリ互換機能で動作させているわけですが、スケジューリングに関する処理でLinuxカーネルとFreeBSDカーネルで処理に違いがあり、この点がトリガになってAdobe Reader 9は起動してもすぐにクラッシュしていました。

問題を解決する方法はいくつかあります。FreeBSDカーネルで該当部分の処理を変更してやればよいのですが、これは仕組み的に考えて、本体にマージさせるのがかなり困難と言えます。機能を適用するアプリケーションを限定しsysctl(8)から制御できるようにするなどそれらしい次善策を加えることもできますが、こうしたパッチをカーネルにマージさせるのは困難でしょう。

こうした問題を解決してAdobe Reader 9を動作させる機能が最新のport(print/acroreadwrapper、japanese/acroread9、print/acroread9)に追加されました。ja-acroread9-9.4.2が該当します。

図1 Adobe Reader 9 on FreeBSD kernel
図1 Adobe Reader 9 on FreeBSD kernel

Adobe Reader 9を動作させるアイデアそのものは、先ほど説明したように問題となる部分に変更を加え、さらに適用する対象をAdobe Readerに限定するというものです。ポイントはその対応をカーネルに直接マージするのではなく、カーネルモジュールで実現した点にあります。print/acroreadwrapperをインストールするとlinux_adobe.ko (/usr/local/libexec/linux_adobe/linux_adobe.ko)というカーネルモジュールがインストールされます。このモジュールが先ほど説明したのと同じ方法で、Adobe Reader 9が実行された場合に該当する回避処理を実施するようになります。

システム起動時にlinux_adobeカーネルモジュールが読み込まれるように/etc/rc.confまたは/etc/rc.conf.localに次の設定を追加します。

リスト /etc/rc.confまたは/etc/rc.conf.localに追加する設定
linux_adobe_enable="YES"

システムを再起動するか、次のようにservice(8)コマンドを使ってlinux_adobeカーネルモジュールを読み込みます。

linux_adobeカーネルモジュールを手動で読み込む方法
service linux_adobe start

linux_adobeカーネルモジュールが読み込まれているかどうかは、次のようにkldstat(8)コマンドで確認できます。

kldstat(8)コマンドでlinux_adobeカーネルモジュールが読み込まれているかどうか確認
% kldstat | grep linux_adobe
16    1 0xffffffff8239c000 25e      linux_adobe.ko
%

Adobe Reader 9日本語版(japanese/acroread9)をインストールすればprint/acroreadwrapperも依存関係から自動的にインストールされます。システムに合わせてカーネルモジュールをビルドするため、print/acroreadwrapperのインストールにはカーネルのソースコードが必要です。/usr/src/にソースコードを展開しておいてください。

今回の手法は、FreeBSDでさらに多くのLinuxアプリケーションを動作させるためのテクニックとして参考になります。カーネルに手を加える必要があるようなケースでも、アプリケーション側からカーネルモジュールを提供することで動作できるようになるためです。カーネルにパッチをマージするのはヘビーなことですが、Ports Collectionにカーネルモジュールビルドを追加することはさほど難しくありません。

注意:これまでAdobe Reader 9を使っていて不便に感じることはありませんでしたが、Adobe Reader 9が要求するLinuxカーネルのうちいくつかがFreeBSDカーネルには存在していないため、利用できないシーンがあることがわかっています。Adobe Reader 9のフルフィーチャーを利用するには、まず該当する機能をFreeBSDカーネルに実装する必要があります。

おすすめ記事

記事・ニュース一覧