【問題】
Oracle 8.1.7 for Linuxが Redhat Enterprise Linux 3 にインストールできない。

【解決策と解説】
(1)
http://rpm.pbone.net/ から compat-glibc-6.2-2.1.3.2.i386.rpm をダウンロードし、
root> rpm -ivh compat-glibc-6.2-2.1.3.2.i386.rpm
でインストールする。

http://rpm.pbone.net/ から compat-gcc-7.3-2.96.122.i386.rpm をダウンロードし、
root> rpm -ivh compat-gcc-7.3-2.96.110.i386.rpm
でインストールする。

(解説)
Oracle for Linuxはインストール時に、オブジェクトのリンクを行います。
Oracleでコンパイルされたオブジェクトは、
glibc2.1以下のランタイム、gcc2.96以下のランタイムをリンクしようとしますが、
Redhat Enterprise Linux 3の glibcは 2.3.2、gccは 3.2.3で、
互換性がないので、インストール時にエラーになります
そこで、glibc2.1とgcc2.96の下位互換パッケージが必要になります。

(2)
compat-glibc-6.2-2.1.3.2.i386.rpmをインストールすると、
/usr/i386-glibc21-linuxというディレクトリができるが以下の操作をする。
root> mkdir /usr/i386-glibc21-linux/lib/gcc-lib
root> cd /usr/lib/gcc-lib
root> cp -r -p i386-redhat-linux7 /usr/i386-glibc21-linux/lib/gcc-lib
root> mv i386-redhat-linux7 i386-redhat-linux7.bak
root> ln -s  /usr/i386-glibc21-linux/lib/gcc-lib/i386-redhat-linux7 i386-redhat-linux7

(解説)
下位互換パッケージを使っても 以下のランタイムオブジェクトをリンクしようとします。
/usr/lib/gcc-lib/i386-redhat-linux7/2.96/../../../crt1.o
下位互換パッケージを入れた状態では、これは、/usr/lib/crt1.o となり、
下位互換パッケージの crt1.o でなく、Enterprise Linux 3の crt1.o となり、
エラーになってしまいます。上記操作を行うと、
/usr/lib/gcc-lib/i386-redhat-linux7/2.96/../../../crt1.o
が下位互換パッケージの crt1.o を参照するようになります。

(3)
以下でOracle用のグループとユーザーと作成します。
root> groupadd oinstall
root> groupadd dba
root> useradd oracle -g oinstall -G dba
root> passwd orace
New password: ********
Retype new password: ********

Oracleインストールユーザー用の環境変数を設定します。
oracle> vi .bash_profile

ORACLE_HOME=/home/oracle/OraHome1
NLS_LANG=japanese_japan.ja16euc
ORACLE_SID=ORCL
export ORACLE_HOME
export NLS_LANG
export ORACLE_SID

LD_LIBRARY_PATH=$ORACLE_HOME/lib
PATH=$HOME/bin:$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH
export PATH

LD_ASSUME_KERNEL=2.2.5
export LD_ASSUME_KERNEL

(解説)
Oracle 8.1.7のインストーラーは、jre1.1.8を使っていて、
このjreが glibc21以下のランタイムを要求しますが、
Enterprise Linux 3のデフォルトではこれがロードできなくてエラーになります。
LD_ASSUME_KERNEL=2.2.5
の設定があると、glibc21以下のランタイムが使えるようになります。

(4)
oracle> mkdir bin
oracle> cd bin
oracle> ln -s /usr/bin/gcc296 gcc
oracle> vi ld
echo /usr/bin/ld -m elf_i386 -L/usr/i386-glibc21-linux/lib $*
/usr/bin/ld -m elf_i386 -L/usr/i386-glibc21-linux/lib $*
oracle> chmod ugo+x ld

(解説)
Oracleのインストーラーは、オブジェクトのリンク時に、
gccコマンド、ldコマンドを使いますが、
Enterprise Linux 3のデフォルトでは上位互換がなくてエラーになります。
そこで PATH=$HOME/bin:$ORACLE_HOME/bin:$PATH として
$HOME/binが優先されるようにし、
上記操作で、ほとんどの場合、下位互換 gccコマンド、下位互換 ldコマンドが
実行されるようになります。

(5)
oracle> export LANG=C
oracle> cd /mnt/cdrom/install/linux
oracle> ./runInstaller

(解説)
Linuxが日本語環境だと、
Oracleのインストーラーが特定の日本語フォントを要求しますが、
Enterprise Linux 3のデフォルトではこれが見つからなくてエラーになります。
LANG=C
の設定があると、Oracleのインストーラーが正常に立ち上がるようになります。

(6)
インストール中、
UNIX Groupには dba を入れる。

途中、rootで $ORACLE_HOME/orainstRoot.sh の実行を要求されるので実行する。
root> cd $ORACLE_HOME
root> ./orainstRoot.sh

言語選択で Japanese を追加する。

Databaseを作成: No

(解説)
Database作成を Yesにすると、インストール中にDatabaseを作成しようとしますが、
このプロセスが何時までたっても終了しません。Oracleのバグだそうです。
そこでDatabase作成を Noにして、インストール後に Databaseを作成するようにします。

(7)
インストールの途中、リンク失敗のエラーダイアログが出ます。
$ORACLE_HOME/install/make.logを見ると原因が分かります。
/usr/bin/make -f ins_net_client.mk client_sharedlib ORACLE_HOME=/home/oracle/OraHome1
/home/oracle/OraHome1/bin/genclntsh
: undefined reference to ...
/usr/bin/make -f ins_sqlplus.mk install ORACLE_HOME=/home/oracle/OraHome1
/usr/bin/ld: cannot find -lclntsh
(「libclntsh.so」が古い glibc をリンクしていてシンボル未解決で作成出来ず、
  「libclntsh.so」をリンクしている「sqlplus」が作成できない。)

以下の編集と操作を行います。

oracle> vi $ORACLE_HOME/bin/genclntsh
修正前
LD="ld -shared -L${ORACLE_HOME}/lib"		# shared library link command
修正後
LD="ld -shared -m elf_i386 -L/usr/i386-glibc21-linux/lib  -L${ORACLE_HOME}/lib"		# shared library link command

oracle> cd $ORACLE_HOME/network/lib
oracle> make -f ins_net_client.mk client_sharedlib
$ORACLE_HOME/lib/libclntsh.so.8.0 が出来る。

リンク失敗のエラーダイアログで「Retry」を押す。

途中、rootで $ORACLE_HOME/root.sh の実行を要求されるので実行する。
root> cd $ORACLE_HOME
root> ./root.sh

Oracle Universal Installerでのインストールはここで終了。

(解説)
インストール中、クライアントライブラリを、
genclntshというシェルスクリプトで作成しますが、
そのままだと、下位互換ライブラリが使われず、エラーになります。
genclntshを編集し、makeコマンドを使うと、
genclntshがクライアントライブラリを正しく作ることができます。

(8)
以下の要領でDatabaseを作成します。

oracle> dbassist

グローバルデータベース名:ORCL
SID: ORCL

sysアカウントのパスワード: change_on_install
systemアカウントのパスワード: manager

以下の要領で Oracleサーバーを起動します。

oracle> svrmgrl
SVRNGR> connect internal
  接続されました。
SVRMGR> startup
  Oracleインスタンスが起動しました。
  システム・グローバル領域合計                        ......バイト
  Fixed Size                                          ......バイト
  Variable Size                                       ......バイト
  Database Buffers                                    ......バイト
  Redo Buffers                                        ......バイト
  データベースがマウントされました。
  データベースがオープンされました。
SVRMGR> exit
  Server Managerを終了しました。
oracle>

以下の要領でOracle Net8サービスを起動します。

oracle> lsnrctl
LSNRCTL> start
  /home/oracle/OraHome1/bin/tnslsnrを起動しています。お待ちください...
  TNSLSNR for Linux: Version 8.1.7.0.0 - Production
  システム・パラメータ・ファイルは/home/oracle/OraHome1/network/admin/listener.oraです。
  ログ・メッセージを/home/oracle/OraHome1/network/log/listener.logに書き込みました。
  リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=altair)(PORT=1521)))
  リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=altair)(PORT=1521)))に接続しています。
  リスナーのステータス
  ------------------------
  別名                      LISTENER
  バージョン                TNSLSNR for Linux: Version 8.1.7.0.0 - Production
  開始日                    xx-xx-2005 xx:xx:xx
  アップ時間                0 日 0 時 0 分 0 秒
  トレース・レベル          off
  セキュリティ              OFF
  SNMP                      OFF
  パラメータ・ファイル      /home/oracle/OraHome1/network/admin/listener.ora
  ログ・ファイル            /home/oracle/OraHome1/network/log/listener.log
  サービスのサマリー...
    ORCL		には、1件のサービス・ハンドラがあります。
    PLSExtProc		には、1件のサービス・ハンドラがあります。
  コマンドは正常に終了しました。
LSNRCTL> exit
oracle>

Sqlplusから接続できるか、以下の要領で確かめます。

oracle> sqlplus scott/tiger@ORCL

SQL> select table_name from all_tables where owner='SCOTT';
TABLE_NAME
------------------------------------------------------------
BONUS
DEPT
EMP
SALGRADE
SQL> exit
oracle>

(解説)
Database作成用のコマンド dbassistは使えるようですが、
Net8コンフィグレーション用コマンド netasstは使えないようです。
何時までたっても正しく起動しません。環境変数に
ORACLE_SID=ORCL
があると、Net8用の設定をしてくれるようなので、困りはしません。

(9)
OCIサンプル rdbms/demo/*のビルドをします。
oracle> cd $ORACLE_HOME/rdbms/demo
oracle> make -f demo_rdbms.mk demos
そのままではエラーがでます。

以下の操作を行います。
oracle> cd ~/bin
oracle> ln -s /usr/bin/gcc296 cc

oracle> cd $ORACLE_HOME/rdbms/demo
oracle> vi demo_rdbms.mk
修正前
LDFLAGS=-L$(LIBHOME) -L$(RDBMSLIB)
INCLUDE= $(I_SYM)$(ORACLE_HOME)/rdbms/demo $(I_SYM)$(ORACLE_HOME)/rdbms/public $(I_SYM)$(ORACLE_HOME)/plsql/public $(I_SYM)$(ORACLE_HOME)/network/public
修正後
LDFLAGS=-m elf_i386 -L/usr/i386-glibc21-linux/lib -L$(LIBHOME) -L$(RDBMSLIB)
INCLUDE= -I/usr/i386-glibc21-linux/include $(I_SYM)$(ORACLE_HOME)/rdbms/demo $(I_SYM)$(ORACLE_HOME)/rdbms/public $(I_SYM)$(ORACLE_HOME)/plsql/public $(I_SYM)$(ORACLE_HOME)/network/public

oracle> make -f demo_rdbms.mk demos

(解説)
Oracleのランタイムが、
glibc2.1以下のランタイム、gcc2.96以下のランタイムをリンクするので、
サンプルもこれらのランタイムをリンクする必要があります。
demo_rdbms.mkは、gccコマンド、ldコマンド以外に ccコマンドも使用するので、
ln -s /usr/bin/gcc296 cc でccが 下位互換ライブラリのgccを使うようにします。
demo_rdbms.mkの環境変数に INCLUDE、LDFLAGSがありますが、
ここを、上記のように下位互換ライブラリを使うように修正し、makeします。

以上