Matthewの備忘録

忘れたときはここを見ろ。何か書いてある。

Ubuntu上でのLXR 0.9.xの用意のしかた

Ubuntu上でのLXR 0.9.xのインストールと使い方は幾つか見つかるが、自分用のドキュメントを揃えておく。ターンアラウンド的なところがあるが(苦笑)。

必須パッケージのインストール

apt-getかaptitudeで次のパッケージをインストールする:

上記の他にも必要なものがあるかもしれないが、臨機応変、適宜パッケージをインストールすればよい。

LXRをgitリポジトリからインストール

他のドキュメント同様に/usr/shareにインストールしたい場合は次のように行う:

$ cd /usr/share
$ sudo git-clone git://lxr.linux.no/git/lxrng.git
$ sudo chown -R ソースツリーのオーナー /usr/share/lxrng

/usr/share/lxrngにLXRがインストールされる。ソースツリーのオーナーは適切なオーナーにする。デスクトップで自分ひとりでしかつかわないのであれば、ログインしているユーザーで構わないだろう。オーナーにしなくてもアクセス権限があればよいが、それは自分のシステム・環境に合わせて構築すればよい。

データベースの用意

データベースを作成したのち、ソースファイルツリーのオーナーとUbuntuのapache2ユーザー(www-data)をデータベース上に設ける。Ubuntuの場合はPostgreSQLパッケージをインストールするとpostgresユーザが用意されているので、postgresユーザで作成する。

$ su postgres
$ createdb lxrng
$ createuser ソースファイルツリーのオーナー
$ createuser www-data

各種の権限を与えるかどうかの質問がされるが、とりあえずは必要ないので、すべてnで答えてよい。

因みにデータベースをまるごと削除して作り直す時は、

$ sudo -u postgres dropdb lxrng && sudo -u postgres createdb lxrng

とすればよい。一応lxr-db-adminというコマンドが用意されていて、

$ ./lxr-db-admin --drop && ./lxr-db-admin --init

を実行しても同じである。但し、後述するLXRコンフィギュレーションファイルでユーザとパスワードの設定、そしてそのユーザにデータベースを削除できるスーパーユーザーなどの権限が与えられていなければならない。

ソースコードツリーを用意

ダウンロードしてきたソースツリーでも、gitで取得してきたリポジトリでもどちらでも可能。

ダウンロードしてきたソースツリーを利用する場合

ソースツリー置き場は適切に設定できるならばどのディレクトリでもよいが、/usr/src/lxrをソース置き場にする。とりあえず、/usr/src/lxrのオーナーをソースツリーのオーナーとすればよい。今そのオーナーをmatthewとすると、次のようにすればよい。

matthew$ sudo mkdir -p /usr/src/lxr
matthew$ sudo chown matthew /usr/src/lxr
matthew$ mkdir /usr/src/lxr/linux-2.6
matthew$ cp -a linux-2.6.x1.y1 /usr/src/lxr/linux-2.6/v2.6.x1.y1

ソースツリーのトップディレクトリをv2.6.x1.y1のように先頭に小文字のvを付け、その後にバージョン番号をつけておくと何かと都合がよいので、そうしておくべきである(本家LXRの使い方がそうであるから)。

複数のソースの場合は、上記の場合、/usr/src/lxr/linux-2.6にv2.6.x2.y2としてどんどん置いておけばよいだけである。

$ ls /usr/src/lxr/linux-2.6
v2.6.28.3 v2.6.28.4 v2.6.28.5
gitリポジトリの場合

例えば、/var/lib/lxrng/repos以下にソースツリーを置きたい場合は、gitでソースツリーとってくるだけである。

Linusのgitリポジトリの場合:

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git linux-2.6

James Morrisのセキュリティ関連リポジトリの場合:

$ git clone git://git2.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6.git security-testing-2.6

"git clone git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6"でいいかもしれない。

/var/lib/lxrng/reposを例として使っているのはLXRが配っているコンフィギュレーションファイルのデフォルト値だからである。

*** security-testing-2.6のTOMOYO Linuxのソースが見たい場合

jmorris/security-testing-2.6.gitを取得後、次を実行:

$ git checkout --track -b my-next origin/next

(でも、LXRでどうなるか、まだためしてません(汗))

キャッシュディレクトリの用意

レスポンスを欲するためのキャッシュだろうか(要確認)。キャッシュディレクトリを用意しておく。システムや環境に合わせてパーミッションを設定すればよいが、ソースツリーオーナーとwww-data(LXRCGI/Perlモジュールを動かすときのユーザー、apache2の実行ユーザー)が読み書き出きるようにしておけばよいだろう。

$ sudo mkdir -p /var/lib/lxrng/cache
$ sudo chmod -R a+rw /var/lib/lxrng

これもLXRコンフィギュレーションファイルのデフォルトが/var/lib/lxrng/cacheなので、そうしているまでである。

ペンギン画像の用意

makeを実行すればよい。

$ make -C /usr/share/lxrng/webroot/.static/gfx

これを作るのに、inkscapeなどがインストールされているのだ。

コンフィギュレーションファイルを編集

lxrng.conf-distというファイルをlxrng.confという名前のファイルでコピーして、システム・環境に応じて編集する。

因みに、ユーザーとパスワードは指定しなくてもLXRを構築し運用できるが、厳純に管理したい場合は設定すればよい。

gitではなくダウンロードしてきたソースツリーを使う場合

コメント「#変更*」がある行だけを変更すればよいが、ソースディレクトリやキャッシュディレクトリを変更した場合は適宜変更すること。変更した箇所をまとめると

  • GitからPlainへ
  • ベースとなるURL
  • デフォルトで表示するバージョン

を指定すればよいだけである。

# -*- mode: perl -*-
# Configuration file
#
# 

use LXRng::Index::PgBatch;
use LXRng::Repo::Plain; #変更:GitからPlainへ
use LXRng::Search::Xapian;

my $gitrepo = LXRng::Repo::Plain->
      new('/usr/src/lxr/linux-2.6'); #変更:GitからPlainへ

my $index   = LXRng::Index::PgBatch->new(db_spec => 'dbname=lxrng;port=5432', 
					 db_user => "", db_pass => "",
					 # table_prefix => 'lxr'
					 );
my $search  = LXRng::Search::Xapian->new('/var/lib/lxrng/text-db/linux-2.6');

return {
    'linux' => {
	'repository'  => $gitrepo,
	'index'       => $index,
	'search'      => $search,

	'base_url'    => 'http://localhost/lxr', #変更
	# Must be writable by httpd user:
	'cache'	      => '/var/lib/lxrng/cache',

	'fs_charset'  => 'iso-8859-1',
	'content_charset' => 'iso-8859-1',

	'languages'   => ['C'],
	'ver_list'    => [$gitrepo->allversions],

	'ver_default' => 'v2.6.28.4', #変更:デフォルトを指定

	'include_maps' => 
	    [
	     [qr|^arch/(.*?)/|, qr|^asm/(.*)|,
	      sub { "include/asm-$_[0]/$_[1]" }],
	     [qr|^include/asm-(.*?)/|, qr|^asm/(.*)|,
	      sub { "include/asm-$_[0]/$_[1]" }],
	     [qr|^|, qr|^asm/(.*)|,
	      sub { map { "include/asm-$_/$_[0]" }
		    qw(i386 alpha arm ia64 m68k mips mips64),
		    qw(ppc s390 sh sparc sparc64 x86_64) }],
	     [qr|^|, qr|(.*)|,
	      sub { "include/$_[0]" }],
	     ],
    },
};
gitを使っている場合

配られているコンフィギュレーションファイルはgit利用をデフォルトとしているので、変更する箇所はベースURLとデフォルト表示バージョンだけである。

# -*- mode: perl -*-
# Configuration file
#
# 

use LXRng::Index::PgBatch;
use LXRng::Repo::Git;
use LXRng::Search::Xapian;

my $gitrepo = LXRng::Repo::Git
    ->new('/var/lib/lxrng/repos/linux-2.6/.git',
	  release_re => qr/^v[^-]*$/,
	  author_timestamp => 0);


my $index   = LXRng::Index::PgBatch->new(db_spec => 'dbname=lxrng;port=5432', 
					 db_user => "", db_pass => "",
					 # table_prefix => 'lxr'
					 );
my $search  = LXRng::Search::Xapian->new('/var/lib/lxrng/text-db/linux-2.6');

return {
    'linux' => {
	'repository'  => $gitrepo,
	'index'       => $index,
	'search'      => $search,

	'base_url'    => 'http://localhost/lxr', #変更
	# Must be writable by httpd user:
	'cache'	      => '/var/lib/lxrng/cache',

	'fs_charset'  => 'iso-8859-1',
	'content_charset' => 'iso-8859-1',

	'languages'   => ['C'],
	'ver_list'    => [$gitrepo->allversions],

	'ver_default' => 'v2.6.28.4', #変更:デフォルトを指定

	'include_maps' => 
	    [
	     [qr|^arch/(.*?)/|, qr|^asm/(.*)|,
	      sub { "include/asm-$_[0]/$_[1]" }],
	     [qr|^include/asm-(.*?)/|, qr|^asm/(.*)|,
	      sub { "include/asm-$_[0]/$_[1]" }],
	     [qr|^|, qr|^asm/(.*)|,
	      sub { map { "include/asm-$_/$_[0]" }
		    qw(i386 alpha arm ia64 m68k mips mips64),
		    qw(ppc s390 sh sparc sparc64 x86_64) }],
	     [qr|^|, qr|(.*)|,
	      sub { "include/$_[0]" }],
	     ],
    },
};

インデックス作成

データベースに初めてインデックスを作成するときだけ、データベースにテーブルを作成するため、次を実行しておく。

$ ./lxr-db-admin コンフィギュレーションファイルで設定したプロジェクト --init

コンフィギュレーションファイルで設定したプロジェクト」とあるのは、コンフィギュレーションファイルのreturnの次の行にある"linux"のことである。実際には次のように指定する。

$ ./lxr-db-admin linux --init

次に、ソースコードツリーすべてに対してインデックスを作成する。

$ ./lxr-genxref linux

結構時間がかかるが、待つ。初めて行う場合は1時間以上かかるかも。

Apacheの用意

筆者の場合はmod_perlを利用するようにしているので、その設定を例として挙げる。システムや環境にあわせて適切に設定すればよい。

apache2-site.conf-dist-mod_perlが配布されているので、これを利用する。このファイル中の次の文字列を変更するだけでよい。

PerlInitHandler Apache2::Reload
PerlOptions +GlobalRequest
PerlRequire /usr/share/lxrng/lxrng_mod_perl.pl
PerlModule LXRng::ModPerl

Alias /lxr "/usr/share/lxrng/webroot/"

<Directory "/usr/share/lxrng/webroot/">
  Options ExecCGI
  AllowOverride None
  Order deny,allow
  Allow from all

  <Files *>
    SetHandler perl-script
    PerlResponseHandler LXRng::ModPerl
  </Files>

  <Files favicon.ico>
    SetHandler send-as-is
  </Files>

  <Files robots.txt>
    SetHandler send-as-is
  </Files>
</Directory>

<Directory "/usr/share/lxrng/webroot/.static/">
  <Files *>
    SetHandler send-as-is
  </Files>
</Directory>

編集後、apache2のサイト設定ディレクトリにコピーし、使えるようにしておく。

$ sudo cp apache2-site.conf-dist-mod_perl /etc/apache2/sites-available/lxrng
$ sudo a2ensite lxrng

あとは、apache2をreloadするなりrestartするなりすれば、ベースURLで指定したURLにアクセスするだけである。

更新

ダウンロードしたソースツリーを増やす場合

例えば、次のようにパッチをあてて、ソースツリーを増やし、インデックスを作成するコマンドを実行するだけである。

前のバージョンのソースツリーをコピーしておく

$ cp -a v2.6.28.4 v2.6.28.5

パッチを用意

$ cd v2.6.28.5
$ bzip2 -d /home/matthew/downloads/patch-2.6.28.4-5.bz2 -c > patch
$ patch -p1 <patch
$ rm patch

lxrng.confのデフォルトバージョンを変更しておく。この値はブラウザでLXRが参照されるとき、常に読み込まれる値であるので、好きな時に変更すればよい。

 'ver_default' => 'v2.6.28.4',

最後に

$ ./lxr-genxref linux

などとしてインデックス作成すればよい。

gitの場合

gitのディレクトリでリポジトリの更新を行い、インデックスを作成すればよい(未確認)。おそらくタグごとに作成されるだろう。

$ cd .gitのあるところ
$ git checkout master
$ git pull

最後に

$ ./lxr-genxref linux
apache稼働中にデータベースを作り直す場合

もっと良い方法があると思うけど(あとから調査)、apache2-postgresql間の接続を停止させてから行う。面倒くさくて、ひとりで使っている場合はapache2を止めて、drop/createを行ってもよいだろう。

いらなくなったソースツリーはどうしたらよいか

gitではなくソースをダウンロードして用意した場合は、ディレクトリを削除すればよい。デフォルトディレクトリを変更するのをわすれずに。おかしくなったら、apache2を再起動してみたらよい。

gitの場合はどうする?(あとで)。

インデックス作成中のエラー

インデックス作成中に

Use of uninitialized value in numeric gt (>) at ./lxr-genxref line 233.

というメッセージがでるときがある。いまのところきにしないでおく(笑)。

応用

複数のLXRを簡単に管理したい

ソースの置き場所は異なるのは必然として、コンフィギュレーションファイルの「ハッシュ」内容を増やせばいくつも管理できそうな感じだが、lib/LXRng/Context.pm中で読み込んだコンフィギュレーションファイルのハッシュのうち最初の([0])しか読まないので、改造が必要であるが、それをするぐらいなら、LXR自体をgitで複数インストールしたほうが良いだろう。LinusとJames Morrisの二つ用意したいとかいろいろできるはずだ。


参考: