Linuxで七転八倒な記録


まず一言。Linux の HowTo に関するページは世の中たくさんあるから、ここを見るよりはそっちを見るのが賢明かと。まだまだ Linux を完全に理解してるわけじゃないから(^^;
それに「前あれってどうやったんだっけ?」とすぐ忘れる自分のための覚え書き的存在なので(笑)

← 前 BBS 次 →

2002年5月8日
更新かなりサボったので、ちょっとしたものは省略します。

○ Linux kernel 2.5.3 → 2.5.14 【関連】kernel 2.4.4
最初にビルドに使われるツール群を更新。

binutils-2.11.90.0.8-5 --> 2.12.90.0.7-1
e2fsprogs-1.18-15 --> 1.27-3

gcc もアップしておきたかったけど、面倒なので後回しにしておく。(後述
make menuconfig で適当にコンフィグをする。make bzImage すると、

ld -m elf_i386 -T /usr/src/linux-2.5.14/arch/i386/vmlinux.lds -e stext
 arch/i386/kernel/head.o arch/i386/kernel/init_task.o init/main.o init/version.o init/do_mounts.o \
        --start-group \
        arch/i386/kernel/kernel.o arch/i386/mm/mm.o kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o \
        /usr/src/linux-2.5.14/arch/i386/lib/lib.a /usr/src/linux-2.5.14/lib/lib.a
 /usr/src/linux-2.5.14/arch/i386/lib/lib.a \
         drivers/parport/driver.o drivers/base/base.o drivers/char/char.o drivers/block/block.o
 drivers/misc/misc.o drivers/net/net.o drivers/media/media.o
 drivers/char/agp/agp.o drivers/ide/idedriver.o drivers/cdrom/driver.o sound/sound.o
 drivers/pci/driver.o drivers/net/tulip/tulip_net.o drivers/pnp/pnp.o drivers/video/video.o \
        net/network.o \
        --end-group \
        -o vmlinux
arch/i386/kernel/kernel.o: In function `intel_thermal_interrupt':
arch/i386/kernel/kernel.o(.text+0x7c41): undefined reference to `ack_APIC_irq'
arch/i386/kernel/kernel.o: In function `intel_init_thermal':
arch/i386/kernel/kernel.o(.text.init+0x2d9c): undefined reference to `apic_read'
arch/i386/kernel/kernel.o(.text.init+0x2de3): undefined reference to `apic_write_around'
arch/i386/kernel/kernel.o(.text.init+0x2e03): undefined reference to `apic_read'
arch/i386/kernel/kernel.o(.text.init+0x2e13): undefined reference to `apic_write_around'
make: *** [vmlinux] エラー 1
とエラーになる。コンフィグオプションが良くないのかも。再度 make menuconfig して以下の項目を有効にしておく。デフォルトでは有効になっていたかもしれない、よく考えずにコンフィグを変えていたので。

Processor type and features
 + Local APIC support on uniprocessors --> Y
 + IO-APIC support on uniprocessors --> Y
設定を保存して再度 make dep、make bzImage。今度は問題なく出来た。後は問題なくビルド。リブートして無事カーネルのバージョンアップ完了。

○ gcc 2.96.96 → 3.1.0 【関連】-
rpm をダウンロードしてきて、一度アップテストをしてみる。依存性などの関係でそのまま通るとは思わないので。

# rpm -Uvh --test gcc-3.1-0.27.i386.rpm cpp-3.1-0.27.i386.rpm gdb-5.1.92-1.i386.rpm
  gcc-c++-3.1-0.27.i386.rpm gcc-objc-3.1-0.27.i386.rpm libobjc-3.1-0.27.i386.rpm
エラー: 依存性の欠如:
        rpmlib(PartialHardlinkSets) <= 4.0.4-1は gcc-3.1-0.27 に必要とされています
        rpmlib(PartialHardlinkSets) <= 4.0.4-1は gcc-c++-3.1-0.27 に必要とされています
予想通りチェックにひかかった。rpmlib というパッケージはないから、rpm をアップグレードすればいいのだろう、と判断。このあたり実は手探りだったりする。rpm とアップグレードするときに依存性チェックでひかかるいくつかのパッケージも同時にアップグレードしてあげる。
# su
$ rpm -Uvh rpm-4.0.4-7x.i386.rpm rpm-devel-4.0.4-7x.i386.rpm rpm-build-4.0.4-7x.i386.rpm
  rpmfind-1.7-4.7x.i386.rpm rpm2html-1.7-3.7x.i386.rpm rpm-python-4.0.4-7x.i386.rpm
  gnorpm-0.96-12.7x.i386.rpm popt-1.6.4-7x.i386.rpm kpackage-1.3.10-8.i386.rpm
その後、もう一度 gcc のアップグレードを試してみる。
$ rpm -Uvh gcc-3.1-0.27.i386.rpm cpp-3.1-0.27.i386.rpm gdb-5.1.92-1.i386.rpm
  gcc-c++-3.1-0.27.i386.rpm gcc-objc-3.1-0.27.i386.rpm libobjc-3.1-0.27.i386.rpm
Preparing...                ########################################### [100%]
   1:libobjc                ########################################### [ 16%]
   2:cpp                    ########################################### [ 33%]
   3:gcc                    ########################################### [ 50%]
   4:gdb                    ########################################### [ 66%]
   5:gcc-c++                ########################################### [ 83%]
   6:gcc-objc               ########################################### [100%]
無事アップグレード完了。

○ GD 1.6.2? → 2.0.1 【関連】PHP 4.0.8
一週間くらい前の内容なんで間違った内容や必要な手順が抜け落ちてるかもしれないです。前から興味のあった PHP から gd を使ってみました。それで、ImageTTFText関数を使ったサンプルを作ってみると、

Warning: libgd was not built with TrueType font support in /var/www/html/result.php on line 56
どうやら組み込まれている gd ライブラリが TrueType フォントをサポートしてないらしい。他にも、ImageFilledArc 関数を使おうとすると関数が定義されていない、とエラーがでる。ドキュメントに目を通してみると GD 2.0.1 が必要とのこと。phpinfo でバージョンをチェックしてみると、

gd

GD Supportenabled
GD Version1.6.2 or higher
FreeType Supportenabled
FreeType Linkagewith freetype
JPG Supportenabled
PNG Supportenabled
WBMP Supportenabled

と古いバージョンみたいなので、バージョンアップしておこう。

まず、gd をバージョンアップ。RedHat で使える 2.0 の rpm パッケージが見つからなかったので、自前で rpm をビルドする。まず、1.8.4 のソースrpm を拾ってきて、インストール。gd-2.0.1.tar.gz も拾ってきて適当な場所に解凍。

# rpm -ivh gd-1.8.4-4.src.rpm
# cp gd-2.0.1.tar.gz ~/sources/ # 適当なディレクトリとして ~/sources/ を使う
# cd ~/sources/
# tar xzf gd-2.0.1.tar.gz
1.8.4 の redhat.patch を参考にして 2.0.1 用の redhat.patch を作成。まず作業用のディレクトリを作っておいて、ファイルをコピー、その後編集をする。

# cd ~/work
# mkdir gd-2.0.1
# cp ~/sources/gd-2.0.1/Makefile gd-2.0.1/ # 作業用ディレクトリにオリジナルの Makefile をコピー
# cp gd-2.0.1 gd-2.0.1.new # 更新用ディレクトリとして gd-2.0.1.new を用意
# vi gd-2.0.1.new/Makefile
オプションに -DHAVE_LIBFREETYPE -DJISX0208 -DHAVE_ICONV -DHAVE_STDARG_H -DHAVE_ERRNO_H を追加しておく。HAVE_LIBFREETYPE をつけることで TrueType フォントも使えるようになる。JISX0208 は通常 Unicode で文字列データを渡すのをシフトJIS や EUC でも通るようにする。HAVE_STDARG_H、HAVE_ERRNO_H はエラーが発生したときにメッセージが出力されるようになる。あまりじっくり調べこんでないので、実際は意味が違うかもしれません。セーブ後、パッチファイルを作成。RPMのソースディレクトリに tar.gz と共にコピーしておく。うちの場合は ~/RPMS/ をRPMの BuildRoot に設定してあるので、各自の環境にあわせて読みかえて下さい。

# diff -uN gd-2.0.1/Makefile gd-2.0.1.new/Makefile > gd-2.0.1-redhat.patch
# cp gd-2.0.1-redhat.patch ~/RPMS/SOURCES/ # (RPM_BUILD_ROOT)/SOURCES/ にコピー
# cp ~/sources/gd-2.0.1.tar.gz ~/RPMS/SOURCES/ # tar.gz もコピー
次に、1.8.4 の spec を 2.0.1 用に編集して保存。バイナリRPM を作成する。うまくビルド出来たらインストール。アップグレードすると依存性チェックが厄介なことになったので -i でインストールしてごまかす。1.8.4 とファイルが競合しないので問題はないかと思う。

# cd ~/RPMS/SPECS
# vi gd.spec # spec ファイルを編集
# rpm -bb gd.spec # gd-2.0.1-1 として RPM をビルド
# cd ../RPMS/i386/
# su
$ rpm -ivh gd-2.0.1-1.i386.rpm # ビルドした RPM をインストール
$ rpm -Uvh gd-devel-2.0.1-1.i386.rpm gd-progs-2.0.1-1.i386.rpm
GD がバージョンアップ出来たところで、PHP のほうもビルドしなおす。spec ファイルの configure に --enable-gd-native-ttf を追加しておく。これもなくても良いかもしれない。うちのマシンはそれほど処理速度が速くないのでこのビルドにはかなり時間がかかる。しかも、ディスクフルになってビルドし直す羽目に・・・

# cd ~/RPMS/SPECS
# vi php.spec # spec ファイルを編集
# rpm -bb php.spec
# cd ../RPMS/i386/
# su
$ rpm -Uvh php-*4.0.6-12.i386.rpm # ビルドした RPM をインストール
$ /sbin/service httpd restart # Apache を再起動して PHP をロードしなおす
phpinfo でバージョンを確認しておこう。

gd

GD Supportenabled
GD Version2.0 or higher
FreeType Supportenabled
FreeType Linkagewith freetype
JPG Supportenabled
PNG Supportenabled
WBMP Supportenabled

大丈夫なよう。早速サンプルコードを試してみる。

## gdsample.php ##
<?php

mb_http_output("SJIS");

// イメージの作成
$font = "/usr/share/fonts/ja/TrueType/kochi-gothic.ttf";

$im = ImageCreate(170, 110);
$white = ImageColorAllocate($im, 255, 251, 249);
$blue = ImageColorAllocate($im, 120, 130, 250);

ImageFilledArc($im, 85, 55, 150, 90, 0, 360, $blue, IMG_ARC_PIE);
ImageTTFText($im, 24, 0, 20, 62,$white, $font, "サンプル");

// PNG書き出し
ImagePng($im, "images/sample.png");
ImageDestroy($im);

?>

<html>
<head>
<title>GD 2.0 テスト</title>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
</head>
<body>
<img src="images/sample.png" width="170" height="110" alt="GD 2.0 テスト">
</body>
</html>
ブラウザで見ると、
GD 2.0 テスト
このようにちゃんと表示できました。

← 前 BBS 次 →

△戻る ▲トップに戻る