2009年10月28日水曜日

第13回 HTTP ServerでPL/SQLのWeb Applicationを動かす

下記の環境下において、PL/SQL言語によって開発されたWeb ApplicationをHTTP Server上で動かす手順を例示する。

  • Oracle Web Server (OWS)
  • Oracle Web Application Server(WAS)
  • Oracle Application Server (OAS)
  • Oracle Internet Application Server (iAS)
  • Oracle Application Server 10g (OracleAS 10g)

  1. HTTP Serverのインストール
    1. インストールは前回の「第12回 Oracle HTML DB、HTTP Serverのインストール」を参照されたい。相違点のみを下記に記す。

    2. インストールする製品の選択
    3. 「インストールする製品の選択」が表示されたら、「Oracle Database 10g Companion Products 10.2.0.2.0」を選択して「次へ」をクリックする。

      Screen  インストールする製品の選択

    4. 使用可能な製品コンポーネント
    5. 「使用可能な製品コンポーネント」が表示されたら、「Apache Standalone 10.1.2.1.0」を選択して「次へ」をクリックする。

      Screen  ホームの詳細の指定

    6. コンフィギュレーション・アシスタント
    7. 「Starting HTTP Server」が終了するまで待つ。

      Screen  コンフィギュレーション・アシスタント

  2. 定義ファイルの設定
    1. DAD (Database Access Descriptor) Configuration File (dads.conf)の作成
    2. 「dads.README」に入っているテンプレートから「dads.conf」を作成する。

      $ cd /opt/app/oracle/product/10.2.0/companion/Apache/modplsql/conf
      $ cp -p dads.conf dads.conf.org
      $ vi dads.README
      (現在のラインナンバーでは下記のとおり削除する。)
      :96,$d
      :1,81d
      (「dads.conf」でセーブして終了する。)
      :wq! dads.conf

      編集後、「dads.conf」の内容は下記のとおりになる。

      <location /plsqlapp>
        SetHandler pls_handler
        Order deny,allow
        Allow from all
        AllowOverride None
        PlsqlDatabaseUsername scott
        PlsqlDatabasePassword tiger
        PlsqlDatabaseConnectString orcl
        PlsqlAuthenticationMode Basic
        PlsqlDefaultPage scott.home
        PlsqlDocumentTablename scott.wwdoc_document
        PlsqlDocumentPath docs
        PlsqlDocumentProcedure scott.wwdoc_process.process_download
      </location>

    3. ローカル・ネーミング・パラメータ (tnsnames.ora)の作成
    4. 「Oracle Database 10g」に入っているtnsnames.oraを「Oracle HTTP Server」にコピーする。

      $ cd /opt/app/oracle/product/10.2.0/network/admin
      $ cp -p tnsnames.ora /opt/app/oracle/product/10.2.0/companion/network/admin

  3. プログラムコードの作成
    1. PL/SQLプロシジャーの作成
    2. 下記のプログラムコードを作成して「list.sql」の名前で保存する。

      create or replace procedure list is
        cursor cur is
        select table_name from user_tables;
      begin
        for rec in cur loop
          htp.p(rec.table_name||'<br>');
        end loop;
      end;
      /

    3. PL/SQLプロシジャーのコンパイル
    4. 下記の手順によりプロシジャーのコンパイルする。

      $ sqlplus scott/tiger
      SQL*Plus: Release 10.2.0.2.0 - Production on ・・・
        …  
      SQL>@list.sql
      プロシージャが作成されました。
      SQL>quit

    5. Oracle HTTP Serverの再起動
    6. 「$ORACLE_HOME/companion/opmn/bin/opmnctl」コマンドを使用する。

      $ /opt/app/oracle/product/10.2.0/companion/opmn/bin/opmnctl restartproc
      opmnctl: restarting opmn managed processes...

    7. プログラムの実行
    8. ブラウザでURLに「http://server_addr:7777/plsqlapp/list」を指定する。

      Screen  実行結果

2009年10月27日火曜日

第12回 Oracle HTML DB、HTTP Serverのインストール

Oracle HTML DBを使用する場合は下記の手順によりOracle Database Companion CDからインストールを行う。ほとんどデフォルトのまま進めばよいので、容易な作業であるが、GUIが立ち上がっていることが前提になる。(もちろんサイレントインストールも可能であるが、それについては省略する。)

  1. Oracle Database 10g Companion CD Release 2 (10.2.0.2)をダウンロードする
  2. Oracle Database 10g Release 2 (10.2.0.2) for Solaris Operating System (x86)から「Accept License Agreement 」にチェックを入れて10202_companion_solx86.pをダウンロードする。

    Screen  Oracle Database 10g Companion CD Release 2 (10.2.0.2)

  3. oracleユーザーでログインする
  4. Screen  login

  5. インストールアーカイブを解凍する。
  6. ダウンロードしたインストールアーカイブを(10202_companion_solx86.zip)をSolarisサーバーにftpでコピーして、端末エミュレータを開き、次のコマンドをタイプしてインストールアーカイブを解凍する。(ここでは、oracleユーザーのホームディレクトリ以下にCompanionディレクトリを作成してコピーした)

    $ cd /export/home/oracle/Companion
    $ unzip 10202_companion_solx86.zip

  7. シンボリックリンクを張る
  8. インストーラはあらぬところのmakeを参照しているので、このままではインストールの最中にエラーが発生する。下記のように「/usr/ccs/bin/make」へ「/usr/local/packages/local/bin/make」という名前でシンボリックリンクを張って回避する。

    $ su -
    パスワード:
    Sun Microsystems Inc. SunOS 5.10 Generic January 2005
    # mkdir -p /usr/local/packages/local/bin
    # ln -s /usr/ccs/bin/make /usr/local/packages/local/bin/make
    # chown oracle /usr/local/packages/local/bin/make
    # exit

    Screen  発生するエラー

  9. インストーラを起動する
  10. アーカイブを解凍するとディレクトリcompanionが作成され、その配下にインストール・ファイルが展開される。Oracle Universal Installer を起動するため、次のコマンドをタイプする。

    $ cd companion
    $ runInstaller


    Screen  runInstaller

  11. インストールする製品の選択
  12. 「インストールする製品の選択」が表示されたら、デフォルトのまま「次へ」をクリックする。

    Screen  Oracle Universal Installer

  13. ようこそ
  14. 「ようこそ」が表示されたら、デフォルトのまま「次へ」をクリックする。

    Screen  ようこそ

  15. インストール・タイプの選択
  16. 「インストール・タイプの選択画面」が表示されたら、デフォルトのまま「次へ」をクリックする。

    Screen  インストール・タイプの選択

  17. ホームの詳細の指定
  18. Oracle 10Gとは別のOracleホームとディレクトリを指定する、「次へ」をクリックする。

    ここではOracleホーム名に「OraDb10g_home2」、ディレクトリに「/opt/app/oracle/product/10.2.0/companion」を指定した。

    Screen  ホームの詳細の指定

  19. 製品固有の前提条件のチェック
  20. 「次へ」をクリックするとメモリ、ディスク領域、OSのバージョンなどの要件チェックが始まる。

    Screen  製品固有の前提条件のチェック

    メモリの実装が512Mバイト程度だと、ワーニングが発生するので、ダイアログが出たら「はい」をクリックして続行する。

  21. HTML DBデータベースの詳細の指定
  22. データベースのSYSユーザーの「SYSパスワード」、Oracle HTML DBスキーマ(users)に使用する「HTML DBパスワード」を入力して、「次へ」をクリックする。

    Screen  HTML DBデータベースの詳細の指定

  23. サマリー
  24. 確認して「インストール」をクリックする

    Screen  サマリー

  25. インストール
  26. インストールが始まる

    Screen  インストール

  27. コンフィギュレーション・アシスタント
  28. 「HTML DB Configuration Assistant」が終了するまで待つ。

    Screen  コンフィギュレーション・アシスタント

  29. 構成スクリプトの実行
  30. 確認して「OK」をクリックする

    Screen  サマリー

  31. インストールの終了
  32. 確認して「終了」をクリックする。

    Screen  インストール

  33. root.shの実行
  34. 「構成スクリプトの実行」の指示どおりにroot.shを実行する。

    $ su -
    パスワード:
    Sun Microsystems Inc. SunOS 5.10 Generic January 2005
    # cd /opt/app/oracle/product/10.2.0/companion
    # ./root.sh
    # exit

    Screen  root.sh

  35. インストールアーカイブを削除する
  36. $ rm -r /export/home/oracle/Companion

  37. Oracle HTTP Serverの動作確認
  38. ブラウザでURLに「http://server_addr:7777」を指定する。

    Screen  Oracle HTTP Server

  39. HTML DB サービス管理
  40. ブラウザでURLに「http://server_addr:7777/pls/htmldb/htmldb_admin」を指定する。

    ユーザー名に「admin」、パスワードに「HTML DBパスワード」を入力してを「ログイン」をクリックする

    Screen  HTML DB サービス管理

    「HTML DB サービスの管理」が表示されたら、設定を行う。

    Screen  HTML DB サービスの管理

  41. Oracle HTTP Serverの起動、停止
  42. システム再起動後にはOracle HTTP Serverは停止する。プロセスの状態確認、起動、停止はoracleユーザーから「$ORACLE_HOME/opmn/bin/opmnctl」コマンドを使用する。

    したがって、ここでの環境では下記のようにコマンドを使用する。

    (状態確認)
    /opt/app/oracle/product/10.2.0/companion/opmn/bin/opmnctl status
    (起動)
    /opt/app/oracle/product/10.2.0/companion/opmn/bin/opmnctl startall
    (停止)
    /opt/app/oracle/product/10.2.0/companion/opmn/bin/opmnctl stopall
    (一覧)
    /opt/app/oracle/product/10.2.0/companion/opmn/bin/opmnctl help

2009年10月19日月曜日

第11回 シェルスクリプト(その5 ブータブルなリカバリディスクの作成)

  1. 実行上の注意
  2. rootユーザーから下記の点に注意して、make_bootable_media.shを実行する。
    • ドライブにSolarisインストールディスクを入れてから実行する。必要なモジュールのコピーが終わると、下記のメッセージが表示されてディスクが排出されるので、初期化したDVD-RWメディアに入れ替えて「Enter」を押す。
    • Please insert writable media and press enter:
  3. make_bootable_media.sh
  4. 下記を作成して、「make_bootable_media.sh」と名前を付けて保存する。
    #!/bin/sh

    # stop oracle
    /etc/init.d/dbora stop

    # create flash archive
    mkdir -p /dvdimage/flash
    flarcreate -n solaris_oracle_initial -x /cdrom/ -c /dvdimage/flash/soi.flar

    # copy solaris installation dvd
    cd /cdrom/cdrom0
    find . -depth -print|grep -v ./Solaris_10|cpio -pdm /dvdimage
    find Solaris_10/Misc -depth -print|cpio -pdm /dvdimage

    # extract miniroot
    mkdir -p /dvdimage/miniroot
    /boot/solaris/bin/root_archive unpack /cdrom/cdrom0/boot/x86.miniroot /dvdimage/miniroot

    # create sysidcfg
    cd /dvdimage/miniroot/etc
    mv sysidcfg sysidcfg.org
    cat << EOF > sysidcfg
    name_service=none
    network_interface=rtls0 {dhcp protocol_ipv6=no}
    root_password=`cat /etc/shadow | grep root: | sed s/root:// |sed s/:.*//`
    security_policy=none
    system_locale=ja
    timezone=Asia/Tokyo
    timeserver=localhost
    nfs4_domain=dynamic
    EOF

    # edit profind
    cp -p /dvdimage/miniroot/usr/sbin/install.d/profind /dvdimage/miniroot/usr/sbin/install.d/profind.org
    sed s'/\[ -f \/tmp\/.preinstall \]/\[ true \]/' /dvdimage/miniroot/usr/sbin/install.d/profind.org > /dvdimage/miniroot/usr/sbin/install.d/profind

    # edit install-solaris
    cd /dvdimage/miniroot/sbin
    mv install-solaris install-solaris.org
    sed s"/ reboot/i=0;while [ \$i -lt 100 ];do tput bel;sleep 1;i=\`expr \$i + 1\`;done;reboot/" install-solaris.org > install-solaris
    chmod u+x install-solaris

    # archive miniroot
    /boot/solaris/bin/root_archive pack /dvdimage/boot/x86.miniroot /dvdimage/miniroot
    cd
    rm -r /dvdimage/miniroot
    eject cdrom
    echo "Please insert writable media and press enter: "
    read key

    # edit Grub menu
    cd /dvdimage/boot/grub
    mv menu.lst menu.lst.org
    cat << EOF >> menu.lst
    default=0
    timeout=60
    title Solaris10 Jumpstart
    kernel /boot/multiboot kernel/unix - install -B install_media=cdrom
    module /boot/x86.miniroot
    EOF

    # edit rule file
    cd /dvdimage/.install_config
    mv rules.ok rules.ok.org
    echo "any - x86-begin any_machine -" > rules

    # create any_machine
    cat << EOF > any_machine
    # profile keywords profile values
    # ---------------- -------------------
    install_type flash_install
    archive_location local_file /cdrom/flash/soi.flar
    partitioning explicit
    filesys any free /
    filesys any 4096 swap
    EOF

    # copy begin script
    cp -p /dvdimage/Solaris_10/Misc/jumpstart_sample/x86-begin .

    # validate rules file
    /dvdimage/Solaris_10/Misc/jumpstart_sample/check

    # create ISO image
    cd /dvdimage
    mkisofs -o /dvdimage/flash/soi.iso -b boot/grub/stage2_eltorito -c .catalog -no-emul-boot -boot-load-size 4 -boot-info-table -relaxed-filenames -N -L -l -r -J -d -D -V SOL_10_509_X86_JUMPSTART .

    # write ISO image to DVD

    # cdrw -iS -p 8 /dvdimage/flash/soi.iso
    cdrw -i /dvdimage/flash/soi.iso;

    # erase work area
    cd
    rm -r /dvdimage

    exit
  5. make_bootable_media.shの処理内容
  6. 設定内容については「ブータブルなリカバリディスクの作成 」を参照されたい。
    1. Oracleの停止
    2. # stop oracle
      /etc/init.d/dbora stop
    3. Flashアーカイブの作成
    4. # create flash archive
      mkdir -p /dvdimage/flash
      flarcreate -n solaris_oracle_initial -x /cdrom/ -c /dvdimage/flash/soi.flar
    5. インストールディスクのコピー
    6. cd /cdrom/cdrom0
      find . -depth -print|grep -v ./Solaris_10|cpio -pdm /dvdimage
      find Solaris_10/Misc -depth -print|cpio -pdm /dvdimage
    7. ミニルートの展開
    8. mkdir -p /dvdimage/miniroot
      /boot/solaris/bin/root_archive unpack /cdrom/cdrom0/boot/x86.miniroot /dvdimage/miniroot
    9. sysidcfgの作成
    10. # create sysidcfg cd /dvdimage/miniroot/etc
      mv sysidcfg sysidcfg.org
      cat << EOF > sysidcfg
      name_service=none
      network_interface=rtls0 {dhcp protocol_ipv6=no}
      root_password=`cat /etc/shadow | grep root: | sed s/root:// |sed s/:.*//`
      security_policy=none
      system_locale=ja
      timezone=Asia/Tokyo
      timeserver=localhost
      nfs4_domain=dynamic
      EOF
    11. profindの修正
    12. cp -p /dvdimage/miniroot/usr/sbin/install.d/profind /dvdimage/miniroot/usr/sbin/install.d/profind.org
      sed s'/\[ -f \/tmp\/.preinstall \]/\[ true \]/' /dvdimage/miniroot/usr/sbin/install.d/profind.org > /dvdimage/miniroot/usr/sbin/install.d/profind
    13. install-solarisの修正
    14. cd /dvdimage/miniroot/sbin
      mv install-solaris install-solaris.org
      sed s"/ reboot/i=0;while [ \$i -lt 100 ];do tput bel;sleep 1;i=\`expr \$i + 1\`;done;reboot/" install-solaris.org > install-solaris
      chmod u+x install-solaris
    15. ミニルートの圧縮
    16. /boot/solaris/bin/root_archive pack /dvdimage/boot/x86.miniroot /dvdimage/miniroot
      cd
      rm -r /dvdimage/miniroot
      eject cdrom
      echo "Please insert writable media and press enter: "
      read key
    17. GRUBメニューの編集
    18. cd /dvdimage/boot/grub
      mv menu.lst menu.lst.org
      cat << EOF > > menu.lst
      default=0
      timeout=60
      title Solaris10 Jumpstart
      kernel /boot/multiboot kernel/unix - install -B install_media=cdrom
      module /boot/x86.miniroot
      EOF
    19. rulesファイルの編集
    20. cd /dvdimage/.install_config
      mv rules.ok rules.ok.org
      echo "any - x86-begin any_machine -" > rules
    21. profileの作成
    22. cat << EOF > any_machine
      # profile keywords profile values
      # ---------------- -------------------
      install_type flash_install
      archive_location local_file /cdrom/flash/soi.flar
      partitioning explicit
      filesys any free /
      filesys any 4096 swap
      EOF
    23. 開始スクリプトの作成
    24. # copy begin script
      cp -p /dvdimage/Solaris_10/Misc/jumpstart_sample/x86-begin .
    25. ルールファイルのチェック
    26. # validate rules file
      /dvdimage/Solaris_10/Misc/jumpstart_sample/check
    27. DVDイメージファイルの作成
    28. cd /dvdimage
      mkisofs -o /dvdimage/flash/soi.iso -b boot/grub/stage2_eltorito -c .catalog -no-emul-boot -boot-load-size 4 -boot-info-table -relaxed-filenames -N -L -l -r -J -d -D -V SOL_10_509_X86_JUMPSTART .
    29. DVDに書き込み
    30. # write ISO image to DVD
      # cdrw -iS -p 8 /dvdimage/flash/soi.iso
      cdrw -i /dvdimage/flash/soi.iso;
    31. ワークエリアの消去
    32. # erase work area
      cd
      rm -r /dvdimage

第11回 シェルスクリプト(その4 Oracleインストール後の設定)

  1. 実行上の注意
  2. rootユーザーから下記の点に注意して、oracle_install_3r.shを実行する。

    • 構成スクリプトの実行の際、下記のような表示がされたら、それに対して「Enter」を押す。
    • Enter the full pathname of the local bin directory: [/usr/local/bin]:

  3. oracle_install_3r.sh
  4. 下記を作成して、「oracle_install_3r.sh」と名前を付けて保存する。

    #!/bin/sh
    # execute configuration scripts
    /opt/app/oracle/oraInventory/orainstRoot.sh
    /opt/app/oracle/product/10.2.0/root.sh

    # create dbora script
    cat << EOF > /etc/init.d/dbora
    #!/bin/sh
    ORACLE_HOME=/opt/app/oracle/product/10.2.0
    ORACLE=oracle
    #
    case \$1 in
    'start')
        su - \$ORACLE -c "bash \$ORACLE_HOME/bin/dbstart \$ORACLE_HOME"
        ;;
    'stop')
        su - \$ORACLE -c "bash \$ORACLE_HOME/bin/dbshut \$ORACLE_HOME"
        ;;
    *)
        echo "usage: \$0 {start|stop}"
        exit
        ;;
    esac
    #
    exit
    EOF
    chmod u+x /etc/init.d/dbora

    # enable dbstart script
    cd /var/opt/oracle
    mv oratab oratab.org
    sed 's/:N$/:Y/' oratab.org > oratab

    # create symbolic links to the dbora script
    ln -s /etc/init.d/dbora /etc/rc0.d/K10dbora
    ln -s /etc/init.d/dbora /etc/rc3.d/S99dbora
    init 6
    exit

  5. oracle_install_3r.shの処理内容
  6. 設定内容については「第6回 Oracleインストール後の設定」を参照されたい。

    1. 構成スクリプトの実行
    2. # execute configuration scripts
      /opt/app/oracle/oraInventory/orainstRoot.sh
      /opt/app/oracle/product/10.2.0/root.sh

    3. 起動スクリプトの作成
    4. # create dbora script
      cat << EOF > /etc/init.d/dbora
      #!/bin/sh
      ORACLE_HOME=/opt/app/oracle/product/10.2.0
      ORACLE=oracle
      #
      case \$1 in
      'start')
          su - \$ORACLE -c "bash \$ORACLE_HOME/bin/dbstart \$ORACLE_HOME"
          ;;
      'stop')
          su - \$ORACLE -c "bash \$ORACLE_HOME/bin/dbshut \$ORACLE_HOME"
          ;;
      *)
          echo "usage: \$0 {start|stop}"
          exit
          ;;
      esac
      #
      exit
      EOF
      chmod u+x /etc/init.d/dbora

    5. oratabの編集
    6. # enable dbstart script
      cd /var/opt/oracle
      mv oratab oratab.org
      sed 's/:N$/:Y/' oratab.org > oratab

    7. シンボリックリンクの作成
    8. # create symbolic links to the dbora script
      ln -s /etc/init.d/dbora /etc/rc0.d/K10dbora
      ln -s /etc/init.d/dbora /etc/rc3.d/S99dbora

2009年10月17日土曜日

第11回 シェルスクリプト(その3 サイレントインストールの実行)

  1. 実行上の注意
  2. oracleユーザーから下記の点に注意して、oracle_install_2o.shを実行する。

    • シェルスクリプトoracle_install_2o.shは、テンプレートをsedで編集してレスポンス・ファイルを作る。したがってシェルスクリプトと同じディレクトリに、sedが使用する処理内容の定義ファイルoracle_install_2o.sed を入れて実行する。
    • Oracleインストールアーカイブ(10202_database_solx86.zip)はCD/DVDドライブに入ったメディアにあるものとしている。これと違う場合はARCHIVEの右辺を編集して実在する場所に変更する。

  3. oracle_install_2o.sh
  4. 下記を作成して、「oracle_install_2o.sh」と名前を付けて保存する。

    #!/bin/sh
    ARCHIVE=/cdrom/cdrom0/10202_database_solx86.zip
    # extract archive
    unzip $ARCHIVE -d $HOME
    # customize response file
    sed -f ./oracle_install_2o.sed $HOME/database/response/enterprise.rsp > ./enterprise.rsp
    # silent install
    $HOME/database/runInstaller -silent -responseFile ./enterprise.rsp
    # remove extract archive
    #rm -r $HOME/database
    exit

  5. oracle_install_2o.shの処理内容
  6. 詳しくは「第5回 Oracleサイレントインストール」を参照されたい。

    1. インストールアーカイブのファイルパスを指定する
    2. #!/bin/sh
      ARCHIVE=/cdrom/cdrom0/10202_database_solx86.zip

    3. インストールアーカイブを解凍する
    4. #!/bin/sh
      # extract archive
      unzip $ARCHIVE -d $HOME

    5. レスポンス・ファイルを作成する
    6. # customize response file
      sed -f ./oracle_install_2o.sed $HOME/database/response/enterprise.rsp > ./enterprise.rsp

    7. サイレントインストールを実行する
    8. # silent install
      $HOME/database/runInstaller -silent -responseFile ./enterprise.rsp

    9. 解凍したインストールアーカイブを削除する(ただし、削除するときはコメントインする)
    10. # remove extract archive
      #rm -r $HOME/database

  7. oracle_install_2o.sed
  8. 下記を作成して、「oracle_install_2o.sed」と名前を付けて保存する。

    設定内容については「第5回 Oracleサイレントインストール」を参照されたい。

    s#^UNIX_GROUP_NAME=.*#UNIX_GROUP_NAME="oinstall"#
    s#^ORACLE_HOME=.*#ORACLE_HOME="/opt/app/oracle/product/10.2.0"#
    s#^ORACLE_HOME_NAME=.*#ORACLE_HOME_NAME="OraDb10g_home1"#
    s#^COMPONENT_LANGUAGES=.*#COMPONENT_LANGUAGES={"ja","e"}#
    s#^n_configurationOption=.*#n_configurationOption=1#
    s#^n_dbType=.*#n_dbType=1#
    s#^s_globalDBName=.*#s_globalDBName="orcl"#
    s#^s_dbSid=.*#s_dbSid="orcl"#
    s#^s_dbRetChar=.*#s_dbRetChar="JA16SJISTILDE"#
    s#^b_loadExampleSchemas=.*#b_loadExampleSchemas=true#
    s#^n_dbStorageType=.*#n_dbStorageType=1#
    s#^s_mountPoint=.*#s_mountPoint="/opt/app/oracle/data"#
    s#^s_superAdminSamePasswd=.*#s_superAdminSamePasswd="password"#
    s#^s_superAdminSamePasswdAgain=.*#s_superAdminSamePasswdAgain="password"#

2009年10月16日金曜日

第11回 シェルスクリプト(その2 Oracleインストールの前準備)

  1. 実行上の注意
  2. rootユーザーから下記の点に注意して、シェルスクリプトoracle_install_1r.sh(このような名前をつけたが、何でも良い)を作成して、実行する。

    • ドライブにSolarisインストールディスクを入れてから実行する。パッケージを追加が終わると、ディスクが排出されるので、リブートまでには取り出す。
    • loginファイルの編集も本スクリプトに含めたので、Solarisのインストールが終わったら、すぐにサーバーのコンソールから実行するすることができる、手作業で行った場合はコメントアウトして、スクリプトからは実行しないようにする。
    • このスクリプトはSolaris10 のリビジョン3/05と5/09の両方で走らせることができるが、prtdiagコマンドが実装されていない、Solarisインストールディスクの構造が違うという理由によって、双方の処理を分岐させている。なお、3/05の場合は「'xxx.domain.com'」の箇所を修正してホスト名を書き込む。
    • パッケージを追加する際、下記のような表示がされたら、それに対して「y」を押す。
    • 「Do you want to continue with the installation of <SUNWi1cs>[y,n,?]」

    • oracleユーザーを作成する際に、下記のようにパスワードを求めらたら、パスワードを入力する。
    • 新しいパスワード:
      新しいパスワードを再入力してください:

  3. oracle_install_1r.sh
  4. 作成するシェルスクリプトoracle_install_1r.shは下記のとおりである、作成しやすい方法でサーバーにおく、詳しくは「第11回 シェルスクリプト(その1 概要)」を参照されたい。

    #!/bin/sh

    # enable telnet root user
    mv /etc/default/login /etc/default/login.org
    sed s'/^CONSOLE=/#CONSOLE=/' /etc/default/login.org > /etc/default/login

    # enable FTP root user
    mv /etc/ftpd/ftpusers /etc/ftpd/ftpusers.org
    sed s'/^root/#root/' /etc/ftpd/ftpusers.org > /etc/ftpd/ftpusers

    # syslogd: WARNING: loghost could not be resolved
    cd /etc/inet
    cp -p hosts hosts.org
    echo '127.0.0.1 loghost' >> hosts

    # set host(FQDN) name
    case `cat /etc/release|head -1|awk '{print $3}'` in
    '3/05')
        echo 'xxx.domain.com' > /etc/nodename
        cd /cdrom/cdrom0/s2/Solaris_10/Product
        ;;
    '5/09')
        echo `prtdiag|grep 'System Configuration:'|awk '{print $NF}'`'.domain.com' > /etc/nodename
        cd /cdrom/cdrom0/Solaris_10/Product
        ;;
    esac

    # install X11 ISO8859-15 Codeset
    pkgadd -d . SUNWi1cs
    pkgadd -d . SUNWi15cs
    cd
    eject cdrom

    # add user groups
    groupadd oinstall
    groupadd dba

    # add user account
    mkdir /export/home
    useradd -g oinstall -G dba -d /export/home/oracle -m oracle
    passwd -r files oracle

    # make oracle directory user account
    mkdir -p /opt/app/oracle
    chown -R oracle:oinstall /opt/app/oracle
    chmod -R 775 /opt/app/oracle

    # creating oracle user profile
    cd /export/home/oracle
    cp -p .profile .profile.org
    cat << EOF >> .profile
    ORACLE_BASE=/opt/app/oracle; export ORACLE_BASE
    ORACLE_HOME=\$ORACLE_BASE/product/10.2.0; export ORACLE_HOME
    ORACLE_SID=orcl; export ORACLE_SID
    NLS_LANG=Japanese_Japan.JA16EUCTILDE; export NLS_LANG
    ORA_NLS10=\$ORACLE_HOME/nls/data; export ORA_NLS10
    LD_LIBRARY_PATH=\$ORACLE_HOME/lib; export LD_LIBRARY_PATH
    PATH=/usr/bin:/usr/sbin:/usr/ccs/bin:/usr/sfw/bin:/usr/ucb:\$ORACLE_HOME/bin:.; export PATH
    umask 022
    EOF

    # set kernel parameters
    cd /etc
    cp -p system system.org
    cat << EOF >> system
    set noexec_user_stack=1
    set semsys:seminfo_semmni=100
    set semsys:seminfo_semmns=1024
    set semsys:seminfo_semmsl=256
    set semsys:seminfo_semvmx=32767
    set shmsys:shminfo_shmmax=4294967295
    set shmsys:shminfo_shmmin=1
    set shmsys:shminfo_shmmni=100
    set shmsys:shminfo_shmseg=10
    EOF

    # disables desktop auto-start
    #/usr/dt/bin/dtconfig -d

    init 6
    exit

  5. oracle_install_1r.shの処理内容
  6. 詳しくは「第3回 Oracleインストールの前準備」を参照されたい。

    1. loginファイルを編集して、rootユーザーがtelnet でログインできるようにする
    2. # enable telnet root user
      mv /etc/default/login /etc/default/login.org
      sed s'/^CONSOLE=/#CONSOLE=/' /etc/default/login.org > /etc/default/login

    3. ftpusersファイルを編集して、rootユーザーがftpでログインできるようにする
    4. # enable FTP root user
      mv /etc/ftpd/ftpusers /etc/ftpd/ftpusers.org
      sed s'/^root/#root/' /etc/ftpd/ftpusers.org > /etc/ftpd/ftpusers

    5. hostsファイルを編集して、ログホストのIPアドレスを定義する
    6. # syslogd: WARNING: loghost could not be resolved
      cd /etc/inet
      cp -p hosts hosts.org
      echo '127.0.0.1 loghost' >> hosts

    7. nodenameファイルを作成して、ホスト名をFQDN形式で書き込む
    8. # set host(FQDN) name
      case `cat /etc/release|head -1|awk '{print $3}'` in
      '3/05')
          echo 'xxx.domain.com' > /etc/nodename
          cd /cdrom/cdrom0/s2/Solaris_10/Product
          ;;
      '5/09')
          echo `prtdiag|grep 'System Configuration:'|awk '{print $NF}'`'.domain.com' > /etc/nodename
          cd /cdrom/cdrom0/Solaris_10/Product
          ;;
      esac

    9. Oracleのソフトウェア要件になっているパッケージを追加する
    10. # install X11 ISO8859-15Codeset
      pkgadd -d . SUNWi1cs
      pkgadd -d . SUNWi15cs
      cd
      eject cdrom

    11. oinstall、dbaユーザーグループを作成する
    12. # add user groups
      groupadd oinstall
      groupadd dba

    13. oracleユーザーを作成する
    14. # add user account
      mkdir /export/home
      useradd -g oinstall -G dba -d/export/home/oracle -m oracle
      passwd -r files oracle

    15. Oracleのインストール先ディレクトリを作成する
    16. # make oracle directory useraccount
      mkdir -p /opt/app/oracle
      chown -R oracle:oinstall/opt/app/oracle
      chmod -R 775 /opt/app/oracle

    17. oracleユーザーのプロファイルを作成する
    18. # creating oracle userprofile
      cd /export/home/oracle
      cp -p .profile .profile.org
      cat << EOF >>.profile
      ORACLE_BASE=/opt/app/oracle;export ORACLE_BASE
      ORACLE_HOME=\$ORACLE_BASE/product/10.2.0;export ORACLE_HOME
      ORACLE_SID=orcl; exportORACLE_SID
      NLS_LANG=Japanese_Japan.JA16EUC;export NLS_LANG
      ORA_NLS10=\$ORACLE_HOME/nls/data;export ORA_NLS10
      LD_LIBRARY_PATH=$ORACLE_HOME/lib;export LD_LIBRARY_PATH
      PATH=/usr/bin:/usr/sbin:/usr/ccs/bin:/usr/sfw/bin:/usr/ucb:\$ORACLE_HOME/bin:.;export PATH
      umask 022
      EOF

    19. カーネルパラメータに推奨値を設定する
    20. # set kernel parameters
      cd /etc
      cp -p system system.org
      cat << EOF >>system
      set noexec_user_stack=1
      set semsys:seminfo_semmni=100
      setsemsys:seminfo_semmns=1024
      set semsys:seminfo_semmsl=256
      setsemsys:seminfo_semvmx=32767
      set shmsys:shminfo_shmmax=4294967295
      set shmsys:shminfo_shmmin=1
      set shmsys:shminfo_shmmni=100
      set shmsys:shminfo_shmseg=10
      EOF

    21. デスクトップ画面を無効にする
    22. # disables desktop auto-start
      /usr/dt/bin/dtconfig -d

    23. リブートする
    24. init 6
      exit

2009年10月15日木曜日

第11回 シェルスクリプト(その1 概要)

今までに、手作業でしてきたことを、viで追加しているところはcatで、編集しているところをsedに変えて、一部sedでは処理が複雑になるところをAWKに代えてシェルスクリプトで記述した、基本的に、これまで使用してきたコマンドを並べた程度なので、以降、重複した解説を省き、相違点のみを説明する。

また、ここにあるシェルスクリプトは、なるべく変数を使わないようにしている。そのため、冗長な面もあるが、前後の処理に関係なく文脈にとらわれずに、不要な処理はコメントアウトして、必要な処理はそのまま残して、あるいは必要な部分だけ切り取って実行することができる。

シェルスクリプトの実行は指定されたユーザーによって、FTPによって任意のディレクトリ(消し忘れの無い/tmpを推奨する)転送してtelnetから、またはCD-ROM、FD、USBメモリ等の外部メディアが使用できる場合、サーバーのコンソールでコピーして実行することもできる。

たとえば「Oracle インストールの前準備」のスクリプト(oracle_install_1r.sh)をFTPによって/tmpに転送した場合は、下記のとおり実行権限を与え実行する。

# cd /tmp
# chmod u+x oracle_install_1r.sh
# ./oracle_install_1r.sh

USBメモリの場合は差し込むと、/rmdisk以下にオートマウントされる。下記のようにシェルスクリプトがどこにあるのかを調べて、実行権限はすで付与されているので実行するだけである。終了したら「eject」でアンマウントした後に抜き取る。

# df -h|grep rmdisk
/vol/dev/dsk/c2t0d0/noname:c 489M 360M 129M 74% /rmdisk/noname
# find /rmdisk/noname -name oracle_install_1r.sh -ls
34568 3 -rwxrwxrwx 1 root root 2059 Sep 29 16:37 /rmdisk/noname/SOLARIS/shell_script/oracle_install_1r.sh
# /rmdisk/noname/SOLARIS/shell_script/oracle_install_1r.sh
    …
# eject rmdisk

なお、DOS/Windows作成したシェルスクリプトが改行コードが「CR」、「LF」形式の場合には、viにより「:%s/^M//g」として(^Mは「Ctrl」+v、「Ctrl」+mとタイプする)置換する。

Screen   103

sed(StreamEDitor:セド)ファイルまたはパイプラインから入力したテキストデータを、主に文字列置換を行って出力する、次の2つの文型を使用している。

  1. sed 's/検索文字列/置換文字列/' 入力ファイル > 出力ファイル
  2. 入力ファイルを読み込み、最初に一致した検索文字列を、置換文字列で置換して出力ファイルに書き込む。

  3. sed -f スクリプトファイル 入力ファイル > 出力ファイル
  4. 入力ファイルを読み込み、スクリプトファイルの定義に従い置換して、出力ファイルに書き込む。

AWK(オーク)はファイルまたはパイプラインから入力したテキストデータのフィールド処理に適したプログラムである、次の2箇所に使用している。

  1. cat /etc/release|head -1|awk '{print $3}'
  2. /etc/releaseファイルの1行目をAWKに渡す処理である、同ファイルの1行目はリビジョンによって次のようになっている。

    • 3/05
    • Solaris 10 3/05  …  

    • 5/09
    • Solaris 10 5/09  …  

    すなわち、空白で区切られた3カラム目のリビジョンを「awk '{print $3}'」によって取得する。

  3. echo `prtdiag|grep 'System Configuration:'|awk '{print $NF}'`
  4. $NFはフィールド数なので、終わりのカラムを出力する。

    すなわち、prtdiagが出力した'System Configuration:'がある行の末尾のカラムに機種が入っているので、それを取得する。

2009年10月14日水曜日

第10回 ブータブルなリカバリディスクの作成

前回ではFlashアーカイブをDVDに焼いただけであり、これだけでは、インストール作業を途中まで行わなくてはならずtar、cpio、ufsdump、ufsrestoreコマンドを使用して、バックアップを取って、リストアすることと大差は無い。このためブータブルなリカバリDVDを作成して、DVDからのブートとFlashアーカイブの復元を組み合わせた、Windowsでいうところの「Acronis True Image」「Norton Ghost」といったバックアップソフト並みに一連のリカバリ作業を自動化すれば、煩わしい手作業から開放されるのだ。

簡単に言えば、ブータブルなリカバリDVDはSolariaインストールディスクにあるプログラムとFlashアーカイブというデータを組み合わせたものである。ここで言うプログラムとは、PCの電源を入れるとBIOSが起動して、DVDからブートローダーが読み込まれ、ブートローダーはインストールミニルート(以降ミニルート)と呼ばれるインストールに必要な最小限のOSを起動する、ミニルートはインストーラを起動する、インストーラ(特にJumpStart と呼ばれる自動インストーラ)はFlashアーカイブの内容をディスクに書き込む、・・・といった連鎖によってリカバリ作業を実行していくものを指す。

  1. ブータブルなリカバリDVDの作成
    1. rootユーザーで入り、以下のようにブータブルなリカバリDVDを作成する。

    2. Oracleの停止
    3. Oracleを停止する

      # /etc/init.d/dbora stop

    4. Flashアーカイブの作成
    5. 前回と同じようにFlashアーカイブを作成するが、最終的にはDVDにブートイメージを含めるで、1段階層を深くして/dvdimage以下に作成する。なおここが起点であり、DVDがマウントされたときの先頭ディレクトリになるところである。

      # mkdir -p /dvdimage/flash
      # flarcreate -n solaris_oracle_initial -c /dvdimage/flash/soi.flar

    6. インストールディスクのコピー
    7. インストールディスクから不要部を除いて、ハードディスクにコピーする。不要部とはインストーラと、それを実行するための必要環境以外のソフトウェアのことである、インストールディスクに入ったSolasisシステムをインストールするのではなく、Flashアーカイブに入ったSolasisシステムをインストールするので、出来る限り不要部は除外するほうが望ましく、空いた分だけ大きなFlashアーカイブが入ることになる。Solasisのインストールシステムは./Solaris_10以下に入っている。ただし/Solaris_10/Misc以下にはJumpStartのサンプルが入っているので、この部分だけはコピーしておく。

      ドライブにインストールディスクを入れて、インストールディスク全体を「Solaris_10/Misc」以外の「Solaris_10」ディレクリを除外して「cpio」コマンドによってコピーする。

      DVDイメージの展開先を「/dvdimage」とした、コピー元の「/cdrom/cdrom0」はドライブが一台の場合、メディアを入れると通常はここにオートマウントされる。最初のコピーは.「/Solaris_10以外」にフィルター、次のコピーは「Solaris_10/Miscのみ」のフィルターをかけてコピーする。

      # cd /cdrom/cdrom0
      # find . -depth -print|grep -v ./Solaris_10|cpio -pdm /dvdimage
      # find Solaris_10/Misc -depth -print|cpio -pdm /dvdimage

    8. ミニルートの展開
    9. ミニルートはRAMディスクに展開されてから、実行される、このため決められた形式があるので、操作には専用コマンドを用いる。すなわち、root_archiveコマンドにunpackオプションを使用してインストールディスクの「boot/x86.miniroot」を「/dvdimage/miniroot」以下に展開する。以上でインストールディスクから必要なものはコピーしたので、ホームディレクトリに戻り、インストールディスクを取り出す。

      # mkdir -p /dvdimage/miniroot
      # /boot/solaris/bin/root_archive unpack /cdrom/cdrom0/boot/x86.miniroot /dvdimage/miniroot
      # cd
      # eject cdrom

    10. sysidcfgの作成
    11. 「sysidcfg」は手動インストールの場合に入力する値をプロファイル化したものである。配置するディレクトリに移動して、元を(空リンクのシンボリックリンクになっている)を保存する。次にrootのシャドウパスワード(下記では“abcdefghijklm”と記す)を求めておいて、「sysidcfg」を新規作成する。

      # cd /dvdimage/miniroot/etc
      # mv sysidcfg sysidcfg.org
      # cat /etc/shadow|grep root
      root:abcdefghijklm:6445::::::
      # vi sysidcfg

      先に求めたrootのシャドウパスワードをroot_passwordの右辺に入れて、下記のように「sysidcfg」を作成する。なお、root_password以外の項目は手動インストールで設定した値と同じである。

      name_service=none
      network_interface=rtls0{dhcp protocol_ipv6=no}
      root_password=abcdefghijklm
      security_policy=none
      system_locale=ja
      timezone=Asia/Tokyo
      timeserver=localhost
      nfs4_domain=dynamic

    12. profindの修正
    13. インストレーションスクリプト「profind」はインストラーが参照するプロファイルがある場所をマウントする。ただしそれを行っている箇所が条件文によって通過しないので、無条件に通過してマウントするように修正する。

      # cd /dvdimage/miniroot/usr/sbin/install.d
      # cp -p profind profind.org
      # vi profind

      「201G」で201行目に飛び、下記のように修正する。

      if [ -f /tmp/.preinstall ]; then
          ↓
      if [ true ]; then

    14. install-solarisの修正
    15. 「第2回 Solaris 10 5/09(10/08)のインストール」の「BIOS(Basic Input/OutputSystem)の設定」で述べたように、CD-ROMの自動排出の指定は無効なオプションなので、同稿のようなBIOSの対策を取らないと、手動排出しない限り気がつかないままに、リカバリを繰り返し、そこから脱出できない。そこで下記のようにインストールスクリプトを修正して、リブートの直前になったらビープ音を鳴らしてユーザに注意を促し、ユーザはリブートのころを見計らって、DVDからブートが始まる前に、即座にメディアを取り出すようにする。

      インストーラの実体は「install-solaris」というシュルスクリプトである。それの処理の最後でリブートをしている直前に、ビープ音を鳴らす処理を付け加える、 (100秒間繰り返すようになっているが、短すぎる、あるいは長すぎる場合は100の数値を変更する。) 

      # cd /dvdimage/miniroot/sbin
      # cp -p install-solaris install-solaris.org
      # vi install-solaris

      920行目の「reboot」の前に下記の網伏せ部分を追加する、修正したら「:wq!」で強制書き込みをして終了する。

      if ["$ESTATUS" -eq 0 ] ; then
          i=0
          while [ $i -lt 100 ];do
            tput bel
            sleep 1
            i=`expr $i + 1`
          done
          reboot
      elif ["$ESTATUS" -eq 1 ] ; then
          echo `gettext "Solarisinstallation program completed."`
      else
          echo `gettext "Solarisinstallation program exited."`
      fi

    16. ミニルートの圧縮
    17. 以上でミニルートの編集が終わったので、今度はroot_archiveコマンドを使用してunpackとは逆にpackオプションを使用して「/dvdimage/miniroot」以下を「boot/x86.miniroot」に圧縮する。これで、ミニルートは完成したので。ミニルートからカレントディレクトリを移動して削除する。

      # /boot/solaris/bin/root_archive pack /dvdimage/boot/x86.miniroot /dvdimage/miniroot
      # cd
      # rm -r /dvdimage/miniroot

    18. GRUBメニューの編集
    19. GRUBの画面で表示されるメニューから、installオプションによってJumpStartが実行されるように編集する。

      # cd /dvdimage/boot/grub
      # cp -p menu.lst menu.lst.org
      # vi menu.lst

      下記の網伏せ部分を追加したら「:wq!」で強制書き込みをして終了する。

      default=0
      timeout=60
      title Solaris10 Jumpstart
          kernel /boot/multiboot kernel/unix - install -B install_media=cdrom
          module /boot/x86.miniroot

    20. rulesファイルの編集
    21. rules ファイルを作成する、書式は次のとおりでカラムはスペースで区切る、省略するカラムには「-」を入れる。

          [Rule keyword][Rule Value] [Begin script] [Profile] [Finish script]

      「/.install_config」へ移動する、ここは特に「JumpStartディレクトリ」になる所である。「rules」ファイルがチェックを受けて合格すると「rules.ok」という名前に変更されるので、これを「rules」ファイルの前回分として保存して、rules ファイルを編集する。

      # cd /dvdimage/.install_config
      # mv rules.ok rules.ok.org
      # vi rules

      サンプルは/dvdimage/Solaris_10/Misc/jumpstart_sample/rulesであるが、ファイルの内容は下記の1行だけでよいので新規作成する。内容は「any -」で特定は無し、「-」で開始スクリプトは「x86-begin」、プロファイルは「any_machine」を使用、「-」で終了スクリプトは無し、と設定した。

      any - x86-begin any_machine -

    22. profileの作成
    23. サンプルは/dvdimage/Solaris_10/Misc/jumpstart_sample/any_machineであるが、これも流用できるところがほとんど無いのでviを起動して新規作成する。

      # vi any_machine

      下記の追加を行う。

      # profile keywords  profile values
      #---------------- -------------------
      install_type flash_install
      archive_location local_file /cdrom/flash/soi.flar
      partitioning explicit
      filesys    any  free /
      filesys    any   4096 swap

      設定した定義内容は下記のとおり。

      install_type flash_install  …  フラッシュアーカイブによる上書きインストール
      archive_location local_file /cdrom/flash/soi.flar  …  フラッシュアーカイブのパスネーム
      partitioning explicit  …  パーティションをfilesysによって指定
      filesys    any  free /  …  スワップを割当てた残りを全部
      filesys    any   4096 swap  …  スワップサイズは4096M バイト

    24. 開始スクリプトの作成
    25. 開始スクリプトは下記のとおりサンプルをコピーして、そのまま使用する。

      cp -p /dvdimage/Solaris_10/Misc/jumpstart_sample/x86-begin .

    26. profileのチェック
    27. カレントディレクトリのrules ファイルをチェックして、rules.okを作成する。

      # /dvdimage/Solaris_10/Misc/jumpstart_sample/check
      Validating rules...
      Validating profile profile...
      The custom JumpStart configuration is ok.

    28. DVDイメージファイルの作成
    29. /dvdimage以下を「mkisofs」コマンドによってDVDディスクイメージに変換する。ISO9660(CD-ROM の標準ファイルシステム)を拡張してEl Toritoによってブート可能にして、Rock Ridge (ロックリッジ)によってUNIX 系ファイルシステムのアクセス権、シンボリックリンク、ファイル名、ディレクトリ階層をサポートする。使用するオプションは下記のとおりである。

      # cd /dvdimage
      # mkisofs -o /dvdimage/flash/soi.iso -b boot/grub/stage2_eltorito -c .catalog -no-emul-boot -boot-load-size 4 -boot-info-table -relaxed-filenames -N -L -l -r -J -d -D -V SOL_10_1008_X86_JUMPSTART .

      使用したオプションは下記のとおりである。

      -o /dvdimage/flash/soi.iso  …  作成するイメージのパスネーム
      -b boot/grub/stage2_eltorito  …  ブートローダーに「stage2_eltorito」を使用
      -c .catalog  …  ブートカタログに「.catalog」を使用(相対パス)
      -no-emul-boot  …  非エミュレーションモード、stage2_eltoritoをそのまま実行
      -boot-load-size 4  …  4セクタ(512バイト) ロードする
      -boot-info-table  …  ブートファイルの指定位置ににブート情報テーブルを挿入する
      -relaxed-filenames  …  ファイル名に小文字を除く全ての7ビットASCII文字を含む
      -N  …  バージョン番号を除外
      -L  …  ドットファイル名を許可
      -l  …  ファイル名を31文字まで許可
      -r  …  RockRidge拡張形式
      -J  …  Jolietディレクトリレコード
      -d  …  ファイル名末尾のドットを除外
      -D  …  深いディレクトリ階層の再配置をしない

      El Torito(エル・トリート)とは

      このメキシコ料理のレストランの名前を冠したものは、CD-ROMブートに関する仕様(「“El Torito” Bootable CD-ROM Format Specification Version 1.0」)である。仕様の内容をかいつまみ説明すると、CD-ROMの16セクタ目の「Primary Volume Descriptor」に続き17セクタ目に、「Boot Record Volume Descriptor」がある、そこには「Boot catalog」へ絶対のアドレスが入っているので、「Boot catalog」へジャンプする。「Boot catalog」からやはり「Boot Image」への絶対のアドレスが入っているので、「Boot Image」へジャンプする。「Boot Image」の内容をメモリにロードして実行する。

    30. DVDに書き込み
    31. ドライブにDVDのリライタブルメディアを入れて、初期化が済んでいない場合は、「cdrw」コマンドに「-b」オプションを使用して初期化する(通常は「fast」、初期化できない場合は「all」によって時間がかかるが全体を初期化する)。次に「-b」オプションを使用してイメージファイルを書き込む。

      (# cdrw -b fast)
      # cdrw -i /dvdimage/flash/soi.iso

    32. ワークエリアの消去
    33. イメージファイルが無事書き込まれたら、下記のとおり使用したディレクトリ以下のファイルを削除して、終わり。

      # rm -r /flash

  2. リカバリ
    1. リブート
    2. ドライブにDVDを入れたまま、DVDからリブートするとリカバリが始まる。

      # init 6

    3. リブート後の処理
    4. Flashアーカイブからのリカバリが終了すると、「第3回Oracle インストールの前準備」で設定した下記の情報が飛んでしまうので、リブート後に再設定を行う。

      • ホスト名を設定する
      • ログホストを定義する
注Solaris 10 3/05
今回の内容はブート形式が違うため、適応外である。

2009年10月10日土曜日

第9回 Flashを使用したバックアップ

    SolarisとOracleをインストールをして、環境の構築とその動作状況をチェックを終えたらバックアップを取っておきたい。今後の使用でのハードウェア障害、または設定変更に伴う論理的破壊に備えるためである。

    PCにおいて、バックアップに、ドライブもメディアも高価なテープを使用することはほとんど無い。頃合も丁度良く、ここまでの作業内容が1枚のメディアに余裕で収まるDVDが妥当な選択であるので、それにFlashアーカイブを収めることとする。メディアは失敗しても書き直しがきく、RW(リライタブル)に書き込む。

    以下はrootユーザーでの作業である。

  1. Flashアーカイブの作成
  2. これから行う作業で必要なディスクスペースは、外部メディアに書き込むまで、圧縮したアーカイブファイルが約3.35Gバイト、DVDイメージファイルだと少し増えて3.5 Gバイト、計約 7Gバイト弱が必要になる。swap領域すなわち/tmp以下のディレクトリで作業を行えば、次回の起動時に跡形も無く消去されるので都合が良いのだが、そこまでをswapに割り当てていることはまず無いので、ここではroot直下に/flashディレクトリを作成してそこで作業を行い、作業終了後はディレクトリ以下を消去する。

    1. Oracleの停止
    2. 「init s」としてシングルユーザーモードに移行してから行うのが理想的だが、それではマスターコンソール以外では実行できない。Oracleだけは停止するが、他のデータも変動しないように、アーカイブファイルの作成中は他機からの接続と、自機も含めたバックアップ以外の作業を中止して対処する。

      # /etc/init.d/dbora stop

    3. flarcreateによるFlashアーカイブの作成
    4. Flashアーカイブは「flarcreate」、または「flar create」コマンドによって作成する。必須オプションは下記の構文のとおりである。

      flarcreate(flar create) -n [name] [path/filename]
      [name]  …  ファイル内部で保持するアーカイブ名。
      [path/filename]  …  作成するパスとアーカイブファイル名。

      アーカイブ名、パスとアーカイブファイル名は任意である。ここでは、「-c」オプションによって圧縮することを加えて、下記のとおり指定する。

      # mkdir -p /flash
      # flarcreate -n solaris_oracle_initial -c /flash/soi.flar

    5. mkisofsによるイメージファイルの作成
    6. 下記のとおりアーカイブファイルを「mkisofs」コマンドに「-r」オプションを使用して、ISO9660を拡張した「ロックリッジ形式」のイメージファイルに変換する。イメージファイルのパスネームは「/flash/soi.iso」とした。

      # mkisofs -r /flash > /flash/soi.iso

    7. cdrwによるメディアへの書き込み
    8. ドライブにDVDのリライタブルメディアを入れて、初期化が済んでいない場合は、「cdrw」コマンドに「-b」オプションを使用して初期化する。次に「-b」オプションを使用してイメージファイルを書き込む。

      (# cdrw -b fast)
      # cdrw -i /flash/soi.iso

    9. ワークの削除
    10. イメージファイルが無事書き込まれたら、下記のとおり使用したディレクトリ以下のファイルを削除して、終わり。

      # rm -r /flash

  3. Flashアーカイブからのリカバリ
  4. Flashアーカイブにバックアップしたデータを、リカバリするためには、Solarisのインストールを途中まで行い中断する、そして、Solarisインストールディスクからバックアップディスクへメディアを交換して、フラッシュモードでインストールを続行する。

    1. 「Solaris Interactive Installation」の画面で中断する
    2. Solarisインストールディスクをドライブに入れてリブートさせて、「Solaris Interactive Installation」の画面まで進めて、いったんインストールを抜ける。操作方法は、画面下にF2_StandardF3_Go Back F4_Flash F5_Exit F6_Helpと表示されているので、「F5_Exit」を選択して、次の画面で「F2_Exit Installation」を選択する。

      Screen   98

      Screen   99

    3. コンソール画面
    4. コンソール画面になったら、「df」コマンドでCD-ROMのデバイス名を調べ、「eject」コマンドでSolarisのインストールディスクを取り出し、作成したFlashアーカイブが入ったディスクに交換する。

      # df -h|grep cdrom
      /dev/dsk/c1t0d0p0   2.2G   2.2G  0K   100%   /cdrom
      # eject /dev/dsk/c1t0d0p0

      Flashアーカイブの入ったDVDメディアをマウントして、インストールを再開する。

      # mount -F hsfs /dev/dsk/c1t0d0p0 /cdrom
      # install-solaris
      Screen   100

    5. SolarisInteractive Installation
    6. 「Solaris Interactive Installation」の画面に戻るので、今度は「F4_Flash」を選択する。

      Screen   101

    7. Reboot After Installation
    8. 「Reboot After Installation?」と「Information」の画面では「F2_Continue」を選択して、「Flash Archive Retrieval Method」の画面まで進め、「Local File」を選択する。

      [ ] HTTP
      [ ] FTP
      [ ] NFS
      [X] LocalFile
      [ ] LocalTape
      [ ] LocalDevice
      Screen   102

    9. Flash Archive Addition
    10. 「Flash Archive Addition」の画面では、「Path」に次のようにタイプして次に進むと、「Flash Archive Selection」画面が表示されるので確認のうえ次に進む、後のオペレーションはSolarisのインストールと同じように進めば、リカバリが始まる。

      Path:/cdrom/soi.flar
      Screen   103

    11. Flash Archive Addition
    12. Flashアーカイブからのリカバリが終了すると、「第3回 Oracle インストールの前準備」で設定した下記の情報が飛んでしまうので、リブート後に再設定を行う。

      • ホスト名を設定する
      • ログホストを定義する
      注Solaris 10 3/05

      インストールディスクを取り出して、Flashアーカイブのディスクに交換することはできない。これは10/08のインストーラがFlashアーカイブの処理をメモリ上に展開してしまっているので、インストールディスクは不要であるのに対して、3/05ではインストールディスクをまだ必要としているからである。

      3/05での現実的な対応は、FlashアーカイブをFTPサーバー(FTPサービスが動けばWindows、UNIXの別は問わない)に転送して、「Solaris Interactive Installation」の画面で「FTP」を選択するのが、簡単、確実の方法である。

2009年10月9日金曜日

第8回 開発環境の構築

    ディレクトリ/usr (UnixSystem Resources)以下には、一般に使用するユーザコマンド、共有ライブラリ、そして開発環境が入っている。開発環境はさらに系統別に分類され下記のディレクトリに置かれる。

    /usr/ccs (C Compiler Support)   …   SystemV系
    /usr/sfw (Sun Free Ware)   …   GNU系
    /usr/ucb (University ofCalifornia Berkeley)   …   BSD系

    開発環境の構築といっても、Oracleユーザのプロファイルには、パスと環境変数が設定済みであるので、それをそのまま使用するか、ユーザを新規に作成する場合はプロファイルをコピーすれば、すでにパスが通っているので、下記のSolaris 10 にバンドルされている、コンパイラなどは直接起動できる。

    GNU Cコンパイラ、リンカ(3.4.3)   …   /usr/sfw/bin/gcc
    Solarisリンカ(5.10-1.493)   …   /usr/ccs/bin/ld
    GNU make(3.80)   …   /usr/sfw/bin/gmake
    Solaris make   …   /usr/ccs/bin/make

    加えてOracle 10gをインストールしたのでPro*C/C++、すなわち埋め込みSQL(Embedded SQL)をコンパイル前に処理するプリコンパイラ(precompilerまたはプリプロセッサpreprocessorと呼ぶ)と、SQL処理のライブラリが装備されている。なおかつ、本回までの作業を終えているならば、オラクルとの接続が確立されているはずで、C 言語によるOracle データベースへアクセスするプログラムの開発条件が満たされているので、それの開発を試みる。

  1. ソースプログラムの準備
  2. Oracleインストールの事前準備の設定で、必要な環境条件が調っている「oracle」ユーザーでログインして、下記の静的SQL(staticSQL.pc)と動的SQL(dynamicSQL.pc)のソースファイルを2種類作成する。置く場所は任意である。プログラムの内容は、Oracleに「scott」ユーザーで接続して、自分のテーブルの数をカウントして表示するという、ごく単純で短いものだ。

    両者は同じSQL文を使用しているが、静的SQLと動的SQLの違いは、静的SQLがSQL文をリテラルで保持しているのに対して、動的SQLは文字列変数内に保持していることである。プリコンパイラはさすがに文字列の中身までは解析しないし、いつ変わるとの知れない、文字通り「変数」の中身を解析するのは無意味なことなのだ。

    静的SQL(staticSQL.pc)

    #include <sqlca.h>
    int main () {
        EXEC SQL BEGIN DECLARE SECTION; 
            char *username = "scott/tiger"; 
            int rows=0;
        EXEC SQL END DECLARE SECTION; 
        EXEC SQL CONNECT: username;
        EXEC SQL select count (*) into:rows from user_tables;
        printf ("%d rows\n", rows);
        exit (0);
    }

    動的SQL(dynamicSQL.pc)

    #include <sqlca.h>
    int main() {
        EXEC SQL BEGIN DECLARE SECTION;
            char *username="scott/tiger";
            char statement[256];
            int rows;
        EXEC SQL END DECLARE SECTION;
        EXEC SQL CONNECT: username;
        sprintf(
            statement, 
            "begin "
            "select count(*) into:rows from user_tables;"
            "end;"
        );
        EXEC SQL PREPARE statement_id FROM :statement;
        EXEC SQL EXECUTE statement_id USING :rows;
        printf ("%d rows\n", rows);
        exit(0);
    }

  3. Pro*Cによるプリコンパイル
  4. Pro*CによるプリコンパイルでPro*Cのソースプログラム(*.pc)からCコンパイラが理解できるCのソースプログラム(*.c)に変換する。変換する内容は、「EXECSQL」から「;(セミコロン)」までの実行ステートメントをSQLLIB(ランタイムライブラリ)の関数をコールするソースコードに置き換え、「EXEC SQL BEGIN DECLARESECTION;」から「EXEC SQL END DECLARESECTION;」までに入っている、C言語のプログラムとOracleが共有する変数、これをホスト変数と呼ぶが、両者が使用できるようにする。

    プリコンパイラは下記のように、拡張子なしでプログラム名を指定して実行する。また、オプションに、sqlcheck=fullに設定することで埋込みSQL構文の解析を完全に実行しておく、プリコンパイルでSQL構文の不備を撥ねるのだ。静的SQLでuseridオプションを指定しているのは、プリコンパイルの段階で、実際にこの接続先からSQL文中にあるテーブル構造を読み取りに行くので、必須のオプションである。

    静的SQL

    $ proc staticSQL sqlcheck=full userid=scott/tiger;

    動的SQL

    $ proc dynamicSQL sqlcheck=full;

    以降のコマンドライン・オプションは静的SQLと動的SQLで同一であるので、静的SQLのファイル名であるstaticSQLによって例示する。動的SQLの場合はそれをdynamicSQLに読み替えて使用されたい。

  5. GCCによるコンパイル
  6. GCC はコンパイラのみならず、プリプロセス、コンパイル、アセンブル、リンクの各機能を呼び出す親プログラムである。ここではコンパイルまでを行うので「-c」オプションを指定して、コンパイルの対象になるソースプログラムファイルを指定すると、同名で拡張子を「.o」に変えたオブジェクトコードを作成する。

    続いて「-I」オプションによってヘッダファイルを探すディレクトリを指定する。プログラム中でsqlca.hをincludeしている。これは「$ORACLE_HOME/precomp/public」の配下に有るのでその場所を指定する。

    静的SQL

    $ gcc -c staticSQL.c -I $ORACLE_HOME/precomp/public

    動的SQL

    $ gcc -c dynamicSQL.c -I $ORACLE_HOME/precomp/public

  7. リンク
  8. どちらが良いとはいえないので、リンカにGNUのコマンドを使った「gcc -o」と、Sunのコマンドを使った「ld」の、2種類のコマンドを例示する。

    先に下記のように環境変数を設定しておいたので、オプションの設定を簡略することが出来る。LD_LIBRARY_PATHを設定して置かないと、リンカは標準ライブラリ(「/usr/ccs/lib/」、「/usr/lib」)の中のみを検索するので、「-L」オプションを用いて、ライブラリを検索するパスを示してから、Oracleのライブラリを指定しなければならない。さらに、「-R」オプションによって、実行時にロードするライブラリへの検索パスを、実行プログラムに組み込む必要がある。したがって、この環境変数を設定しておくことによって、「-L」、「-R」オプションの設定を省略することが出来る。

    LD_LIBRARY_PATH=$ORACLE_HOME/lib

    標準ライブラリではない、または環境変数に定義していない任意のライブラリは、「-L」と「-l(小文字のL)」オプションと組み合わせて使用する。リンカは、「-L」で指示されたパスを起点にして、そこから「-l」で指定したライブラリ名に接頭辞「lib」を加えたものを、共有ライブラリ(shared library)、スタティックライブラリ(static library)の順に検索する。すなわち拡張子を「.so」、「.a」の順に加えて検索したライブラリを、リンクリストに加えるオプションである。

    例えば、「-lclntsh」と指定した場合は、LD_LIBRARY_PATH で指定してあるので、「-L」オプションは不要であり、$ORACLE_HOME/lib/以下の共有ライブラリ「libclntsh.so」を検索して、そこからシンボリックリンクを張った「libclntsh.so.10.1」をリンクリストに加え、実行時リンカは、実行時にこの共有ライブラリを結合する。

    • gcc -o
    • リンクにGCCを使用する場合は下記のように行う。すなわち「-o」オプションでリンクを指定して、実行ファイル名、リンクするオブジェクトコード、そしてライブラリを指定して、実行ファイルを作成する。

      静的SQL

      $ gcc -o staticSQL staticSQL.o -lclntsh

      動的SQL

      $ gcc -o dynamicSQL dynamicSQL.o -lclntsh

    • ld
    • 下記は「gcc -o」では暗黙でリンクされるが「ld」ではリンクされないライブラリである。これが両者の違いであるので「ld」では明示する。

      • -lc  …  Cの標準関数を含むライブラリ(libc.so)
      • crt1.o、crti.o、crtn.o  …  Cラインタイムオブジェクト(C RunTime startup)

      したがって、「ld」ではそれらを追加して下記のように行う。なお、Cラインタイムオブジェクトは「gcc -o」は/usr/lib以下のオブジェクトを使用しているが、ここではOracleライブラリのものを使用した。

      静的SQL

      $ ld -o staticSQL staticSQL.o $ORACLE_HOME/lib/prod/lib/crti.o $ORACLE_HOME/lib/prod/lib/crt1.o $ORACLE_HOME/lib/prod/lib/crtn.o -lc -lclntsh

      動的SQL

      $ ld -o dynamicSQL dynamicSQL.o $ORACLE_HOME/lib/prod/lib/crti.o $ORACLE_HOME/lib/prod/lib/crt1.o $ORACLE_HOME/lib/prod/lib/crtn.o -lc -lclntsh

  9. プログラムの実行
  10. 出来上がった実行ファイルを実行すると、scottがオーナーであるテーブル数、すなわち「DEPT」、「EMP」、「BONUS」、「SALGRADE」の4個のテーブルがカウントされ、下記のように表示される。

    静的SQL

    $ staticSQL
    4 rows

    動的SQL

    $ dynamicSQL
    4 rows

  11. makeの使用
  12. 「make」というコマンドを実行すると、カレントディレクトの中のファイルをmakefile、Makefile (以降makefileで統一)の順に探し、その記述を読み込んで実行する。記述には実行可能ファイル作成までの手順が書かれている。後で示すmakefileが既に作成済みであるとすると、「-n」オプションを加えて実行した結果は下記のとおりであり、プリコンパイル、コンパイル、リンクが順次実行される様子が分かる。

    $ make -n staticSQL
    proc sqlcheck=full iname=staticSQL.pc userid="scott/tiger"
    gcc -c staticSQL.c -I. -I$ORACLE_HOME/precomp/public -I$ORACLE_HOME/rdbms/public
    gcc -o staticSQL staticSQL.o -lclntsh `cat $ORACLE_HOME/lib/sysliblist`

    これだけではシェルスクリプトにコマンドをならべたことと同じであるが、make は依存関係の検査という仕組みを使用して、生成するファイルが、そのファイルの生成に影響するファイルよりも新しい場合は、該当するコマンドは実行しない。これにより、更新されたファイルに関連性のあるものだけを処理するため、不要な処理を抑制することが出来る。

    makefileはターゲット行、シェルコマンド行、マクロ定義 インクルード行によって構成される。ターゲット行は下記のように、対になるコマンド行と構成される場合は、これをルール(rule)と呼ぶ。

    ターゲット(targets) : 前提条件ファイルのリスト(dependents)
    [tab]コマンド(command)

    「ルール」の記法には、サフィックスルール(suffix rule)とパターンルール(patternrule)がある。パターンルールを用いて、プリコンパイルを行う場合は、下記のように記述する。すなわち下記は、%.pcから%.cをproc…コマンドによって作成するという意味になり、「%」はmakeを「make [options] [target] 」のように起動したときの[target]が置き換わる。「$<」は自動変数と呼ばれ、ここでは「%.pc」、要するにPro*Cのソースプログラムが該当する。

    %.c: %.pc
        proc sqlcheck=full iname=$< userid="scott/tiger"

    一連の処理を下記のmakefileにまとめた、これをソースプログラムと同じディレクトリに保存する。

    CFLAGS = -I. -I$$ORACLE_HOME/precomp/public -I$$ORACLE_HOME/rdbms/public
    LIBS = $$ORACLE_HOME/lib/prod/lib/crti.o $$ORACLE_HOME/lib/prod/lib/crt1.o $$ORACLE_HOME/lib/prod/lib/crtn.o -lc
    ORA_LIBS = -lclntsh `cat $$ORACLE_HOME/lib/sysliblist`
    %.c: %.pc
        proc sqlcheck=full iname=$< userid="scott/tiger"
    %.o: %.c
        gcc -c $< $(CFLAGS)
    %: %.o
    #    ld -o $@ $< $(LIBS) $(ORA_LIBS)
        gcc -o $@ $< $(ORA_LIBS)

    • コマンド行のインデントはタブでなくてはならない
    • viでこのページからコピー&ペーストする場合には、次のように置換する。([tab]はタブを入力)
      :%s/[スペース4文字]/[tab]/g

    • 「$@」は自動変数であり[target]と同じになる。
    • 汎用的に使えるように、よく使われるヘッダー、ライブラリを追加してある。
    • 行頭が「#」の場合はコメントである、したがって、この例ではgccのリンカが有効になっている。Solarisリンカを使う場合はgcc …をコメントアウトして、ld …をコメントインする。

    下記のとおりmakeを起動すると、実行可能ファイルが作成される。

    静的SQL

    $ make staticSQL

    動的SQL

    $ make dynamicSQL

    あるいは、下記のようにすると指定したターゲットまでの中間処理までをおこなう。

    静的SQL

    $ make staticSQL.o

    動的SQL

    $ make dynamicSQL.o

    • GNU makeを使用するときには、コマンドを「make」から「gmake」に変更する。
    • 依存関係を無視して、無条件にmake する場合は「-u」オプションを使用する。gmakeの場合は依存するファイルにtouchして日時を生成するファイルよりも新しくする。

2009年10月5日月曜日

第7回 Webサーバーの起動

    Solaris 10 には、ApacheはVersion 1.3.41と2.0.63(以降Apache/1.3.41、Apache/2.0.63)が、Tomcat はVersion 4.0.5と5.5.27(以降Tomcat/4.0.5、Tomcat/5.5.27)が付属している。これらはほんの少しの設定を行うことにより、稼動状態になるようにパッケージングされている。さらに、Tomcat はServlet/JSPの処理を行う「サーブレット・コンテナ」の機能だけではなく、単体でもWebサーバーとして機能するので、Tomcat単体、Apache単体、Apache/1.3.41とTomcat との組み合わせ等、何をWebサーバーとするのかで、多様な選択が可能になっている。

    注 Solaris 10 3/05 Tomcat/5系はインストールされていないので、Tomcat/4系のみを使用する。

    以下rootユーザーから実行する。

  1. Tomcat/4.0.5の単体起動
  2. 下記のように設定ファイルを作成して、Tomcatを起動して、動作確認を行う。

    1. 設定ファイルの作成
    2. Tomcat の動作は設定ファイル「/var/apache/tomcat/conf/server.xml」で制御されるので、同パスにあるテンプレート「server.xml-example」をこれにコピーすることにより作成する。

      # cd /var/apache/tomcat/conf
      # cp -p server.xml-example server.xml

    3. Tomcatの起動
    4. TomcatはJava環境上で動作するので、Java環境の位置「JAVA_HOME」と、起動するTomcatの位置「CATALINA_BASE」を環境変数に定義して、「startup.sh」で起動させる。停止は「shutdown.sh」である。

      # JAVA_HOME=/usr/java; export JAVA_HOME
      # CATALINA_BASE=/var/apache/tomcat; export CATALINA_BASE
      # /usr/apache/tomcat/bin/startup.sh
          …
      # /usr/apache/tomcat/bin/shutdown.sh

    5. 動作確認
    6. Tomcatは起動するとserver.xmlで設定したポート8080でリスニングして待機状態であるので、クライアントのブラウザーからはURLに「http:// server_addr :8080」を指定して、HTTPリクエストをWebサーバーであるTomcatに送信すると、HTTPレスポンスの返信であるTomcat Version 4.0.5の画面が表示される。ここから「JSP Examples」、「Servlet Examples」をクリックして、それぞれのメニューからJSP・Servletのプログラムをクリックすると「サーブレット・コンテナ」としてのTomcatの動作確認ができる。

      Screen   94

  3. Tomcat/5.5.27の単体起動
  4. 下記のように設定ファイルを作成して、Tomcatを起動して、動作確認を行う。

    「apache」配下の「tomcat」ディレクトリには、Tomcat Version 4.0.5関連が入っている。その隣に「tomcat55」ディレクトリにはVersion 5.5.27関連が入っている。両ディレクトリは対称性があるため、起動方法はVersion 4.0.5と同じで、パスに「tomcat」とある場合はそれを、「tomcat55」と読み替えればよい。

    1. 設定ファイルの作成
    2. # cd /var/apache/tomcat55/conf
      # cp -p server.xml-example server.xml

    3. Tomcatの起動
    4. # JAVA_HOME=/usr/java; export JAVA_HOME
      # CATALINA_BASE=/var/apache/tomcat55; export CATALINA_BASE
      # /usr/apache/tomcat55/bin/startup.sh
          …
      # /usr/apache/tomcat55/bin/shutdown.sh

    5. 動作確認
    6. Screen   94

    7. Webアプリケーションマネージャ用ユーザの追加
    8. 画面左上にある「Administration」メニューにある項目へのアクセスするユーザーは下表のロールが必要である。

      表96
      Administration roles
      Status manager
      Tomcat Administration admin
      Tomcat Manager manager

      このために、ユーザー情報の設定ファイル「/var/apache/tomcat55/conf/tomcat-users.xml」を編集し、ユーザーの追加を行う。下記の例ではユーザー名:aaa、パスワード:bbbによって設定ファイルの編集を行った。編集が終了したら、shutdown.sh、startup.shコマンドによって再起動すれば設定が有効になる。

      1. 「/var/apache/tomcat55/conf/tomcat-users.xml」を編集する。
      2. # cd /var/apache/tomcat55/conf
        # cp -p tomcat-users.xml tomcat-users.xml.org
        # vi tomcat-users.xml

      3. </tomcat-users>の前に追加する。
      4. <tomcat-users>
        ・・・
          <role rolename="admin"/>
          <role rolename="manager"/>
          <user username="aaa" password="bbb" roles="admin,manager"/>
        </tomcat-users>

        Screen   95

      5. shutdown.sh、startup.shコマンドによって再起動して設定を有効にする。
      6. # /usr/apache/tomcat55/bin/shutdown.sh
            …
        # /usr/apache/tomcat55/bin/startup.sh

  5. Apache/1.3.41の単体起動
  6. 下記のように設定ファイルを作成して、Apacheを起動して、動作確認を行う。

    1. 設定ファイルの作成
    2. Apache/1.3.41の動作は設定ファイル「/etc/apache/httpd.conf」によって制御されるので、同パスにあるテンプレート「httpd.conf-example」をこれにコピーすることにより作成する。

      # cd /etc/apache
      # cp -p httpd.conf-example httpd.conf

    3. Apacheの起動
    4. Apache/1.3.41の起動、停止は下記コマンドにオプションを付けて行う。起動は「start」、停止は「stop」である。
      /usr/apache/bin/apachectl

      # /usr/apache/bin/apachectl start
          …
      # /usr/apache/bin/apachectl stop

    5. 動作確認
    6. ブラウザで下記のURLを指定する。

      http:// server_addr

  7. Apache/2.0.63の単体起動
  8. 下記のように設定ファイルを作成して、Apacheを起動して、動作確認を行う。

    1. 設定ファイルの作成
    2. Apache/2.0.63の動作は設定ファイル「/etc/apache2/httpd.conf」によって制御されるので、同パスにあるテンプレート「httpd.conf-example」をコピーすることにより作成する。

      # cd /etc/apache2
      # cp -p httpd.conf-example httpd.conf

    3. Apacheの起動
    4. Apache/1.3.41の起動、停止はsvcadmコマンドでサービスの起動、停止をするという形を取る。起動は「enable」、停止は「disable」である。

      # svcadm enable apache2
          …
      # svcadm disable apache2

    5. 動作確認
    6. ブラウザで下記のURLを指定する。

      http:// server_addr

  9. Apache/1.3.22とTomcat/4.0.5の連携
  10. Apache、Tomcatの連携させるためには、Apache側では両者間を中継する拡張モジュールが必要になる。これをコネクタ(Web Server Connector)、またはアダプタ(Web Server Adapter)と呼び、Apache/1.3.22では下記のライブラリが用意されている。

    /usr/apache/libexec/mod_webapp.so
    /usr/apache/libexec/mod_jk.so
    /usr/apache/libexec/mod_jserv.so

    コネクタは、クライアントのブラウザがApacheに投げたHTTPリクエストのURLのパスが、設定したパターンがと一致するときに、ファイルシステムのパスにマップし、中継ポートを経由して、「mod_webapp」はWARP/1.0プロトコル、「mod_jk」はAJP(Apache JServ Protocol)/1.3プロトコル、「mod_jserv」はAJP/1.2プロトコルでTomcatにスルーする。すなわちフロントエンドにApacheを立てて、バックエンドにTomcatを設置した、Webサーバーとアプリケーションサーバーの連携プレーが可能になるのだ。

    Apache/1.3.22はTomcat/4.0.5との連携のコネクタに、「mod_webapp」を使用する。その際の処理は下記の設定ファイルによって制御されるので、設定状態の確認をして、必要ならば修正をする。

    /etc/apache/httpd.conf
    /etc/apache/tomcat.conf

    1. httpd.confの修正
    2. まずテンプレートをコピーして作成する。次にviにより、Includeディレクティブ行をコメントインして、ここにtomcat.confファイルを読み込むようにする。これによりhttpd.confの設定に続いてtomcat.confの設定が行われる。

      # cd /etc/apache
      # cp -p httpd.conf-example httpd.conf
      # vi httpd.conf

      ファイル末尾に「:$」で移動して、コメントインする。

      #include /etc/apache/tomcat.conf
        ↓
      include /etc/apache/tomcat.conf

    3. tomcat.confの修正(修正の必要なし、参考まで)
    4. デフォルトでコネクタはmod_webappを使用するように設定されているので、修正の必要はない。現状で下記のように定義されている。 (「LoadModule」ディレクティブで起動時に「mod_webapp」のmod_webappのダイナミックリンクライブラリをロードさせ、「AddModule」ディレクティブでソースコードを指定している。)

      LoadModule webapp_module libexec/mod_webapp.so
      AddModule mod_webapp.c

      Apache起動時に次のエラーが表示されるが、連携に支障はない。
      [warn] module mod_webapp.c is already added, skipping

      気になる場合は、ディレクティブをhttpd.confに移動させ、tomcat.confからはコメントアウトする。httpd.confへはLoadModuleとAddModuleの記述のそれぞれの末尾に追加する。そうすると正規のシークエンスで、すなわち一旦ClearModuleListによってモジュールの一覧をクリアした後にAddModuleで追加するのでエラーは発生しなくなる。


      下記のディレクティブ書式と現状の設定内容
      WebAppConnection conn warp localhost:8008
      WebAppDeploy examples  conn /examples/

      • 「WebAppConnection」
      • WebAppConnection [connection name] [provider] [host:port]

        すなわち、Apache、Tomcat間の接続に「conn」という名前をつけ、プロバイダーには「warp」を使用して、自サーバーの8008番ポートに接続する。

      • 「WebAppDeploy」
      • WebAppDeploy [application name] [connection name] [url path]

        すなわち、「conn」という名前の接続は、URLパターンが/examples/に一致したら、それをデプロイ先の/var/apache/tomcat/webapps/examplesにリダイレクトする。

    5. Tomcat側コネクタの設定
    6. Tomcat側では先に行った「Tomcat/4.0.5の単体起動」のようにserver.xml をテンプレートからコピーするだけでよい。Tomcatが起動すればWarpConnectorが待ち受けている。

      # cd /var/apache/tomcat/conf
      # cp -p server.xml-example server.xml

      server.xmlのConnectorタグの属性の意味は下記のとおりである。

      属性
      className インプリメントされているクラス名
      port サーバーソケットを形成して、待機しているTCPポート番号
      minProcessors コネクタが起動するとき作成するスレッド数
      maxProcessors 同時に受け付けたリクエストを処理するスレッド数の最大値
      enableLookups ホスト名をDNSから引くかどうか
      appBase アプリーケーションのベースディレクトリ
      acceptCount 接続リクエストの待ち行列の最大値。
      debug デバッグレベル

      server.xmlの記述は下記のようになっている。したがって、Tomcatが立ち上がった状態では8008番ポートにWARP 1.0プロトコルのメッセージが到着するのをリッスンしている。

      <Connector
      className="org.apache.catalina.connector.warp.WarpConnector"
      port="8008"
      minProcessors="5"
      maxProcessors="75"
      enableLookups="true"
      appBase="webapps"
      acceptCount="10"
      debug="0"
      />

    7. Tomcat、Apacheの起動
    8. Tomcat、Apacheの起動はすでに組み込まれているrcスクリプトを使用する。下記のシェルスクリプトは名前こそ違っているがハードリンクが張られていて、ノード先の実体のコードは同じものであり、引数に「start」を付ければ起動、引数に「stop」を付ければ停止する処理が書かれている。

      /etc/init.d/apache
      /etc/rc0.d/K16apache
      /etc/rc1.d/K16apache
      /etc/rc2.d/K16apache
      /etc/rc3.d/S50apache
      /etc/rcS.d/K16apache

      上記のスクリプトは、これまでにTomcat、Apacheの単体起動で説明してきたのと同様に下記の「httpd.conf」、「server.xml」ファイルの有無と、その内容によって制御される。「server.xml」が存在すればその内容によってtomcatの起動、停止を行い、「httpd.conf」は同じようにApacheの制御をする。

      なお、Tomcat/4.0.5用とTomcat/5.5.27用のserver.xmlが同時にある場合は、Tomcat/5.5.27が優先されて起動する。したがって前作業によって「/var/apache/tomcat55/conf/server.xml」が残っているならば削除する。

      /etc/apache/httpd.conf
      /var/apache/tomcat/conf/server.xml (Tomcat/4.0.5)
      /var/apache/tomcat55/conf/server.xml (Tomcat/5.5.27)

      rcスクリプトはランレベルが推移したときに、実行するのでシステムの起動と終了とTomcat、Apacheは同期して、自動起動と自動終了する。手動では、次のようにスクリプトに「start」引数を加えてタイプすればTomcat、apacheが起動して、「stop」引数を加えてタイプすれば終了する。

      # /etc/init.d/apache start
      # /etc/init.d/apache stop

    9. 動作確認
    10. これまでは直接Tomcat の8080ポートを指定して JSP、サーブレットのサンプル画面へ入っていたが、上記の「stop」と、「start」の操作をしてTomcat、Apacheを再起動した後は連携が有効になり、下記8080ポートの指定不要なURLの指定によって、ApacheからTomcatの「JSP Examples」、「Servlet Examples」へ入れるようになる。

      http:// server_addr /examples/jsp
      http:// server_addr /examples/servlets

  11. Apache/1.3.22とTomcat/5.5.27の連携
  12. 「Apache/1.3.22とTomcat/4.0.5の連携」と同じように「/etc/apache/httpd.conf」を修正する。これはすでに修正済みのはずなので省略する。「/etc/apache/tomcat.conf」はコネクタが「mod_webapp」に既定されているので、これを「mod_jk」に変更する。

    1. tomcat.confのバックアップをとる。
    2. /etc/apacheディレクトリに移動して、「tomcat.conf.org」の名前でバックアップをとり、viで「tomcat.conf」の編集に入る。

      # cd /etc/apache
      # cp -p tomcat.conf tomcat.conf.org
      # vi tomcat.conf

    3. tomcat.confの編集
    4. コメントアウトするのは「mod_webapp」の定義、コメントインするのは「mod_jk」の定義である。網伏せの部分が修正した結果になる、すなわちコメントインされている場合はコメントアウト、コメントアウトされている場合はコメントインして、同名(:w)でセーブする。なお末尾の「JkMount  /jsp-examples/* worker1」の行は原文にはない、追記する。

      #
      # Tomcat configuration file for apache - uses mod_webapp
      # as the connector.  Tomcat must already be running and listening
      # on port 8008 before apache starts.  This is typically handled
      # by the S50apache startup script.
      #
      # This file should be 'include'd by the main apache config file.
      #
      # Load warp connector module
      #
      #LoadModule webapp_module     libexec/mod_webapp.so
      #AddModule mod_webapp.c
      #
      # Describe connections and contexts - default to examples only
      #
      #WebAppConnection     conn    warp  localhost:8008
      #WebAppDeploy  examples     conn  /examples/
      #
      # Connector information - off by default for security reasons
      #
      # WebAppInfo  /webapp-info
       
      #
      # When Apache Tomcat 5.5 is used mod_jk module has to be used instead
      # of mod_webapp. In such case comment out above lines and uncomment
      # and modify lines bellow.
      #
       
      LoadModule jk_module  libexec/mod_jk.so
       
      # You will need to create a file with worker definition with similar
      # contents (e.g. /etc/apache/workers.properties):
      #
      # worker.list=worker1
      # worker.worker1.type=ajp13
      # worker.worker1.host=localhost
      # worker.worker1.port=8009
       
      JkWorkersFile /etc/apache/workers.properties
      JkShmFile  /var/apache/logs/mod_jk.shm
      JkLogFile  /var/apache/logs/mod_jk.log
      JkLogLevel    info
      JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
      JkMount    /servlets-examples/* worker1
      JkMount    /jsp-examples/* worker1

      「tomcat.conf」には下記の項目を設定した。
      JkWorkersFile:ワーカの定義ファイルのパスネーム
      JkShmFile:共有メモリファイルのパスネーム
      JkLogFile:ログファイルのパスネーム
      JkLogLevel:ログレベル
      JkLogStampFormat:日付/時刻フォーマット
      JkMount:Tomcatのワーカに転送するURLパス。書式は次のとおり。
      JkMount <URL prefix> <Worker name>

    5. workers.propertiesの作成
    6. 網伏せの部分はコメントインして、他の部分は削除して、別名(:w workers.properties)でセーブして、viを終了する。

          …
      削除
      worker.list=worker1
      worker.worker1.type=ajp13
      worker.worker1.host=localhost
      worker.worker1.port=8009
      削除
          …

      ワーカの定義ファイル「workers.properties」には下記の項目を設定した。
      worker.list <ワーカ名>:ワーカ名のリスト
      worker.<ワーカ名>.type:ワーカのタイプ
      worker.<ワーカ名>.host:接続するホスト名
      worker.<ワーカ名>.port:接続するポート番号

    7. Tomcat側コネクタの設定
    8. Tomcat側では先に行った「Tomcat/5.5.27の起動方法」のようにserver.xml をテンプレートからコピーするだけでよい。Tomcaが起動すればAJP/1.3プロトコルの受信を始める。

      # cd /var/apache/tomcat55/conf
      # cp -p server.xml-example server.xml

      参考 server.xmlの記述は下記のようになっている。したがって、Tomcatが立ち上がった状態では8009番ポートにAJP/1.3プロトコルのメッセージが到着するのをリッスンしている。
         <!-- Define an AJP 1.3 Connector on port 8009 -->
          <Connector port="8009"
           enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

    9. Tomcat、Apacheの起動
    10. これはApache/1.3.22とTomcat/4.0.5に同じなので参照されたい。

    11. 動作確認
    12. 「JSP Examples」、「Servlet Examples」のURLは下記のようになる。

      http:// server_addr /jsp-examples/
      http:// server_addr /servlets-examples/

  13. Apache/2.0.63とTomcat/5.5.27の連携
  14. Apacheのプロキシ機能を使用してTomcatと連携する。httpd.confに連携に使用する必要なモジュール(mod_proxy_http, mod_proxy_ftp, mod_proxy, mod_proxy_connect)はすでにロードするように定義済みなので、ProxyPass ディレクティブを追加するだけでよい。

    1. httpd.confの修正
    2. viにより、ProxyPass ディレクティブを追加する。

      # cd /etc/apache
      # vi httpd.conf

      ファイル末尾に「:$」で移動して、次の2行を追加する。

      proxypass /jsp-examples/ http://localhost:8080/jsp-examples/
      proxypass /servlets-examples/ http://localhost:8080/servlets-examples/
    3. Tomcat、Apacheの起動
    4. これはApache/2.0.63とTomcat/5.5.27に同じなので参照されたい。

    5. 動作確認
    6. 「JSP Examples」、「Servlet Examples」のURLは下記のようになる。

      http:// server_addr /jsp-examples/
      http:// server_addr /servlets-examples/
    7. rcスクリプトからの起動
    8. apache用のrcスクリプト(/etc/init.d/apache)を下記の網伏せ部分のように編集してapache2に対応させる。

      #!/sbin/sh
      #
      # Copyright 2008 Sun Microsystems, Inc. All rights reserved.
      # Use subject to license terms.
      #
      #ident "@(#)apache.sh 1.6 08/04/04 SMI"

      CONF_FILE=/etc/apache2/httpd.conf
      if [ -f ${CONF_FILE} ]; then
      APACHE_HOME=/usr/apache2
      RUNDIR=/var/run/apache2
      CF=`egrep '^[ \t]*proxypass[ \t]' $CONF_FILE`
      else
      APACHE_HOME=/usr/apache
      CONF_FILE=/etc/apache/httpd.conf
      RUNDIR=/var/run/apache
      CF=`egrep '^[ \t]*include[ \t]*/etc/apache/tomcat.conf' $CONF_FILE`
      fi
      PIDFILE=${RUNDIR}/httpd.pid
      TOMCAT_CF=/var/apache/tomcat/conf/server.xml
      TOMCAT55_CF=/var/apache/tomcat55/conf/server.xml

      if [ ! -f ${CONF_FILE} ]; then
      exit 0
      fi

      if [ ! -d ${RUNDIR} ]; then
      /usr/bin/mkdir -p -m 755 ${RUNDIR}
      fi

      # see if we need to start/stop tomcat also

      if [ -n "$CF" -a -f $TOMCAT55_CF ]; then
      TOMCAT=yes55
      TC_USER=`egrep '^[ \t]*User[ \t]' $CONF_FILE | nawk '{print $2}'`
      elif [ -n "$CF" -a -f $TOMCAT_CF ]; then
      TOMCAT=yes
      TC_USER=`egrep '^[ \t]*User[ \t]' $CONF_FILE | nawk '{print $2}'` 
      else
      TOMCAT=no
      fi
      TC_USER=`echo $TC_USER|awk '{print $1}'`

      case "$1" in
      start|startssl|sslstart|start-SSL)
      /bin/rm -f ${PIDFILE}
      cmdtext="starting"
      if [ "x$TOMCAT" = xyes55 ]; then
      (CATALINA_HOME=/usr/apache/tomcat55; export CATALINA_HOME; \
      CATALINA_BASE=/var/apache/tomcat55; export CATALINA_BASE; \
      JAVA_HOME=/usr/java; export JAVA_HOME; \
      /bin/su $TC_USER -c \
      "$CATALINA_HOME/bin/startup.sh") \
      >/dev/null 2>&1
      elif [ "x$TOMCAT" != xno ]; then
      (CATALINA_HOME=/usr/apache/tomcat; export CATALINA_HOME; \
      CATALINA_BASE=/var/apache/tomcat; export CATALINA_BASE; \
      JAVA_HOME=/usr/java; export JAVA_HOME; \
      /bin/su $TC_USER -c \
      "$CATALINA_HOME/bin/startup.sh") \
      >/dev/null 2>&1
      fi
      ;;
      restart)
      cmdtext="restarting"
      ;;
      stop)
      cmdtext="stopping"
      if [ "x$TOMCAT" = xyes55 ]; then
      (CATALINA_HOME=/usr/apache/tomcat55; export CATALINA_HOME; \
      CATALINA_BASE=/var/apache/tomcat55; export CATALINA_BASE; \
      JAVA_HOME=/usr/java; export JAVA_HOME; \
      /bin/su $TC_USER -c \
      "$CATALINA_HOME/bin/shutdown.sh") \
      >/dev/null 2>&1
      elif [ "x$TOMCAT" != xno ]; then
      (CATALINA_HOME=/usr/apache/tomcat; export CATALINA_HOME; \
      CATALINA_BASE=/var/apache/tomcat; export CATALINA_BASE; \
      JAVA_HOME=/usr/java; export JAVA_HOME; \
      /bin/su $TC_USER -c \
      "$CATALINA_HOME/bin/shutdown.sh") \
      >/dev/null 2>&1
      fi
      ;;
      *)
      echo "Usage: $0 {start|stop|restart}"
      exit 1
      ;;
      esac

      echo "httpd $cmdtext."

      /bin/sh -c "${APACHE_HOME}/bin/apachectl $1" 2>&1 &
      status=$?

      if [ $status != 0 ]; then
      echo "exit status $status"
      exit 1
      fi
      exit 0
    9. ファイル所有者の変更
    10. rcスクリプトを見れば分かるように、httpd.confにApacheの実行ユーザーが定義されている。 Apacheはnobodyであり、apache2はwebservdである。このため/var/apache/tomcat55以下のnobodyユーザーのディレクトリを調べて、webservdユーザーに変更する。

      # find /var/apache/tomcat55 -user nobody
          …
      # find /var/apache/tomcat55 -user nobody|xargs chown -R webservd

  15. JSPでのOracleへの接続
  16. これまでのどの方法でも良いから、Tomcat を起動することが出来たら、JSPまたはServletによってOracleへの接続が可能になる。Oracleデータベースに接続して、DBアクセスの結果を表示する、ごく簡単なJSPを例示する。

    1. JDBCドライバのコピー
    2. Oracleへ接続するためには、まずJDBCドライバをTomcat にロードさせなければならない。JDBCドライバは/opt/app/oracle/product/10.2.0/jdbc/lib/配下に下記のものが置かれている。

      • JDK 1.4 / 5.0
      •  ojdbc14.jar JDBCクラス
         ojdbc14_g.jar JDBCクラス(デバッグ、トレース)
         ojdbc14dms.jar JDBCクラス - Dynamic Monitoring Serviceサポート
         ojdbc14dms_g.jar JDBCクラス(デバッグ、トレース) - Dynamic Monitoring Serviceサポート

      • JDK 1.2 / 1.3
      • classes12.jar JDBCクラス
        classes12dms.jar JDBCクラス - Dynamic Monitoring Serviceサポート

      既にインストールされているJavaのバージョンは、1.5系なのでojdbc14系が最適であり、そのうち軽量、シンプルな「ojdbc14.jar」を使用する。

      • Tomcat/5.5.27の場合には/jsp-examples/WEB-INF/lib以下にコピーして、Tomcatユーザ(nobody:apacheから起動がかかるのでそれと同じユーザー)がロードできるように読み取り権限を付与することに注意。
      • # cd /var/apache/tomcat55/webapps/jsp-examples/WEB-INF/lib
        # cp /opt/app/oracle/product/10.2.0/jdbc/lib/ojdbc14.jar .
        # chmod o+r ojdbc14.jar

      • Tomcat/4.0.5の場合には「/var/apache/tomcat/webapps/examples/WEB-INF/lib」ディレクトリを作成してコピーする、他はTomcat/5.5.27とじ。
      • # mkdir -p /var/apache/tomcat/webapps/examples/WEB-INF/lib
        # cd /var/apache/tomcat/webapps/examples/WEB-INF/lib
        # cp /opt/app/oracle/product/10.2.0/jdbc/lib/ojdbc14.jar .
        # chmod o+r ojdbc14.jar

    3. JSPの作成
    4. 「USER_TABLES」から「TABLE_NAME」を読み取りそれを表示するJSPを作成する。出来るだけ短くするために、クローズ処理さえも省いたが、目的には十分である。ファイルパスは下記のとおり。

      • Tomcat/5.5.27・・・/var/apache/tomcat55/webapps/jsp-examples/db.jsp
      • Tomcat/4.0.5・・・/var/apache/tomcat/webapps/examples/jsp/db.jsp

      <%@ page language="java" pageEncoding="Windows-31J" contentType="text/html;charset=Windows-31J" %>
      <%@ page import="java.sql.*" %>
      <%
      try {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        String url = "jdbc:oracle:thin:@localhost:1521:orcl";
        Connection con = DriverManager.getConnection(url,"scott", "tiger");
        Statement stmt = con.createStatement();
        String sql = "select table_name from user_tables";
        ResultSet rs = stmt.executeQuery(sql);
        while(rs.next()){
          out.println(rs.getString("TABLE_NAME")+"<br> ");
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
      %>
         

    5. 動作確認
    6. ブラウザで下記のURLを指定する。

      (Tomcat単体起動の場合はserver_addr:8080)
      Tomcat/4.0.5・・・「http://server_addr/examples/jsp/db.jsp」
      Tomcat/5.5.27・・・「http://server_addr/jsp-examples/db.jsp」
      Screen   97