Amazon

2013年9月8日日曜日

Oracle 11g XEをUbuntu 13.04用のdebパッケージに変換

Oracle 11g XEのRPMパッケージをalienコマンドでdebパッケージに変換しました。 変換されたdebパッケージには、Ubuntu環境固有の違いで、そのままでは動きませんでした。
  1. パッケージの依存関係を修正 
  2. chkconfigをupdate-rc.dコマンドに変更 
  3. awkコマンドの修正 
  4. /var/lock/subsysの修正
  5. /dev/shmの修正

RPMパッケージからdebパッケージへの変換

alienコマンドでRPMパッケージをDebパッケージに変換します。
$ unzip oracle-xe-11.2.0-1.0.x86_64.rpm.zip 
Archive:  oracle-xe-11.2.0-1.0.x86_64.rpm.zip
   creating: Disk1/
   creating: Disk1/upgrade/
  inflating: Disk1/upgrade/gen_inst.sql  
   creating: Disk1/response/
  inflating: Disk1/response/xe.rsp   
  inflating: Disk1/oracle-xe-11.2.0-1.0.x86_64.rpm  
$ sudo apt-get install alien
$ cd Disk1/
$ fakeroot alien --to-deb --scripts oracle-xe-11.2.0-1.0.x86_64.rpm 
oracle-xe_11.2.0-2_amd64.deb generated
$

パッケージの依存関係を修正

Oracle 11g XEのインストールマニュアルに記載されていた下記のパケージ依存関係をcontrolファイルに追記します。
マニュアルにはありませんがunixodbcパッケージも追加します。
パッケージのバージョンは、プライベートバージョンということが分かるように末尾にp1を追加しました。
修正したらオリジナルのcontrol.tar.gzを置き換えます。
$ mkdir ora11xe
$ cd ora11xe/
$ ar x ../oracle-xe_11.2.0-2_amd64.deb 
$ ls
control.tar.gz  data.tar.gz  debian-binary
$ mkdir control
$ cd control
$ tar xfz ../control.tar.gz 
$ vi control
$ git diff control
...
-Version: 11.2.0-2
+Version: 11.2.0-2p1
...
 Installed-Size: 578164
+Depends: libc6 (>= 2.3.4-2.41), make (>= 3.80), binutils (>= 2.16.91.0.5), gcc (>= 4.1.2), libaio (>= 0.3.104), unixodbc (>= 2.2.14)
 Section: alien
...
$ rm ../control.tar.gz 
$ tar cfz ../control.tar.gz *
$

chkconfigをupdate-rc.dコマンドに変更

chkconfigは、update-rc.dコマンドに変更します。
$ vi postinst
$ git diff postinst
...
+elif [ -f /etc/debian_version ]
+then
+        update-rc.d oracle-xe defaults 80 01
 else
         /sbin/chkconfig --add oracle-xe
 fi
...
$

awkコマンドのパス修正

awkのパスを変更します。
$ mkdir data
$ cd data
$ tar xfz ../data.tar.gz 
$ find . -type f -print | xargs grep "/bin/awk"
./u01/app/oracle/product/11.2.0/xe/config/scripts/oracle-xe:if [ -z "$AWK" ]; then AWK=/bin/awk; fi
./u01/app/oracle/product/11.2.0/xe/config/scripts/oracle-xe.sles:if [ -z "$AWK" ]; then AWK=/bin/awk; fi
./etc/init.d/oracle-xe:if [ -z "$AWK" ]; then AWK=/bin/awk; fi
$ type awk
awk は /usr/bin/awk です
$ find . -type f -print | xargs grep -l "/bin/awk" | xargs sed -i 's#/bin/awk#/usr/bin/awk#'
$ git diff | grep "^[-+]" | less
--- a/etc/init.d/oracle-xe
+++ b/etc/init.d/oracle-xe
-if [ -z "$AWK" ]; then AWK=/bin/awk; fi
+if [ -z "$AWK" ]; then AWK=/usr/bin/awk; fi
--- a/u01/app/oracle/product/11.2.0/xe/config/scripts/oracle-xe
+++ b/u01/app/oracle/product/11.2.0/xe/config/scripts/oracle-xe
-if [ -z "$AWK" ]; then AWK=/bin/awk; fi
+if [ -z "$AWK" ]; then AWK=/usr/bin/awk; fi
--- a/u01/app/oracle/product/11.2.0/xe/config/scripts/oracle-xe.sles
+++ b/u01/app/oracle/product/11.2.0/xe/config/scripts/oracle-xe.sles
-if [ -z "$AWK" ]; then AWK=/bin/awk; fi
+if [ -z "$AWK" ]; then AWK=/usr/bin/awk; fi
$

/var/lock/subsysの修正

ロックファイルの場所を/var/lock/subsysから/var/lockに変更して、data.tar.gzを置き換えます。
$ find . -type f | xargs grep -l "/var/lock/subsys" | xargs sed -i 's#/var/lock/subsys#/var/lock#'
$ git diff | grep \^[-+] | less
--- a/etc/init.d/oracle-xe
+++ b/etc/init.d/oracle-xe
-       touch /var/lock/subsys/listener
+       touch /var/lock/listener
-       touch /var/lock/subsys/oracle-xe
+       touch /var/lock/oracle-xe
-                       touch /var/lock/subsys/listener
+                       touch /var/lock/listener
-               touch /var/lock/subsys/oracle-xe
+               touch /var/lock/oracle-xe
-    if [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/listener
+    if [ $RETVAL -eq 0 ] && rm -f /var/lock/listener
-       rm -f /var/lock/subsys/oracle-xe
+       rm -f /var/lock/oracle-xe
--- a/u01/app/oracle/product/11.2.0/xe/config/scripts/oracle-xe
+++ b/u01/app/oracle/product/11.2.0/xe/config/scripts/oracle-xe
-       touch /var/lock/subsys/listener
+       touch /var/lock/listener
-       touch /var/lock/subsys/oracle-xe
+       touch /var/lock/oracle-xe
-                       touch /var/lock/subsys/listener
+                       touch /var/lock/listener
-               touch /var/lock/subsys/oracle-xe
+               touch /var/lock/oracle-xe
-    if [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/listener
+    if [ $RETVAL -eq 0 ] && rm -f /var/lock/listener
-       rm -f /var/lock/subsys/oracle-xe
+       rm -f /var/lock/oracle-xe
--- a/u01/app/oracle/product/11.2.0/xe/config/scripts/oracle-xe.sles
+++ b/u01/app/oracle/product/11.2.0/xe/config/scripts/oracle-xe.sles
-       touch /var/lock/subsys/listener
+       touch /var/lock/listener
-       touch /var/lock/subsys/oracle-xe
+       touch /var/lock/oracle-xe
-                       touch /var/lock/subsys/listener
+                       touch /var/lock/listener
-               touch /var/lock/subsys/oracle-xe
+               touch /var/lock/oracle-xe
-    if [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/listener
+    if [ $RETVAL -eq 0 ] && rm -f /var/lock/listener
-       rm -f /var/lock/subsys/oracle-xe
+       rm -f /var/lock/oracle-xe
$ rm ../data.tar.gz 
$ tar cfz ../data.tar.gz *
$

パッケージ

最後にパッケージします。
$ ar r ../oracle-xe_11.2.0-2p1_amd64.deb debian-binary data.tar.gz control.tar.gz 
ar: ../oracle-xe_11.2.0-2p1_amd64.deb を作成しています
$

インストール

出来上がったパッケージをインストールします。
$ sudo dpkg -i oracle-xe_11.2.0-2p1_amd64.deb 
以前に未選択のパッケージ oracle-xe を選択しています。
(データベースを読み込んでいます ... 現在 69818 個のファイルとディレクトリがインストールされてい ます。)
(oracle-xe_11.2.0-2p1_amd64.deb から) oracle-xe を展開しています...
oracle-xe (11.2.0-2p1) を設定しています ...
Executing post-install steps...
update-rc.d: warning: /etc/init.d/oracle-xe missing LSB information
update-rc.d: see 
 Adding system startup for /etc/init.d/oracle-xe ...
   /etc/rc0.d/K01oracle-xe -> ../init.d/oracle-xe
   /etc/rc1.d/K01oracle-xe -> ../init.d/oracle-xe
   /etc/rc6.d/K01oracle-xe -> ../init.d/oracle-xe
   /etc/rc2.d/S80oracle-xe -> ../init.d/oracle-xe
   /etc/rc3.d/S80oracle-xe -> ../init.d/oracle-xe
   /etc/rc4.d/S80oracle-xe -> ../init.d/oracle-xe
   /etc/rc5.d/S80oracle-xe -> ../init.d/oracle-xe
You must run '/etc/init.d/oracle-xe configure' as the root user to configure the database.

ureadahead のトリガを処理しています ...
libc-bin のトリガを処理しています ...
ldconfig deferred processing now taking place
$ 

/dev/shmの修正

指示通り/etc/init.d/oracle-xe configureを実行しますがORA-00845で動きません。 いろいろ調べた結果、以下の/etc/init.d/oracle-shmを用意して実行することで動きました。
$ cat /etc/init.d/oracle-shm 
#! /bin/sh 
# /etc/init.d/oracle-shm 
# 
# 
case "$1" in
  start) 
    echo "Starting script /etc/init.d/oracle-shm"
    # Run only once at system startup 
    if [ -e /dev/shm/.oracle-shm ]; then
      echo "/dev/shm is already mounted, nothing to do"
    else
      if [ -e /dev/shm ]; then
        rm -f /dev/shm
      fi
      if [ ! -d /dev/shm ]; then
        mkdir /dev/shm
      fi
      mount -t tmpfs shmfs -o size=1024m /dev/shm
    fi
    ;; 
  stop) 
    echo "Stopping script /etc/init.d/oracle-shm"
    echo "only umount /dev/shm."
    umount /dev/shm
    ;; 
  *) 
    echo "Usage: /etc/init.d/oracle-shm {start|stop}"
    exit 1 
    ;; 
esac 
# 
### BEGIN INIT INFO 
# Provides:          oracle-shm 
# Required-Start:    $remote_fs $syslog 
# Required-Stop:     $remote_fs $syslog 
# Default-Start:     2 3 4 5 
# Default-Stop:      0 1 6 
# Short-Description: Bind /run/shm to /dev/shm at system startup. 
# Description:       Fix to allow Oracle 11g use AMM. 
### END INIT INFO
$ 
オリジナルの/dev/shmは/run/shmのシンボリックリンクで、/etc/init.d/umountrootで作成されています。
$ tail -n +67 /etc/init.d/umountroot | head -5
 if [ -d /dev/shm ]; then
  umount -l /dev/shm || true
  rm -rf /dev/shm
  ln -nsf /run/shm /dev/shm
 fi
$ 
これもdebパッケージに組込できると思うのですが、今日はこれまで... bloggerのテンプレートは、カスタマイズしないと読みにくい、エディタはちょっと使いづらい...

0 件のコメント: