2014年7月13日日曜日

SoftLayer で学ぶ Oracle RAC 入門、ワン・コインの自己投資(その2)

本稿では、iscsi01 サーバの発注を行うわけですが、その前に ssh 用の鍵を作成します。

Teraterm と WinSCP をインストールしている前提で話を進めます。
Teraterm を起動します。
[Tera Term: 新しい接続] ウィンドウが出るので [キャンセル] ボタンをクリックします。


[設定]-[SSH鍵生成] メニューをクリックし、[TTSSH: 鍵生成] ウィンドウを表示します。



[生成] ボタンをクリックします。


[鍵のパスフレーズ]、[パスフレーズの確認] 欄に、パスフレーズを入力します。かなり長めの文章を設定することをお勧めします。1日に1、2度程度しか入力しないものです。「Kimigayoha Chiyoniyachiyoni Sazareishino Iwaotonarite Kokenomusumade」 くらいの長さのものを入れるのがいいと思います。内容は、覚えやすく、人に推測されにくいものにしてください。この例は有名すぎるので NG です。
コメント欄は「softlayer@example.com」と入れておきます。
[公開鍵の保存] ボタンをクリックし、「softlayer@example.com.pub」という名前で保存します。
[秘密鍵の保存] ボタンをクリックし、「softlayer@example.com.prv」という名前で保存します。



[キャンセル] ボタンをクリックし、閉じます。Teraterm 本体も閉じます。

PuTTYgen (WinSCP をインストールした際に同時にインストールされているものです。WinSCP\鍵関連ツール\ の中にあります) を起動します。


[Load] ボタンをクリックし、先ほど保存した「softlayer@example.com.prv」ファイルを開きます。
[PuTTYgen: Enter Passphrase] ウィンドウが表示されるので、先ほど決めたパスフレーズを入力し、[OK] ボタンをクリックします。


[PuTTYgen Notice] ウィンドウが出るので [OK] ボタンをクリックします。


[PuTTY Key Generator] ウィンドウに戻り、[Save private key] ボタンをクリックし、「softlayer@example.com.ppk」という名前で保存します。
softlayer@example.com.prv および softlayer@example.com.ppk は秘密鍵であり、厳重に管理してください。ネットワーク上に流したりしてはいけません。前者は使う機会がないと思います。
公開鍵は名前の通り公開しても構いません。ブログで宣伝しても構いません。


[PuTTY Key Generator] ウィンドウを閉じます。

pageant (WinSCP をインストールした際に同時にインストールされているものです。WinSCP\鍵関連ツール\ の中にあります) を起動します。タスクバーの通知領域にアイコンが表示されます。Pageant アイコンを右クリックし、[Add Key] をクリックします。先ほど保存した「softlayer@example.com.ppk」を開きます。
[Pageant: Enter Passphrase] ウィンドウが表示されるので、先ほど決めたパスフレーズを入力し、[OK] ボタンをクリックします。


この Pageant を終了させない限り、パスフレーズを入力しなくても、この秘密鍵を使った ssh 通信が何セッションでも開始できます。

先ほど保存した公開鍵「softlayer@example.com.pub」をメモ帳等で開いて全文コピーしてください。
公開鍵を SoftLayer の管理ポータル https://control.softlayer.com/ にて登録します。サーバ作成時や OS Reload 時に指定することで、root ユーザに登録してくれるようになります。
管理ポータルの [Devices]-[Manage]-[SSH Keys] をクリックします。
[Add] ボタンをクリックします。
[Key Contents:] 欄に先ほどのコピーを貼り付けます。
[Label:] 欄に適切なラベルを入れます。今回は、「softlayer@example.com」と入力します。
[Add] ボタンをクリックします。

この操作を行う前の時点ですでに CLI を発行できる環境を持っている場合は、以下のコマンドで登録、確認できます。id は、サーバ発注時やリロード時にコマンドラインにて指定するのでメモしておいてください。「00000」という id だったことにして話を続けます。


$ sl sshkey add softlayer@example.com --key='ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA1M4Hy7YfVo0OmSEEjEaMBr67X42rAyk1gu/v8m7dgxK9iU5Q9Har14gmodyNmyF2S4Em4BVshu//2gHtxg/kAD0cv9/BUKIpzN3OkFcRKfcq/7IGZWAm1sL3jqwJX1Nu10myZKXVr6f3bMoRIBk/Y2Z2Ky/EZ3DWpb2b2Elw0cQ8WLoOfgqiRrIGCgi0QRuZhd+4ofAjO1uUb7qMhuBRfZMsbEirJxg9ZiutMOaOTIoxsp0bXRKzKu+j3m/DLhg1WDHHe0jzpB+2UbdNZT0XgTSja38qvXNhx9C5n10ITZgbulM3FL+SMKfO4Pk838oNGLWoRh0iRZBhRwlKJwSnBw== softlayer@example.com'
SSH key added: 14:c9:59:22:f6:8d:8c:db:62:03:2c:60:78:e2:e8:75
$ sl sshkey list
:.......:.......................:.................................................:.......:
:   id  :         label         :                   fingerprint                   : notes :
:.......:.......................:.................................................:.......:
: 00000 : softlayer@example.com : 14:c9:59:22:f6:8d:8c:db:62:03:2c:60:78:e2:e8:75 :   -   :
:.......:.......................:.................................................:.......:



ここからは、課金が発生するので、予習を済ませて(全編読み終えて ?)から、テキパキと実行し(貼り付け)ていかないと、想定した料金を超えることになるものと思われます。
その前提で、投稿直前に実測した時間をもとに、想定時間を入れていきます。

[0:00 課金開始からの時間と課金額] iscsi01 サーバ用の仮想マシンを発注します。

管理ポータル https://control.softlayer.com/ にて操作します。
[Account]-[Place an Order] メニューをクリックします。
[Public Cloud Instances]-[Hourly] をクリックします。
[Redirect Warning] ウィンドウが出たら [Don't warn me for the remainder of this session] にチェックを入れ、[continue] ボタンをクリックします。
[Location]-[DATA CENTER]-[Show Data Centers] をクリックし、[HKG02 - Hong Kong - Asia] をクリックします。
[System Configuration]-[OPERATING SYSTEM]-[Show Operating System] をクリックし、[CentOS 6.x - Minimal Install (64 bit)] をクリックします。
[System Configuration]-[FIRST DISK]-[Show First Disk] をクリックし、[Local]-[25 GB (LOCAL)] をクリックします。
[System Configuration]-[SECOND DISK]-[Show Second Disk] をクリックし、[Local]-[100 GB (LOCAL)] をクリックします。
[Network Options]-[UPLINK PORT SPEEDS]-[Show Uplink Port Speeds] をクリックし、[1 Gbps Public & Private Network Uplinks] をクリックします。
右上の [Configuration Summary]-[Subtotals] を確認します。以下のようになっているはずです。

Quantity:                1
Total (per server): $0.085
Hourly              $0.085
Setup Total:         $0.00

一番下の [Continue Your Order] ボタンをクリックします。

[Order Summary and Billing] の一覧が表示されているはずです。内容を確認します。
[SSH Keys]-[Server 1:] の欄の値を「softlayer@example.com」にします。冒頭で登録したものです。
[Host and Domain Names]-[Server 1:] の欄の値を「iscsi01.example.com」にします。
今だと [Adjustments]-[Promotional Code:] 欄に「500HK」という値を入れるとキャンペーン対象(香港データセンタに限り月額$500まで最初の月だけ無料)になるのではないかと思われます。Catalyst プログラムでは利用不可だったので、確認できていません。

[Subtotal]-[Hourly]-[Total:] の値が「$0.068」になっていることを確認してください。
また、[Adjustments]-[Initial Charge:] の値が「$0.00」になっていることも確認してください。

[I have read and agree to the entire Master Service Agreement.] にチェックを入れ、[Finalize Your Order] ボタンをクリックします。

[Your Receipt] ウィンドウが出ます。内容を確認して閉じます。

管理ポータル画面に戻り、[Devices]-[Device List] をクリックします。
画面は自動的に更新されないので、右上の [Refresh] ボタンを何度かクリックしてみてください。
45秒ほどで、時計マークの付いた [iscsi01.example.com] の行が表示されるようになりました。この時計マークが消えるとログインできる状態になり、課金が始まります。
3分ほどでログインできるようになるのではないかと思われます。

この操作を行う前の時点ですでに CLI を発行できる環境を持っている場合は、以下のコマンドで発注できます。


$ sl vs create --key=00000 --datacenter=hkg02 --hostname=iscsi01 --domain=example.com --cpu=1 --memory=1024 --network=1000 --disk=25 --disk=100 --hourly --os=CENTOS_6_64 -y
:.........:......................................:
:    name : value                                :
:.........:......................................:
:      id : 5342960                              :
: created : 2014-07-07T19:52:18+09:00            :
:    guid : 86dfaa19-18be-4a27-a980-e5bd885efcc5 :
:.........:......................................:



[0:00 $0.000] ログイン可能となった時点から課金が始まります。

[0:01 $0.068] iscsi01 サーバの初期設定を行います。

SoftLayer の初期設定では、インターネットから直接 root アカウントにてパスワード認証で ssh ログインできる状態です。この部分は非常に危険な状態なので、すぐに変更します。

管理ポータル画面にて、[Devices]-[Device List] をクリックします。
「iscsi01.example.com」の [Public IP] を確認します。「119.81.102.178」だとして話を続けます。
Teraterm でログインします。Teraterm を起動してください。
[ホスト] 欄に「119.81.102.178」を入力し、[OK] ボタンをクリックします。


[ユーザ名] に「root」を入力し、[エージェント転送する] にチェックを入れ、[Pageantを使う]をクリックし、[OK] ボタンをクリックします。


ログインできたら、sshd の設定変更を行います。


[root@iscsi01 ~]# cat << 'EOF' | tee /etc/ssh/sshd_config
AddressFamily inet
Protocol 2
SyslogFacility AUTHPRIV
PermitRootLogin without-password
#PermitRootLogin forced-commands-only
#PermitRootLogin no
PubkeyAuthentication yes
RSAAuthentication no
RhostsRSAAuthentication no
HostbasedAuthentication no
PasswordAuthentication no
ChallengeResponseAuthentication no
KerberosAuthentication no
GSSAPIAuthentication no
UsePAM yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
AllowAgentForwarding yes
AllowTcpForwarding yes
GatewayPorts no
X11Forwarding no
PermitTunnel no
Subsystem       sftp    /usr/libexec/openssh/sftp-server
UseDNS no
EOF
[root@iscsi01 ~]# /etc/init.d/sshd restart


もう一度、Teraterm でログインできることを確認します。
確認できたら、最後に開いた端末を残し、他の端末を閉じます。
とりあえずこれで一安心です。


[0:03 $0.068] データベース・サーバ db01, db02 用の物理サーバを発注します。

データベース・サーバを仮想マシンで考えている場合は、必要になってから発注します。後で改めて指示するので、ここは飛ばしてください。
物理サーバは発注してからログインできるようになるまでに時間がかかります。先に発注を済ませます。iscsi01 サーバの課金が $0.068/hour なので、多少の予算オーバは気にしないので同時並行作業は避けたい、という方であれば、仮想マシンの発注を指示した時点で物理サーバの発注をしてもよいかと思います。

[Account]-[Place an Order] メニューをクリックします。
[Bare Metal Instances]-[Hourly] をクリックします。
[Redirect Warning] ウィンドウが出たら [Don't warn me for the remainder of this session] にチェックを入れ、[continue] ボタンをクリックします。
[Quantily] の値を「2 BMI」に変更します。
[Location]-[DATA CENTER]-[Show Data Centers] をクリックし、[HKG02 - Hong Kong - Asia] をクリックします。
[System Configuration]-[BARE METAL INSTANCE]-[Show Bare Metal Instance] をクリックし、[4 x 2.0 GHz Core Bare Metal Instance - 4GB Ram] をクリックします。
[System Configuration]-[OPERATING SYSTEM]-[Show Operating System] をクリックし、[CentOS 6.x - Minimal Install (64 bit)] をクリックします。

[System Configuration]-[HARD DRIVES] 欄は今回変更しないこととします。仮想マシンと物理マシンで以降の操作を統一する為です。物理マシンではパーティション構成を指定できます(Bare Metal Instance では無理ですが、Bare Metal Server で4台以上の HDD 搭載可能機種を選べば RAID も構成できます。その場合起動ドライブは 2TB まで対応しています)。CLI で発注する場合には現状、パーティション構成を指定できないようです。私があえて選ぶとすれば「Linux Extra Partition」になります。「/boot」「/」「swap」「/disk0」の順にパーティションが作成されるのですが、OS にログインした状態のまま「swap」「/disk0」パーティションを削除でき、「swap」サイズをメモリサイズに拡大したり、残りの領域を好きなように変更可能です。変更を反映するための OS 再起動は必要です。今回は「Linux Basic」のままとしておいてください。

[Network Options]-[UPLINK PORT SPEEDS]-[Show Uplink Port Speeds] をクリックし、[1 Gbps Redundant Public & Private Network Uplinks] をクリックします。CLI で発注する場合、「--network=1000」オプションを付けると冗長化されたものが出てきました。仮想マシンと物理マシンで差異が出てしまいますが、帯域が倍に増えることも考え合わせると、ここは私のこだわりということで、冗長化を選択することにします。以降の操作では、冗長化の有無に関わらず、両対応となるように気を付けます。

右上の [Configuration Summary]-[Subtotals] を確認します。以下のようになっているはずです。

Quantity:                2
Total (per server): $0.350
Hourly              $0.700
Setup Total:         $0.00

一番下の [Continue Your Order] ボタンをクリックします。

[Order Summary and Billing] の一覧が表示されているはずです。内容を確認します。
[SSH Keys]-[Server 1:] の欄の値を「softlayer@example.com」にします。冒頭で登録したものです。
[SSH Keys]-[Server 2:] の欄の値を「softlayer@example.com」にします。冒頭で登録したものです。
[Host and Domain Names]-[Server 1:] の欄の値を「db01.example.com」にします。
[Host and Domain Names]-[Server 2:] の欄の値を「db02.example.com」にします。
今だと [Adjustments]-[Promotional Code:] 欄に「500HK」という値を入れるとキャンペーン対象(香港データセンタに限り月額$500まで最初の月だけ無料)になるのではないかと思われます。Catalyst プログラムでは利用不可だったので、確認できていません。

[Subtotal]-[Hourly]-[Total:] の値が「$0.560」になっていることを確認してください。
また、[Adjustments]-[Initial Charge:] の値が「USD0.00」になっていることも確認してください。

[I have read and agree to the entire Master Service Agreement.] にチェックを入れ、[Finalize Your Order] ボタンをクリックします。

[Your Receipt] ウィンドウが出ます。内容を確認して閉じます。

管理ポータル画面に戻り、[Devices]-[Device List] をクリックします。
画面は自動的に更新されないので、右上の [Refresh] ボタンをクリックしてみてください。
今度は、表示されるようになるのに時間がかかるようです。時計マーク付きで表示されるようになるのに、実測で4分かかりました。さらにログインできるようになるまでに58分かかりました。ここはかなりブレがあるようで、気長に待ってください。本連載では、準備に10分、トータル75分でログインできるようになったこととして話を続けます。この待ち時間に別の作業を続行します。

この操作を行う前の時点ですでに CLI を発行できる環境を持っている場合は、以下のコマンドで発注できます。
最初に「--test」オプション付きで発行し、内容を確認してから「--test」オプションなしで実行します。Catalyst プログラムでは、cost が $0.00 となってしまうので、金額が確認できません。
現時点では、パーティション構成変更や RAID 設定が CLI からできないので、Bare Metal Instance の場合はともかく、Bare Metal Server の場合は、CLI を使わずに管理ポータルから手動で発注した方がよいと思います。もしくは、REST API を習熟すべきなのかもしれません。


$ sl server create --key=00000 --datacenter=HONGKONG02 --hostname=db01 --domain=example.com --cpu=4 --memory=4 --network=1000 --disk=500_SATA_II --billing=hourly --os=CENTOS_6._64_MINIMAL --chassis=50 --test
:.......................................................:......:
:                                                  Item : cost :
:.......................................................:......:
:       4 x 2.0 GHz Core Bare Metal Instance - 4 GB Ram : 0.00 :
:                                         500GB SATA II : 0.00 :
:                 CentOS 6.x - Minimal Install (64 bit) : 0.00 :
:               1 Gbps Public & Private Network Uplinks : 0.00 :
:                                          1 IP Address : 0.00 :
:                                        0 GB Bandwidth : 0.00 :
:                                             Host Ping : 0.00 :
:           Nessus Vulnerability Assessment & Reporting : 0.00 :
:                                Automated Notification : 0.00 :
: Unlimited SSL VPN Users & 1 PPTP VPN User per account : 0.00 :
:                               Reboot / Remote Console : 0.00 :
:                                      Email and Ticket : 0.00 :
:                                    Total monthly cost : 0.00 :
:.......................................................:......:
 -- ! Prices reflected here are retail and do not take account level discounts and are not guaranteed.
$ sl server create --key=00000 --datacenter=HONGKONG02 --hostname=db01 --domain=example.com --cpu=4 --memory=4 --network=1000 --disk=500_SATA_II --billing=hourly --os=CENTOS_6._64_MINIMAL --chassis=50 -y
:.........:...........................:
:    name : value                     :
:.........:...........................:
:      id : 2457052                   :
: created : 2014-07-07T20:34:31+09:00 :
:.........:...........................:



[0:13 $0.068] iscsi01 サーバの初期設定の続きに戻ります。

パスワードのハッシュ化方式を MD5 から SHA512 に変更します。
RHEL6 のパスワードのハッシュ化方式のデフォルトは SHA512 です。SoftLayer では、MD5 に変更されています。MD5 は RHEL5 までのデフォルトのハッシュ化方式でした。RHEL ではパスワードのハッシュ化方式が強化されたわけですが、SoftLayer では MD5 に戻しています。知らないうちにセキュリティ要件を緩める方向の変更がなされるのは好ましくないので SHA512 に変更します。


[root@iscsi01 ~]# sudo sed -i -e 's/^ENCRYPT_METHOD .*$/ENCRYPT_METHOD SHA512/' /etc/login.defs
[root@iscsi01 ~]# sudo sed -i -e '/^MD5_CRYPT_ENAB/d' /etc/login.defs
[root@iscsi01 ~]# sudo sed -i -e 's/^PASSWDALGORITHM=.*$/PASSWDALGORITHM=sha512/' /etc/sysconfig/authconfig
[root@iscsi01 ~]# sudo sed -i -e 's/md5/sha512/' /etc/pam.d/password-auth
[root@iscsi01 ~]# sudo sed -i -e 's/md5/sha512/' /etc/pam.d/password-auth-ac
[root@iscsi01 ~]# sudo sed -i -e 's/md5/sha512/' /etc/pam.d/system-auth
[root@iscsi01 ~]# sudo sed -i -e 's/md5/sha512/' /etc/pam.d/system-auth-ac


この時点で root のパスワードは、MD5 方式でハッシュ化されて /etc/shadow に記録されています。SHA512 でハッシュ化されるように、パスワードを変更しておきます。root 権限でパスワード変更する場合、問題のありそうなパスワードでも登録できてしまいます。なお、「********」は表示されません。


[root@iscsi01 ~]# passwd
Changing password for user root.
New password: ********

BAD PASSWORD: it is based on a dictionary word
BAD PASSWORD: is too simple
Retype new password: ********

passwd: all authentication tokens updated successfully.


root のパスワードを変更したら、管理ポータルにて、当該サーバの root パスワードを変更しましょう、という記事を見た記憶がありますが、お勧めしません。
なぜなら、仮想サーバのコンソールに接続するためのパスワードとしても使われているからです。
変更したらコンソールに素直につなげなくなります。変更前のパスワードを記憶しておき、コンソールへはデフォルトで用意されている Java アプレットによる Viewer を使わずに、VNC Viewer を使ってログインし、変更前のパスワードでコンソールに接続可能です。
この仕様を踏まえたうえで、パスワードを知らない者が管理ポータルからコンソールに接続できないようにしたい、という場合には、この限りではありません。ただし、物理サーバの場合は、IPMI のパスワードとして別に用意されているので、権限のみで制御することになるのだと思われます。


[0:17 $0.068] sudo コマンドをパスワードなしで利用できる一般ユーザ(softlayer)を作成し、パスワードを設定し、初回ログイン時にパスワード変更が必要な設定を入れ、公開鍵も登録します。


[root@iscsi01 ~]# echo '%wheel ALL=(ALL) NOPASSWD: ALL' | tee /etc/sudoers.d/wheel
%wheel ALL=(ALL) NOPASSWD: ALL
[root@iscsi01 ~]# groupadd -g 500 softlayer
[root@iscsi01 ~]# useradd -g softlayer -G wheel -u 500 softlayer
[root@iscsi01 ~]# echo oracle | passwd --stdin softlayer
Changing password for user softlayer.
passwd: all authentication tokens updated successfully.
[root@iscsi01 ~]# chage -d 0 softlayer
[root@iscsi01 ~]# cp -a /root/.ssh /home/softlayer/
[root@iscsi01 ~]# chown -R softlayer:softlayer /home/softlayer/.ssh


softlayer アカウントで、秘密鍵を使ってログインできることを確認します。
最初のログインでパスワード変更が促されるので、[(current) UNIX password] として「oracle」を入力後、新しいパスワードを2回入力します。パスワード変更に成功したら接続が切れるので再接続します。


Teraterm のデフォルト設定では、接続が切れると自動的に画面が消えるので、何が起こったのかがわからなくなる場合があります。設定変更をお勧めします。
[設定]-[TCP/IP] メニューをクリックします。
[自動的にウィンドウを閉じる] のチェックを外し、[OK] ボタンをクリックします。
[設定]-[設定の保存] メニューをクリックし、TERATERM.INI を上書き保存します。



再接続できたら、root で接続していた端末を全て閉じます。パスワードを「oracle」(単純なパスワード)に戻したい場合は、「echo oracle | sudo passwd --stdin softlayer」を実行します。

ssh にて、root によるログインを禁止したい場合は、ここで設定変更を行ってください。Oracle RAC の構築では、root によるログインを禁止しても何ら問題ありません。本稿では禁止することにします。


[root@iscsi01 ~]# sed -i -e 's/^PermitRootLogin without-password$/#PermitRootLogin without-password/' /etc/ssh/sshd_config
[root@iscsi01 ~]# sed -i -e 's/^#PermitRootLogin no$/PermitRootLogin no/' /etc/ssh/sshd_config
[root@iscsi01 ~]# /etc/init.d/sshd restart


以降、直接 root になることは極力避けるようにします。「sudo su -」は禁じ手とします。
また、以降のコマンド実行例では、コピペしやすいように、適宜プロンプト表示をしないようにします。


[0:19 $0.068] ファイアウォール設定を行います。


cat << 'EOF' | sudo tee /etc/sysconfig/iptables
*filter
:INPUT   ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT  ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
########## Public VLAN (& Private VLAN) ##########
#ams01#-A INPUT -p icmp -s 159.253.158.0/23 -j ACCEPT
#dal01#-A INPUT -p icmp -s 66.228.118.0/23  -j ACCEPT
#dal05#-A INPUT -p icmp -s 173.192.118.0/23 -j ACCEPT
#dal06#-A INPUT -p icmp -s 184.172.118.0/23 -j ACCEPT
#dal07#-A INPUT -p icmp -s 50.22.118.0/23   -j ACCEPT
#hou02#-A INPUT -p icmp -s 173.193.118.0/23 -j ACCEPT
#hkg02#-A INPUT -p icmp -s 119.81.138.0/23  -j ACCEPT
#sea01#-A INPUT -p icmp -s 67.228.118.0/23  -j ACCEPT
#sjc01#-A INPUT -p icmp -s 50.23.118.0/23   -j ACCEPT
#sng01#-A INPUT -p icmp -s 174.133.118.0/23 -j ACCEPT
#wdc01#-A INPUT -p icmp -s 208.43.118.0/23  -j ACCEPT
-A INPUT -p icmp -s 119.81.138.0/23 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
#-A INPUT -i eth1  -j LOG --log-prefix "IPTABLES_DROP_GLOBAL : " --log-level=info
#-A INPUT -i eth3  -j LOG --log-prefix "IPTABLES_DROP_GLOBAL : " --log-level=info
#-A INPUT -i bond1 -j LOG --log-prefix "IPTABLES_DROP_GLOBAL : " --log-level=info
-A INPUT -i eth1  -j DROP
-A INPUT -i eth3  -j DROP
-A INPUT -i bond1 -j DROP
########## Private VLAN ##########
#hkg02#-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -s 10.2.216.0/24 -j ACCEPT
#tok01#-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -s 10.2.225.0/24 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport   80 -s 10.0.0.0/8 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport  443 -s 10.0.0.0/8 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3260 -s 10.0.0.0/8 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport   53 -s 10.0.0.0/8 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport   53 -s 10.0.0.0/8 -j ACCEPT
-A INPUT -p icmp                                         -s 10.0.0.0/8 -j ACCEPT
#-A INPUT -j LOG --log-prefix "IPTABLES_REJECT_PRIVATE : " --log-level=info
-A INPUT -j REJECT --reject-with icmp-host-prohibited
##########  ##########
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
EOF
if ! ifconfig bond0 > /dev/null 2>&1; then
  sudo sed -i -e '/bond0/d' /etc/sysconfig/iptables
  sudo sed -i -e '/bond1/d' /etc/sysconfig/iptables
  sudo sed -i -e '/eth2/d' /etc/sysconfig/iptables
  sudo sed -i -e '/eth3/d' /etc/sysconfig/iptables
fi
sudo chmod 600 /etc/sysconfig/iptables
sudo /etc/init.d/iptables restart
sudo iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
   34  3488 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     icmp --  *      *       119.81.138.0/23      0.0.0.0/0
    1   136 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
    0     0 DROP       all  --  eth1   *       0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     tcp  --  *      *       10.0.0.0/8           0.0.0.0/0           state NEW tcp dpt:80
    0     0 ACCEPT     tcp  --  *      *       10.0.0.0/8           0.0.0.0/0           state NEW tcp dpt:443
    0     0 ACCEPT     tcp  --  *      *       10.0.0.0/8           0.0.0.0/0           state NEW tcp dpt:3260
    0     0 ACCEPT     tcp  --  *      *       10.0.0.0/8           0.0.0.0/0           state NEW tcp dpt:53
    0     0 ACCEPT     udp  --  *      *       10.0.0.0/8           0.0.0.0/0           state NEW udp dpt:53
    0     0 ACCEPT     icmp --  *      *       10.0.0.0/8           0.0.0.0/0
    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           LOG flags 0 level 6 prefix `IPTABLES_REJECT_PRIVATE : '
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 27 packets, 5576 bytes)
 pkts bytes target     prot opt in     out     source               destination


ssh のソース・アドレスの設定が設計と異なる、ということに気付いた方、鋭いです。
構築時設定ということで、とりあえず、インターネット側も開けておきます。
ソースアドレスを固定のグローバル IP アドレス(xxx.xxx.xxx.xxx)に制限したい場合は /etc/sysconfig/iptables ファイルの20行目を以下のように変更してください。
-A INPUT -p tcp -m state --state NEW -m tcp -s xxx.xxx.xxx.xxx --dport 22 -j ACCEPT
SSL VPN 接続に限定したい場合は、SSL VPN で接続できることを確認し、24,25行目(冗長化している場合は28,29行目)をアンコメントし、20行目をコメントアウトしてください。


[0:20 $0.068] SoftLayer の仮想マシンと物理マシンにおける差異を縮める設定を行っていきます。
以降の操作例では、物理マシンで実行しても仮想マシンで実行してもよいようにしています。また何回実行してもよいようにしています。そうでない場合は注記するようにします。ただし、2回目以降の実行でエラーが発生し、そのエラーを無視しても問題ない場合は特に注記しません。また、実行順序を入れ替えた場合には、うまく動かなくなるものもあります。

ダウンロードしたパッケージを残しておきたいので、yum 設定に変更を加えます。
また、物理マシンでは「assumeyes=1」が追加されていて挙動に違和感があったので rhel のデフォルトに戻します。


sudo sed -i -e 's/^keepcache=.*$/keepcache=1/' /etc/yum.conf
sudo sed -i -e '/^assumeyes=.*$/d' /etc/yum.conf


物理マシンでは、ほぼ最新のパッチがあたった状態で出てくるので、パッケージをアップデートします。


sudo yum -y update


物理マシンでは、以下のパッケージも入っているので追加します。


sudo yum -y install      \
 apr                     \
 apr-util                \
 apr-util-ldap           \
 crypto-utils            \
 db4-cxx                 \
 db4-devel               \
 elinks                  \
 gd                      \
 gdbm-devel              \
 glibc-devel             \
 glibc-headers           \
 httpd                   \
 httpd-manual            \
 httpd-tools             \
 ipmitool                \
 kernel-headers          \
 libXpm                  \
 lm_sensors-libs         \
 mailcap                 \
 mod_perl                \
 mod_ssl                 \
 mod_wsgi                \
 net-snmp-libs           \
 nss_compat_ossl         \
 OpenIPMI                \
 OpenIPMI-libs           \
 perl-BSD-Resource       \
 perl-devel              \
 perl-ExtUtils-MakeMaker \
 perl-ExtUtils-ParseXS   \
 perl-Newt               \
 perl-Test-Harness       \
 webalizer


この時点で、仮想マシンと物理マシンのパッケージの差異は以下の通りです。

物理マシンのみにあるパッケージ
ntp

仮想マシンのみにあるパッケージ
xe-guest-utilities
xe-guest-utilities-xenstore

また、パッケージ化されずにインストールされているものも存在しますが、これについては見なかったことにします。


[0:22 $0.068] ネットワーク設定を変更します。
IPv6 を無効化します。ついでに、APIPA の IP アドレスをルーティングテーブルから外します。


sudo /etc/init.d/ip6tables stop
sudo sed -i -e '/^NOZEROCONF.*$/d'         /etc/sysconfig/network
sudo sed -i -e '/^NETWORKING_IPV6.*$/d'    /etc/sysconfig/network
sudo sed -i -e '/^IPV6INIT.*$/d'           /etc/sysconfig/network
sudo sed -i -e '/^IPV6_AUTOCONF.*$/d'      /etc/sysconfig/network
sudo sed -i -e '/^IPV4_FAILURE_FATAL.*$/d' /etc/sysconfig/network
cat << 'EOF' | sudo tee -a /etc/sysconfig/network
NOZEROCONF=yes
NETWORKING_IPV6=no
IPV6INIT=no
IPV6_AUTOCONF=no
IPV4_FAILURE_FATAL=yes
EOF
sudo sed -i -e '/^# Disable IPv6.*$/d'                     /etc/sysctl.conf
sudo sed -i -e '/^net.ipv6.conf.all.disable_ipv6.*$/d'     /etc/sysctl.conf
sudo sed -i -e '/^net.ipv6.conf.default.disable_ipv6.*$/d' /etc/sysctl.conf
cat << 'EOF' | sudo tee -a /etc/sysctl.conf
# Disable IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
EOF
sudo sysctl -p


NetworkManager が NIC 設定を制御しないようにします。


[ -e /etc/sysconfig/network-scripts/ifcfg-eth0  ] && sudo sed -i -e '/^NM_CONTROLLED.*$/d' /etc/sysconfig/network-scripts/ifcfg-eth0
[ -e /etc/sysconfig/network-scripts/ifcfg-eth1  ] && sudo sed -i -e '/^NM_CONTROLLED.*$/d' /etc/sysconfig/network-scripts/ifcfg-eth1
[ -e /etc/sysconfig/network-scripts/ifcfg-eth2  ] && sudo sed -i -e '/^NM_CONTROLLED.*$/d' /etc/sysconfig/network-scripts/ifcfg-eth2
[ -e /etc/sysconfig/network-scripts/ifcfg-eth3  ] && sudo sed -i -e '/^NM_CONTROLLED.*$/d' /etc/sysconfig/network-scripts/ifcfg-eth3
[ -e /etc/sysconfig/network-scripts/ifcfg-bond0 ] && sudo sed -i -e '/^NM_CONTROLLED.*$/d' /etc/sysconfig/network-scripts/ifcfg-bond0
[ -e /etc/sysconfig/network-scripts/ifcfg-bond1 ] && sudo sed -i -e '/^NM_CONTROLLED.*$/d' /etc/sysconfig/network-scripts/ifcfg-bond1
[ -e /etc/sysconfig/network-scripts/ifcfg-eth0  ] && echo 'NM_CONTROLLED=no' | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-eth0
[ -e /etc/sysconfig/network-scripts/ifcfg-eth1  ] && echo 'NM_CONTROLLED=no' | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-eth1
[ -e /etc/sysconfig/network-scripts/ifcfg-eth2  ] && echo 'NM_CONTROLLED=no' | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-eth2
[ -e /etc/sysconfig/network-scripts/ifcfg-eth3  ] && echo 'NM_CONTROLLED=no' | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-eth3
[ -e /etc/sysconfig/network-scripts/ifcfg-bond0 ] && echo 'NM_CONTROLLED=no' | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-bond0
[ -e /etc/sysconfig/network-scripts/ifcfg-bond1 ] && echo 'NM_CONTROLLED=no' | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-bond1


DNS設定を行います。


cat << 'EOF' | sudo tee /etc/resolv.conf
nameserver 10.0.80.11
nameserver 10.0.80.12
options single-request
search example.com
EOF



[0:23 $0.068] 不要なサービスが起動しないように設定します。


for i in $(chkconfig --list | grep ^[A-Za-z] | grep -v services: | awk '{print $1}')
do
  case $i in
    EventMonitorService   ) sudo chkconfig $i on;;
    atd                   ) sudo chkconfig $i on;;
    crond                 ) sudo chkconfig $i on;;
    iptables              ) sudo chkconfig $i on;;
    irqbalance            ) sudo chkconfig $i on;;
    network               ) sudo chkconfig $i on;;
    ntpd                  ) sudo chkconfig $i on;;
    rsyslog               ) sudo chkconfig $i on;;
    sshd                  ) sudo chkconfig $i on;;
    udev-post             ) sudo chkconfig $i on;;
    xe-linux-distribution ) sudo chkconfig $i on;;
    * ) sudo chkconfig --level 0123456 $i off;;
  esac
done


不要な cron 設定を止めます。


grep -q -v ^# /etc/cron.d/raid-check && sudo sed -i -e 's/^/#/' /etc/cron.d/raid-check



[0:24 $0.068] タイムゾーンを日本に変更します。


cat << 'EOF' | sudo tee /etc/sysconfig/clock
ZONE="Asia/Tokyo"
EOF
sudo cp -a /usr/share/zoneinfo/Asia/Tokyo /etc/localtime


キーボードを日本語キーボードに変更します。


cat << 'EOF' | sudo tee /etc/sysconfig/keyboard
KEYTABLE="jp106"
MODEL="jp106"
LAYOUT="jp"
KEYBOARDTYPE="pc"
EOF



[0:25 $0.068] SoftLayer CLI をインストールします。


sudo yum -y install python-setuptools
sudo easy_install softlayer
Searching for softlayer
Reading http://pypi.python.org/simple/softlayer/
Best match: SoftLayer 3.1.0
Downloading https://pypi.python.org/packages/source/S/SoftLayer/SoftLayer-3.1.0.tar.gz#md5=f97b398c6eb974c63cccafc96c1dbedb
Processing SoftLayer-3.1.0.tar.gz
Running SoftLayer-3.1.0/setup.py -q bdist_egg --dist-dir /tmp/easy_install-JbgvxO/SoftLayer-3.1.0/egg-dist-tmp-ko4cCN
Adding SoftLayer 3.1.0 to easy-install.pth file
Installing sl script to /usr/bin

Installed /usr/lib/python2.6/site-packages/SoftLayer-3.1.0-py2.6.egg
Processing dependencies for softlayer
Searching for importlib
Reading http://pypi.python.org/simple/importlib/
Best match: importlib 1.0.3
Downloading https://pypi.python.org/packages/source/i/importlib/importlib-1.0.3.zip#md5=8a635997b2239c7160addfd2cb33c4d8
Processing importlib-1.0.3.zip
Running importlib-1.0.3/setup.py -q bdist_egg --dist-dir /tmp/easy_install-_fZiLY/importlib-1.0.3/egg-dist-tmp-NDXnsA
zip_safe flag not set; analyzing archive contents...
Adding importlib 1.0.3 to easy-install.pth file

Installed /usr/lib/python2.6/site-packages/importlib-1.0.3-py2.6.egg
Searching for requests
Reading http://pypi.python.org/simple/requests/
Best match: requests 2.3.0
Downloading https://pypi.python.org/packages/source/r/requests/requests-2.3.0.tar.gz#md5=7449ffdc8ec9ac37bbcd286003c80f00
Processing requests-2.3.0.tar.gz
Running requests-2.3.0/setup.py -q bdist_egg --dist-dir /tmp/easy_install-ONwlIw/requests-2.3.0/egg-dist-tmp-x1guwC
Adding requests 2.3.0 to easy-install.pth file

Installed /usr/lib/python2.6/site-packages/requests-2.3.0-py2.6.egg
Searching for docopt==0.6.1
Reading http://pypi.python.org/simple/docopt/
Best match: docopt 0.6.1
Downloading https://pypi.python.org/packages/source/d/docopt/docopt-0.6.1.tar.gz#md5=fe36e9b7a1708a0b02a115f2a78cf623
Processing docopt-0.6.1.tar.gz
Running docopt-0.6.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-6UA_8G/docopt-0.6.1/egg-dist-tmp-H331ym
zip_safe flag not set; analyzing archive contents...
Adding docopt 0.6.1 to easy-install.pth file

Installed /usr/lib/python2.6/site-packages/docopt-0.6.1-py2.6.egg
Searching for prettytable>=0.7.0
Reading http://pypi.python.org/simple/prettytable/
Best match: prettytable 0.7.2
Downloading https://pypi.python.org/packages/source/P/PrettyTable/prettytable-0.7.2.zip#md5=0c1361104caff8b09f220748f9d69899
Processing prettytable-0.7.2.zip
Running prettytable-0.7.2/setup.py -q bdist_egg --dist-dir /tmp/easy_install-vvApBD/prettytable-0.7.2/egg-dist-tmp-dH_xZo
zip_safe flag not set; analyzing archive contents...
Adding prettytable 0.7.2 to easy-install.pth file

Installed /usr/lib/python2.6/site-packages/prettytable-0.7.2-py2.6.egg
Searching for six>=1.1.0
Reading http://pypi.python.org/simple/six/
Best match: six 1.7.3
Downloading https://pypi.python.org/packages/source/s/six/six-1.7.3.tar.gz#md5=784c6e5541c3c4952de9c0a966a0a80b
Processing six-1.7.3.tar.gz
Running six-1.7.3/setup.py -q bdist_egg --dist-dir /tmp/easy_install-XbqfBW/six-1.7.3/egg-dist-tmp-yXTbvP
no previously-included directories found matching 'documentation/_build'
zip_safe flag not set; analyzing archive contents...
six: module references __path__
Adding six 1.7.3 to easy-install.pth file

Installed /usr/lib/python2.6/site-packages/six-1.7.3-py2.6.egg
Finished processing dependencies for softlayer


CLI 用の設定、REST API 呼出し用の設定を行います。


touch ~/.softlayer
chmod 600 ~/.softlayer
cat << 'EOF' | tee ~/.softlayer
[softlayer]
username = SL999999
api_key = abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz01
endpoint_url = https://api.service.softlayer.com/xmlrpc/v3.1
timeout = 10
EOF
touch ~/.softlayer.user
chmod 600 ~/.softlayer.user
echo 'user = SL999999:abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz01' | tee ~/.softlayer.user


動作確認します。


[softlayer@iscsi01 ~]$ sl vs list
:.........:............:.....................:.......:........:................:...............:....................:
:    id   : datacenter :         host        : cores : memory :   primary_ip   :   backend_ip  : active_transaction :
:.........:............:.....................:.......:........:................:...............:....................:
: 5337968 :   hkg02    : iscsi01.example.com :   1   :   1G   : 119.81.102.178 : 10.64.238.189 :         -          :
:.........:............:.....................:.......:........:................:...............:....................:
[softlayer@iscsi01 ~]$ sl vs list --format=raw
5337968  hkg02  iscsi01.example.com  1  1024  119.81.102.178  10.64.238.189  NULL
[softlayer@iscsi01 ~]$ curl -K .softlayer.user https://api.softlayer.com/rest/v3/SoftLayer_Account/getVirtualGuests.txt
META_ITEMS=1
META_PROPERTIES_0='ACCOUNT_ID CREATE_DATE DEDICATED_ACCOUNT_HOST_ONLY_FLAG DOMAIN FULLY_QUALIFIED_DOMAIN_NAME HOSTNAME ID LAST_POWER_STATE_ID LAST_VERIFIED_DATE MAX_CPU MAX_CPU_UNITS MAX_MEMORY METRIC_POLL_DATE MODIFY_DATE START_CPUS STATUS_ID UUID GLOBAL_IDENTIFIER PRIMARY_BACKEND_IP_ADDRESS PRIMARY_IP_ADDRESS STATUS'
META_PROPERTY_TYPES_0='SCALAR SCALAR SCALAR SCALAR SCALAR SCALAR SCALAR SCALAR SCALAR SCALAR SCALAR SCALAR SCALAR SCALAR SCALAR SCALAR SCALAR SCALAR SCALAR SCALAR OBJECT'

ACCOUNT_ID_1='999999'
CREATE_DATE_1='2014-07-07T03:12:28+09:00'
DEDICATED_ACCOUNT_HOST_ONLY_FLAG_1=''
DOMAIN_1='example.com'
FULLY_QUALIFIED_DOMAIN_NAME_1='iscsi01.example.com'
HOSTNAME_1='iscsi01'
ID_1='5337968'
LAST_POWER_STATE_ID_1=''
LAST_VERIFIED_DATE_1=''
MAX_CPU_1='1'
MAX_CPU_UNITS_1='CORE'
MAX_MEMORY_1='1024'
METRIC_POLL_DATE_1=''
MODIFY_DATE_1='2014-07-07T03:15:03+09:00'
START_CPUS_1='1'
STATUS_ID_1='1001'
UUID_1='2dc2ba92-1135-a75d-a421-8a594e42931e'
GLOBAL_IDENTIFIER_1='5ee9935a-6135-4271-8760-d1aa816cc8f9'
PRIMARY_BACKEND_IP_ADDRESS_1='10.64.238.189'
PRIMARY_IP_ADDRESS_1='119.81.102.178'
STATUS_1_META_PROPERTIES='KEY_NAME NAME'
STATUS_1_META_PROPERTY_TYPES='SCALAR SCALAR'
STATUS_1_KEY_NAME='ACTIVE'
STATUS_1_NAME='Active'



[0:28 $0.068] CentOS を Oracle Linux に変換します。
iscsi01.example.com が Oracle Linux でなければならないわけではありませんが、Oracle Linux の管理リポジトリとして構築しやすいように考え、変換することにしました。


sudo yum clean all
[ -e /proc/xen/ ] || sudo sed -i -e 's/^DEFAULTKERNEL=.*$/DEFAULTKERNEL=kernel-uek/' /etc/sysconfig/kernel
curl -O https://linux.oracle.com/switch/centos2ol.sh
yes | sudo sh centos2ol.sh
sudo mkdir /var/www/html/oracle/
sudo mv centos2ol.sh /var/www/html/oracle/
sudo mkdir /var/www/html/repo.ol6/
sudo mv /var/cache/yum/x86_64/*/*/packages/*.rpm /var/www/html/repo.ol6/


[0:33 $0.068] Oracle Database をインストールするために必要となるグループとユーザを追加します。


sudo groupadd -g 54321 oinstall
sudo groupadd -g 54322 dba
sudo groupadd -g 54323 oper
sudo groupadd -g 54324 backupdba
sudo groupadd -g 54325 dgdba
sudo groupadd -g 54326 kmdba
sudo groupadd -g 54327 asmadmin
sudo groupadd -g 54328 asmdba
sudo groupadd -g 54329 asmoper
sudo useradd -g oinstall -G dba,backupdba,dgdba,kmdba,asmdba -u 54321 oracle
echo oracle | sudo passwd --stdin oracle
chage -d 0 oracle
sudo useradd -g oinstall -G asmadmin,asmdba,asmoper -u 54322 grid
echo oracle | sudo passwd --stdin grid
chage -d 0 grid


2014/07/18追記
softlayer アカウントと同じく、oracle、grid アカウントについても、最初のログイン時にパスワード変更が要求されるように変更しました。

[0:34 $0.068] 今回、追加で必要となるパッケージをインストールします。Oracle Linux への変換時に削除されたパッケージもインストールします。バージョン文字列中に「.centos.」が入っているパッケージは全て Oracle Linux のものに変更されるはずです。


sudo yum -y remove ntpdate centos-indexhtml
sudo yum -y --enablerepo=ol6_latest,ol6_u4_base,ol6_UEK_latest update
sudo yum -y --enablerepo=ol6_latest,ol6_u4_base,ol6_UEK_latest install \
 kernel-uek                      \
 kernel-uek-devel                \
 abrt                            \
 abrt-addon-ccpp                 \
 abrt-addon-kerneloops           \
 abrt-addon-python               \
 abrt-cli                        \
 abrt-libs                       \
 abrt-tui                        \
 libreport                       \
 libreport-cli                   \
 libreport-compat                \
 libreport-plugin-kerneloops     \
 libreport-plugin-logger         \
 libreport-plugin-mailx          \
 libreport-python                \
 libreport-plugin-reportuploader \
 ntpdate                         \
 redhat-indexhtml                \
 createrepo                      \
 iscsi-initiator-utils           \
 scsi-target-utils               \
 perl-Authen-SASL                \
 perl-MIME-tools                 \
 xterm                           \
 xorg-x11-apps                   \
 tigervnc-server                 \
 ipa-gothic-fonts                \
 ipa-mincho-fonts                \
 ipa-pgothic-fonts               \
 ipa-pmincho-fonts               \
 vlgothic-fonts                  \
 vlgothic-p-fonts                \
 bind-utils                      \
 compat-libcap1                  \
 compat-libstdc++-33             \
 ksh                             \
 libaio-devel                    \
 nfs-utils                       \
 smartmontools                   \
 sysstat                         \
 systemtap-devel                 \
 xinetd                          \
 firefox                         \
 screen                          \
 reflink                         \
 ocfs2-tools-devel               \
 oracleasm-support
sudo yum -y --enablerepo=ol6_latest,ol6_u4_base,ol6_UEK_latest groupinstall "X Window System" "Development tools" "Desktop"
sudo mv /var/cache/yum/x86_64/*/*/packages/*.rpm /var/www/html/repo.ol6/


UEK カーネルは、SoftLayer の仮想マシン上では動きませんでした。インストールはできますが、起動に失敗します。起動に失敗したカーネル以外のカーネルを SoftLayer がフォールバックして選んでくれるようです。UEK カーネル以外をアンインストールしたら起動しなくなりました。データベースサーバを物理サーバではなく仮想サーバで構築した場合、UEK カーネルは使えない、という違いが見つかりました。一応 UEK2, UEK3 で試しました。

Oracle Database をインストールする前提となるパッケージのインストールや設定変更を自動的にやってくれるパッケージがあります。「oracle-rdbms-server-12cR1-preinstall」です。ただ、Grid Infrastructure (Oracle RAC を動かすための土台部分) をインストールする手助けまではやってくれないので、その部分は手動で設定変更していく必要があります。このパッケージをインストールする前に oracle ユーザを作っておきます。UID や GID を設計段階で決めたものにするためです。このパッケージは kernel-uek パッケージを導入しようとするので、rhel や CentOS ではインストールできません。Oracle 社が Oracle Linux のユーザを増やすために依存関係を追加しているものと思われます。
では、導入してみます。


sudo yum -y install oracle-rdbms-server-12cR1-preinstall
sudo mv /var/cache/yum/x86_64/*/*/packages/*.rpm /var/www/html/repo.ol6/


ログを見るとこのパッケージがどのような設定変更を加えたかがわかります。oracle ユーザを前もって作らずに実行したときのログを掲載しておきます。


[softlayer@iscsi01 ~]$ sudo cat /var/log/oracle-rdbms-server-12cR1-preinstall/results/orakernel.log
Adding group oinstall with gid 54321
Adding group dba
Adding user oracle with user id 54321, initial login group oinstall, supplementary group dba and  home directory /home/oracle
Changing ownership of /home/oracle to oracle:oinstall
Please set password for oracle user
uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba)
Creating oracle user passed

Verifying  kernel parameters as per Oracle recommendations...
Adding fs.file-max = 6815744
Adding kernel.sem = 250 32000 100 128
Adding kernel.shmmni = 4096
kernel.shmall is higher than preinstall config.
kernel.shmall = 4294967296
kernel.shmmax = 4398046511104
Changing kernel.shmmax to match preinstall config
Adding net.core.rmem_default = 262144
Adding net.core.rmem_max = 4194304
Adding net.core.wmem_default = 262144
Adding net.core.wmem_max = 1048576
Adding fs.aio-max-nr = 1048576
Adding net.ipv4.ip_local_port_range = 9000 65500
Setting kernel parameters as per oracle recommendations...
Altered file /etc/sysctl.conf
Original file backed up at /etc/sysctl.conf.orabackup
Verifying & setting of kernel parameters passed

Setting user limits using /etc/security/limits.d/oracle-rdbms-server-12cR1-preinstall.conf

Verifying oracle user OS limits as per Oracle recommendations...
Adding oracle soft nofile  1024
Adding oracle hard nofile  65536
Adding oracle soft nproc  16384
Adding oracle hard nproc  16384
Adding oracle soft stack  10240
Adding oracle hard stack  32768
Setting oracle user OS limits as per Oracle recommendations...
Altered file /etc/security/limits.d/oracle-rdbms-server-12cR1-preinstall.conf
Original file backed up at /var/log/oracle-rdbms-server-12cR1-preinstall/backup/Jul-07-2014-08-06-26
Verifying & setting of user limits passed

Verifying kernel boot parameters as per Oracle recommendations...
old boot params: kernel /vmlinuz-2.6.39-400.215.3.el6uek.x86_64 ro root=UUID=8ce12426-e2de-4c9d-8f15-5f3e1af236f1 console=hvc0 SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=us, new boot params: kernel /vmlinuz-2.6.39-400.215.3.el6uek.x86_64 ro root=UUID=8ce12426-e2de-4c9d-8f15-5f3e1af236f1 console=hvc0 SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=us numa=off

old boot params: kernel /vmlinuz-2.6.32-431.20.3.el6.x86_64 ro root=UUID=8ce12426-e2de-4c9d-8f15-5f3e1af236f1 console=hvc0 crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=us, new boot params: kernel /vmlinuz-2.6.32-431.20.3.el6.x86_64 ro root=UUID=8ce12426-e2de-4c9d-8f15-5f3e1af236f1 console=hvc0 crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=us numa=off

old boot params: kernel /vmlinuz-2.6.32-431.20.3.el6.x86_64 ro root=UUID=8ce12426-e2de-4c9d-8f15-5f3e1af236f1 console=hvc0 crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=us, new boot params: kernel /vmlinuz-2.6.32-431.20.3.el6.x86_64 ro root=UUID=8ce12426-e2de-4c9d-8f15-5f3e1af236f1 console=hvc0 crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=us numa=off

old boot params: kernel /vmlinuz-2.6.39-400.215.3.el6uek.x86_64 ro root=UUID=8ce12426-e2de-4c9d-8f15-5f3e1af236f1 console=hvc0 SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=us numa=off, new boot params: kernel /vmlinuz-2.6.39-400.215.3.el6uek.x86_64 ro root=UUID=8ce12426-e2de-4c9d-8f15-5f3e1af236f1 console=hvc0 SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=us numa=off transparent_hugepage=never

old boot params: kernel /vmlinuz-2.6.32-431.20.3.el6.x86_64 ro root=UUID=8ce12426-e2de-4c9d-8f15-5f3e1af236f1 console=hvc0 crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=us numa=off, new boot params: kernel /vmlinuz-2.6.32-431.20.3.el6.x86_64 ro root=UUID=8ce12426-e2de-4c9d-8f15-5f3e1af236f1 console=hvc0 crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=us numa=off transparent_hugepage=never

old boot params: kernel /vmlinuz-2.6.32-431.20.3.el6.x86_64 ro root=UUID=8ce12426-e2de-4c9d-8f15-5f3e1af236f1 console=hvc0 crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=us numa=off, new boot params: kernel /vmlinuz-2.6.32-431.20.3.el6.x86_64 ro root=UUID=8ce12426-e2de-4c9d-8f15-5f3e1af236f1 console=hvc0 crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=us numa=off transparent_hugepage=never

Setting kernel boot parameters as per Oracle recommendations...
Boot parameters will be effected on next reboot
Altered file /boot/grub/grub.conf
Original file backed up at /boot/grub/grub.conf.orabackup
Verifying & setting of boot parameters passed

Taking a backup of old config files under /var/log/oracle-rdbms-server-12cR1-preinstall/backup/Jul-07-2014-08-06-26


[0:45 $0.068] パッケージをいろいろと追加したので、再度、不要なサービスが起動しないように設定します。


for i in $(chkconfig --list | grep ^[A-Za-z] | grep -v services: | awk '{print $1}')
do
  case $i in
    EventMonitorService   ) sudo chkconfig $i on;;
    atd                   ) sudo chkconfig $i on;;
    crond                 ) sudo chkconfig $i on;;
    dnsmasq               ) sudo chkconfig $i on;;
    httpd                 ) sudo chkconfig $i on;;
    iptables              ) sudo chkconfig $i on;;
    irqbalance            ) sudo chkconfig $i on;;
    lvm2-monitor          ) sudo chkconfig $i on;;
    network               ) sudo chkconfig $i on;;
    ntpd                  ) sudo chkconfig $i on;;
    rsyslog               ) sudo chkconfig $i on;;
    sshd                  ) sudo chkconfig $i on;;
    tgtd                  ) sudo chkconfig $i on;;
    udev-post             ) sudo chkconfig $i on;;
    xe-linux-distribution ) sudo chkconfig $i on;;
    * ) sudo chkconfig --level 0123456 $i off;;
  esac
done
[ -e /proc/xen ] && sudo chkconfig --level 0123456 ntpd off



[0:46 $0.068] ここで一度、OS を再起動します。


[softlayer@iscsi01 ~]$ sudo reboot

Broadcast message from softlayer@iscsi01.example.com
        (/dev/pts/1) at 6:47 ...

The system is going down for reboot NOW!



[0:47 $0.068] iscsi01.example.com に再接続します。
ntp パッケージがインストールされてしまったので、ntp の設定を入れておきます。仮想マシンでは動かしません。
Oracle RAC インストーラが「-x」オプション付きかどうかチェックしているようです。


cat << 'EOF' | sudo tee /etc/sysconfig/ntpd
# Drop root to id 'ntp:ntp' by default.
OPTIONS="-4 -x -u ntp:ntp -p /var/run/ntpd.pid -g"
EOF
cat << 'EOF' | sudo tee /etc/ntp.conf
driftfile /var/lib/ntp/drift
restrict default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
server -4 10.0.77.54 iburst
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
EOF


仮想マシン上で試しに動かしてみたら同期できているというふうに見えました。
Oracle RAC インストール時のみ、仮想マシンで動かすのもありだと考えています。
うまくいけば、使ったことが無く、本番環境で使う可能性が限りなく低い、Cluster Time Synchronization Service (CTSS) を使わずに済みそうです。

別の日に試したら、全く同期する気配がありませんでした。


[softlayer@iscsi01 ~]$ sudo /etc/init.d/ntpd restart
[softlayer@iscsi01 ~]$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*10.0.77.54      172.18.1.12      3 u    2   64    1    0.173  153.468   0.328



[0:48 $0.068] VNC 設定を行います。


cat << 'EOF' | sudo tee /etc/sysconfig/vncservers
VNCSERVERS="1:softlayer"
VNCSERVERARGS[1]="-geometry 1024x768 -nolisten tcp -localhost"
EOF
sudo sed -i -e '/^X-GNOME-Autostart-enabled/d' /etc/xdg/autostart/polkit-gnome-authentication-agent-1.desktop
echo 'X-GNOME-Autostart-enabled=false' | sudo tee -a /etc/xdg/autostart/polkit-gnome-authentication-agent-1.desktop


2014/07/21追記
VNC経由でログインすると、「Authentication is required to set the network proxy used for downloading packages」 というポップアップウィンドウがでて root のパスワードを要求されます。これを停止するための設定を追加しました。


VNC 接続のためのパスワードを設定します。


[softlayer@iscsi01 ~]$ vncpasswd
Password:
Verify:


[0:49 $0.068] VNC サーバを起動します。日頃は VNC 接続を想定せず、インストール時やメンテナンス時のみの利用と考え、VNC 接続に必要なデーモンの起動は、必要になる時点まで止めておくことにします。


sudo init 5
sudo /etc/init.d/messagebus start
sudo /etc/init.d/haldaemon start
sudo /etc/init.d/vncserver start


ssh でポート転送を行います。Teraterm にて iscsi01 サーバに直接接続し、[設定]-[SSH転送]をクリックします。[SSHポート転送] 画面にて [追加] ボタンをクリックします。
ローカルのポート、リモート側ホストのポートの両方に「5901」を入力し [OK] ボタンをクリックします。[SSHポート転送] 画面にて [OK] ボタンをクリックします。



VNCビューアを起動します。持っていない場合は、管理ポータル画面からダウンロードします。
[Support]-[Help]-[Downloads] メニューをクリックします。
[Customer Downloads] 画面の一番下に、「/vncviewer.exe」というリンクがあるのでクリックしてダウンロード、実行します。
[VNC Server:] 欄に「127.0.0.1:5901」と入力し、[Connect] ボタンをクリックします。
[VNC Authentication] 画面が出るので、先ほど設定したパスワードを入力し、[Log On] ボタンをクリックします。



[0:51 $0.068] Oracle Database のインストーラをダウンロードします。
Firefox を起動して以下にアクセスしてください(VNC はコピぺ対応です)。
http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html
Linux x86-64 の 「See All」をクリックします。
[Accept License Agreement] をチェックします。
次の4ファイルをダウンロードしてください。

linuxamd64_12c_database_1of2.zip
linuxamd64_12c_database_2of2.zip
linuxamd64_12c_grid_1of2.zip
linuxamd64_12c_grid_2of2.zip

事前に、Oracle サポートのシングルサインオンのアカウントを取得しておくことをお勧めします。
少なくとも10分くらいかかると思います。待っている間に、次の作業を進めます。

http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html にアクセスし、Instant Client をダウンロードします。
[Accept License Agreement] をチェックします。
次の2ファイルをダウンロードしてください。こちらはあっという間にダウンロードが完了します。

oracle-instantclient12.1-basic-12.1.0.1.0-1.x86_64.rpm
oracle-instantclient12.1-sqlplus-12.1.0.1.0-1.x86_64.rpm

Instant Client をインストールします。


sudo yum -y localinstall Downloads/oracle-instantclient12.1-*.rpm
sudo mkdir /var/www/html/repo.nosig/
sudo mv Downloads/oracle-instantclient12.1-*.rpm /var/www/html/repo.nosig/



[1:00 $0.136] https 通信のために、有効期限100年のサーバ証明書を作成します。内部通信用です。


[softlayer@iscsi01 ~]$ cd /etc/pki/tls/certs
[softlayer@iscsi01 certs]$ sudo make server.key
umask 77 ; \
        /usr/bin/openssl genrsa -aes128 2048 > server.key
Generating RSA private key, 2048 bit long modulus
.............................+++
.........................................................................................................+++
e is 65537 (0x10001)
Enter pass phrase:oracle
Verifying - Enter pass phrase:oracle
[softlayer@iscsi01 certs]$ sudo openssl rsa -in server.key -out server.key
Enter pass phrase for server.key:oracle
writing RSA key
[softlayer@iscsi01 certs]$ sudo make server.csr
umask 77 ; \
        /usr/bin/openssl req -utf8 -new -key server.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Chuo
Locality Name (eg, city) [Default City]:Tokyo
Organization Name (eg, company) [Default Company Ltd]:example.com
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:iscsi01.example.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[softlayer@iscsi01 certs]$ sudo openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 36500
Signature ok
subject=/C=JP/ST=Chuo/L=Tokyo/O=example.com/CN=iscsi01.example.com
Getting Private key
[softlayer@iscsi01 certs]$ sudo chmod 400 server.*
[softlayer@iscsi01 certs]$ cd
[softlayer@iscsi01 certs]$ sed -i -e 's%^SSLCertificateFile /etc/pki/tls/certs/localhost.crt%SSLCertificateFile /etc/pki/tls/certs/server.crt%' /etc/httpd/conf.d/ssl.conf
[softlayer@iscsi01 certs]$ sed -i -e 's%^SSLCertificateKeyFile /etc/pki/tls/private/localhost.key%SSLCertificateKeyFile /etc/pki/tls/certs/server.key%' /etc/httpd/conf.d/ssl.conf


2014/07/25追記
証明書のパス設定を修正し忘れていました。


[1:02 $0.136] 簡易リポジトリを作成します。yum の参照先をこのサーバに変更することで、インターネットにつないでいないサーバのパッチ適用を容易化します。


sudo createrepo /var/www/html/repo.ol6/
sudo createrepo /var/www/html/repo.nosig/
sudo mkdir /var/www/html/norpms
sudo createrepo /var/www/html/norpms/
PRIVATE_IP=repo01
cat << EOF | sudo tee /var/www/html/public-yum-ol6.repo
[public_ol6_latest]
name=Oracle Linux 6 Latest (x86_64)
baseurl=http://$PRIVATE_IP/repo.ol6/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1

[public_ol6_addons]
name=Oracle Linux 6 Add ons (x86_64)
baseurl=http://$PRIVATE_IP/norpms/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[public_ol6_ga_base]
name=Oracle Linux 6 GA installation media copy (x86_64)
baseurl=http://$PRIVATE_IP/norpms/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[public_ol6_u1_base]
name=Oracle Linux 6 Update 1 installation media copy (x86_64)
baseurl=http://$PRIVATE_IP/norpms/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[public_ol6_u2_base]
name=Oracle Linux 6 Update 2 installation media copy (x86_64)
baseurl=http://$PRIVATE_IP/norpms/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[public_ol6_u3_base]
name=Oracle Linux 6 Update 3 installation media copy (x86_64)
baseurl=http://$PRIVATE_IP/norpms/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[public_ol6_u4_base]
name=Oracle Linux 6 Update 4 installation media copy (x86_64)
baseurl=http://$PRIVATE_IP/norpms/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[public_ol6_u5_base]
name=Oracle Linux 6 Update 5 installation media copy (x86_64)
baseurl=http://$PRIVATE_IP/norpms/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[public_ol6_UEKR3_latest]
name=Latest Unbreakable Enterprise Kernel for Oracle Linux 6 (x86_64)
baseurl=http://$PRIVATE_IP/norpms/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[public_ol6_UEK_latest]
name=Latest Unbreakable Enterprise Kernel for Oracle Linux 6 (x86_64)
baseurl=http://$PRIVATE_IP/repo.ol6/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[public_ol6_UEK_base]
name=Unbreakable Enterprise Kernel for Oracle Linux 6 (x86_64)
baseurl=http://$PRIVATE_IP/norpms/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[public_ol6_playground_latest]
name=Latest mainline stable kernel for Oracle Linux 6 (x86_64) - Unsupported
baseurl=http://$PRIVATE_IP/norpms/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[public_ol6_MySQL]
name=MySQL 5.5 for Oracle Linux 6 (x86_64)
baseurl=http://$PRIVATE_IP/norpms/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[public_ol6_gdm_multiseat]
name=Oracle Linux 6 GDM Multiseat (x86_64)
baseurl=http://$PRIVATE_IP/norpms/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[public_ol6_ofed_UEK]
name=OFED supporting tool packages for Unbreakable Enterprise Kernel on Oracle Linux 6 (x86_64)
baseurl=http://$PRIVATE_IP/norpms/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[public_ol6_MySQL56]
name=MySQL 5.6 for Oracle Linux 6 (x86_64)
baseurl=http://$PRIVATE_IP/norpms/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[public_ol6_spacewalk20_server]
name=Spacewalk Server 2.0 for Oracle Linux 6 (x86_64)
baseurl=http://$PRIVATE_IP/norpms/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[public_ol6_spacewalk20_client]
name=Spacewalk Client 2.0 for Oracle Linux 6 (x86_64)
baseurl=http://$PRIVATE_IP/norpms/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0
EOF
cat << EOF | sudo tee /var/www/html/repo-with-no-sign.repo
[Repo with no sign]
name=Repo with no sign (x86_64)
baseurl=http://$PRIVATE_IP/repo.nosig/
gpgcheck=0
enabled=0
EOF


2014/07/21追記
PRIVATE_IP に Primary Private IP Address を指定していました。
repo01 に修正しました。

[1:03 $0.136] Oracle インストーラのダウンロード完了を待ちます。
Oracle インストーラを移動します。VNC サーバを停止します。


sudo mv Downloads/linuxamd64_12c_*.zip /var/www/html/oracle/
sudo /etc/init.d/vncserver stop
sudo /etc/init.d/haldaemon stop
sudo /etc/init.d/messagebus stop
sudo init 3



[1:04 $0.136] Portable Private IP Addresses を発注します。

https://control.softlayer.com/ にてログインし、[Network]-[IP Management]-[Subnets] メニューをクリックします。
右上の [Order IP Addresses] リンクをクリックします。
[Select the type of subnet to add to this account] の値を「Portable Private」に変更し、[64 Portable Private IP Addresses] をチェックし、[Continue] ボタンをクリックします。
Portable Private IP Addresses を追加する VLAN の行にあるラジオボタンをクリックし、[Continue] ボタンをクリックします。
必要な情報を入力し、2か所のチェックボックスにチェックを入れ、[Place Order] ボタンをクリックします。無料であることを確認してください。
しばらくすると Subnets の画面に戻るので、「Primary Subnets」を「All Subnets」に変更し、追加されたサブネットを確認します。
10.64.102.0/26」が割り当てられました。運良く第4オクテットが「0」でした。連続して注文しても、続きが割り当てられる可能性はほとんどありません。

ここまでの作業で、論理ネットワーク図に書き込むべき値がかなり集まりました。書き込んでいきます。
Portable Private IP Addresses を以下のように割り当ててみました。

10.64.102.2     iscsi01.example.com  iscsi01
10.64.102.3     db01.example.com     db01
10.64.102.4     db02.example.com     db02
10.64.102.5     nfs01.example.com    nfs01
10.64.102.6     nfs02.example.com    nfs02
10.64.102.57    nfs.example.com      nfs
10.64.102.58    db01-vip.example.com db01-vip
10.64.102.59    db02-vip.example.com db02-vip
10.64.102.60    rac-scan.example.com rac-scan
10.64.102.61    rac-scan.example.com rac-scan
10.64.102.62    rac-scan.example.com rac-scan

Oracle のプライベート IP アドレスは(その1)の図で以下のように割り当てていました。

192.168.0.1     db01-prv.example.com db01-prv
192.168.0.2     db02-prv.example.com db02-prv
192.168.0.3     nfs01-prv.example.com nfs01-prv
192.168.0.4     nfs02-prv.example.com nfs02-prv

[1:06 $0.136] DNS キャッシュサーバを構築します。
/etc/hosts に必要な情報を書き込んだら dnsmasq デーモンを再起動するだけです。


PRIVATE_BASE_123=10.64.102
PRIVATE_BASE_4=0
NIC0=bond0; ifconfig bond0 > /dev/null 2>&1 || NIC0=eth0
PRIVATE_IP=$(ifconfig $NIC0 | grep 'inet addr' | awk '{print $2}' | awk -F: '{print $2}')
NIC1=bond1; ifconfig bond1 > /dev/null 2>&1 || NIC1=eth1
PUBLOC_IP=$(ifconfig $NIC1 | grep 'inet addr' | awk '{print $2}' | awk -F: '{print $2}')
cat << EOF | sudo tee /etc/hosts
127.0.0.1       localhost.localdomain   localhost
$PUBLOC_IP  iscsi01-g.example.com   iscsi01-g
$PRIVATE_IP   iscsi01-prm.example.com iscsi01-prm
$PRIVATE_BASE_123.$((PRIVATE_BASE_4+2))     iscsi01.example.com     iscsi01  dns01.example.com dns01 repo01.example.com repo01
$PRIVATE_BASE_123.$((PRIVATE_BASE_4+3))     db01.example.com        db01
$PRIVATE_BASE_123.$((PRIVATE_BASE_4+4))     db02.example.com        db02
$PRIVATE_BASE_123.$((PRIVATE_BASE_4+5))     nfs01.example.com       nfs01
$PRIVATE_BASE_123.$((PRIVATE_BASE_4+6))     nfs02.example.com       nfs02
$PRIVATE_BASE_123.$((PRIVATE_BASE_4+57))    nfs.example.com         nfs
$PRIVATE_BASE_123.$((PRIVATE_BASE_4+58))    db01-vip.example.com    db01-vip
$PRIVATE_BASE_123.$((PRIVATE_BASE_4+59))    db02-vip.example.com    db02-vip
$PRIVATE_BASE_123.$((PRIVATE_BASE_4+60))    rac-scan.example.com    rac-scan
$PRIVATE_BASE_123.$((PRIVATE_BASE_4+61))    rac-scan.example.com    rac-scan
$PRIVATE_BASE_123.$((PRIVATE_BASE_4+62))    rac-scan.example.com    rac-scan
192.168.0.1     db01-prv.example.com    db01-prv
192.168.0.2     db02-prv.example.com    db02-prv
192.168.0.3     nfs01-prv.example.com   nfs01-prv
192.168.0.4     nfs02-prv.example.com   nfs02-prv
EOF
sudo /etc/init.d/dnsmasq restart


以下の設定も追加すると、ローカルにて名前解決をさせても、うまい具合に SCAN IP アドレスがラウンドロビンされて返ってくるようになります。(その1)でラウンドロビンされるかどうか危惧していましたが、杞憂で終わってなによりです。
データベースクライアントは、SCAN IP アドレスに対して接続するようにします。SCAN IP アドレスは、接続ロードバランスと接続フェイルオーバを実現するために用意されています。


echo 'conf-dir=/etc/dnsmasq.d' | sudo tee /etc/dnsmasq.conf
echo 'resolv-file=/etc/dnsmasq.resolv.conf' | sudo tee /etc/dnsmasq.d/resolv.conf
cat << 'EOF' | sudo tee /etc/dnsmasq.resolv.conf
nameserver 10.0.80.11
nameserver 10.0.80.12
EOF
cat << 'EOF' | sudo tee /etc/resolv.conf
nameserver 127.0.0.1
options single-request
search example.com
EOF
sudo sed -i -e 's/^hosts:.*$/hosts:      dns files/' /etc/nsswitch.conf
sudo /etc/init.d/dnsmasq restart

nslookup rac-scan
nslookup rac-scan
nslookup rac-scan



[1:07 $0.136] iscsi01 サーバに Portable Private IP Address を設定します。


NIC0=bond0; ifconfig bond0 > /dev/null 2>&1 || NIC0=eth0
cat << EOF | sudo tee /etc/sysconfig/network-scripts/ifcfg-$NIC0:1
DEVICE=$NIC0:1
BOOTPROTO=static
ONBOOT=yes
IPADDR=$(grep iscsi01.example.com /etc/hosts | awk '{print $1}')
NETMASK=255.255.255.192
NM_CONTROLLED=no
EOF
sudo ifup $NIC0:1
ifconfig



[1:08 $0.136] 追加した 100GB の仮想ハードディスクを使えるようにします。
パーティショニングし、LVM2 でロジカルボリュームを作り、ext4 でフォーマットし、ファイルシステムチェックが自動的に動くのを止め、/u0x にマウントしています。
この枠内のコマンドは単純に再実行するとおかしくなります。


sudo fdisk -H 64 -S 32 /dev/xvdc << 'EOF'
o
n
p
1


t
8e
p
w
EOF

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): Building a new DOS disklabel with disk identifier 0x588e4d4a.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): Command action
   e   extended
   p   primary partition (1-4)
Partition number (1-4): First cylinder (1-102400, default 1): Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-102400, default 102400): Using default value 102400

Command (m for help): Selected partition 1
Hex code (type L to list codes): Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help):
Disk /dev/xvdc: 107.4 GB, 107374182400 bytes
64 heads, 32 sectors/track, 102400 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x588e4d4a

    Device Boot      Start         End      Blocks   Id  System
/dev/xvdc1               1      102400   104857584   8e  Linux LVM

Command (m for help): The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

sudo pvcreate /dev/xvdc1
  Physical volume "/dev/xvdc1" successfully created

sudo vgcreate -s 32M vg0 /dev/xvdc1
  Volume group "vg0" successfully created

sudo lvcreate -L 20480 -n u01 vg0
  Logical volume "u01" created

sudo lvcreate -L 40960 -n u02 vg0
  Logical volume "u02" created

sudo lvcreate -L 10240 -n u03 vg0
  Logical volume "u03" created

sudo lvcreate -L 10240 -n u04 vg0
  Logical volume "u04" created

sudo lvcreate -L 10240 -n u05 vg0
  Logical volume "u05" created

sudo mkfs.ext4 -L /u01 /dev/vg0/u01
mke2fs 1.43-WIP (20-Jun-2013)
Filesystem label=/u01
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1310720 inodes, 5242880 blocks
262144 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
160 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

sudo mkfs.ext4 -L /u02 /dev/vg0/u02

sudo mkfs.ext4 -L /u03 /dev/vg0/u03

sudo mkfs.ext4 -L /u04 /dev/vg0/u04

sudo mkfs.ext4 -L /u05 /dev/vg0/u05

sudo mkdir /u01 /u02 /u03 /u04 /u05

cat << 'EOF' | sudo tee -a /etc/fstab
/dev/vg0/u01            /u01                    ext4    defaults,noatime 0 0
/dev/vg0/u02            /u02                    ext4    defaults,noatime 0 0
/dev/vg0/u03            /u03                    ext4    defaults,noatime 0 0
/dev/vg0/u04            /u04                    ext4    defaults,noatime 0 0
/dev/vg0/u05            /u05                    ext4    defaults,noatime 0 0
EOF
sudo mount -a
cat /proc/mounts
rootfs / rootfs rw 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
devtmpfs /dev devtmpfs rw,relatime,size=482080k,nr_inodes=120520,mode=755 0 0
devpts /dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /dev/shm tmpfs rw,relatime 0 0
/dev/xvda2 / ext3 rw,noatime,errors=continue,user_xattr,acl,barrier=1,data=ordered 0 0
/proc/bus/usb /proc/bus/usb usbfs rw,relatime 0 0
/dev/xvda1 /boot ext3 rw,noatime,errors=continue,user_xattr,acl,barrier=1,data=ordered 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0
none /proc/xen xenfs rw,relatime 0 0
/dev/mapper/vg0-u01 /u01 ext4 rw,noatime,barrier=1,data=ordered 0 0
/dev/mapper/vg0-u02 /u02 ext4 rw,noatime,barrier=1,data=ordered 0 0
/dev/mapper/vg0-u03 /u03 ext4 rw,noatime,barrier=1,data=ordered 0 0
/dev/mapper/vg0-u04 /u04 ext4 rw,noatime,barrier=1,data=ordered 0 0
/dev/mapper/vg0-u05 /u05 ext4 rw,noatime,barrier=1,data=ordered 0 0



[1:10 $0.136] /u01 を簡易リポジトリ、インストーラ置き場とします。
この枠内のコマンドは単純に再実行するとおかしくなります。


sudo /etc/init.d/httpd stop
sudo mv /var/www /u01/
sudo ln -s /u01/www /var/www
sudo /etc/init.d/httpd start



[1:12 $0.136] /u02, /u03, /u04, /u05 内に iSCSI Target の LUN の実体にあたるファイルを作成します。LVM2 の論理ボリュームを割り当てると見かけ上のサイズと論理ボリュームのサイズを一致させる必要がある(今はこのような制限がない ? まったく調べていません)ので、ファイルシステム上にスパースファイルを割り当てることにします。
lun7, lun8, lun9 は、バックアップ領域として割り当てるディスクグループ用です。200GB 単位で増設していきます。lun4, lun5, lun6 は、データ領域として割り当てるディスクグループ用です。100GB 単位で増設してきます。スナップショット取得対象です。lun1, lun2, lun3 は、その他の領域として割り当てるディスクグループ用です。データベースの制御を司るためのファイル群用です。Redoログ、制御ファイル用ディスクグループを別途設けた方がよいかもしれません。更に、Redoログ、制御ファイルの冗長化分用ディスクグループを別途設けた方がよいかもしれません。バックアップ設計は今回手を付けないので深入りしませんが、バックアップ領域用のディスクグループを、同じところに同じ方式で用意するのはよくないと思います。
以下の作り方では、LUN のサイズを拡張することも可能です。SoftLayer iSCSI Storage はサイズの拡張をサポートしていないので、基本的には増設で対応していく設計がよいと思います。


sudo dd if=/dev/zero of=/u02/lun1 bs=1M count=0 seek=20480
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000189377 s, 0.0 kB/s

sudo dd if=/dev/zero of=/u02/lun2 bs=1M count=0 seek=20480

sudo dd if=/dev/zero of=/u02/lun3 bs=1M count=0 seek=20480

sudo dd if=/dev/zero of=/u03/lun4 bs=1M count=0 seek=102400

sudo dd if=/dev/zero of=/u04/lun5 bs=1M count=0 seek=102400

sudo dd if=/dev/zero of=/u05/lun6 bs=1M count=0 seek=102400

sudo dd if=/dev/zero of=/u02/lun7 bs=1M count=0 seek=204800

sudo dd if=/dev/zero of=/u02/lun8 bs=1M count=0 seek=204800

sudo dd if=/dev/zero of=/u02/lun9 bs=1M count=0 seek=204800

ls -l /u02 /u03 /u04 /u05
/u02:
total 16
drwx------ 2 root root        16384 Jul 12 12:20 lost+found
-rw-r--r-- 1 root root  21474836480 Jul 12 12:59 lun1
-rw-r--r-- 1 root root  21474836480 Jul 12 12:59 lun2
-rw-r--r-- 1 root root  21474836480 Jul 12 12:59 lun3
-rw-r--r-- 1 root root 214748364800 Jul 12 13:01 lun7
-rw-r--r-- 1 root root 214748364800 Jul 12 13:01 lun8
-rw-r--r-- 1 root root 214748364800 Jul 12 13:02 lun9

/u03:
total 16
drwx------ 2 root root        16384 Jul 12 12:20 lost+found
-rw-r--r-- 1 root root 107374182400 Jul 12 13:00 lun4

/u04:
total 16
drwx------ 2 root root        16384 Jul 12 12:20 lost+found
-rw-r--r-- 1 root root 107374182400 Jul 12 13:01 lun5

/u05:
total 16
drwx------ 2 root root        16384 Jul 12 12:20 lost+found
-rw-r--r-- 1 root root 107374182400 Jul 12 13:01 lun6
du -sk /u0*/lun*
0       /u02/lun1
0       /u02/lun2
0       /u02/lun3
0       /u02/lun7
0       /u02/lun8
0       /u02/lun9
0       /u03/lun4
0       /u04/lun5
0       /u05/lun6



[1:13 $0.136] iSCSI Target の設定を行います。基本的に、SoftLayer iSCSI Storage への置き換えを意識した設定になっています。クライアントからのログインは、パスワード変更と接続先ホスト変更だけでよいハズです。今回はバックアップまで視野に入れてないので、スナップショット関連の作り込みまではやりません。今回の設定に手を入れることなく追加作業で可能なようにはしています。


cat << 'EOF' | sudo tee /etc/tgt/targets.conf
<target iqn.2001-05.com.equallogic:0-8a0906-2ff8d0b0c-a5f00f70a42535b9-sli999999-1>
    backing-store /u02/lun1
    lun 1
    incominguser SLI999999-1 oracleoracle
    write-cache on
    scsi_id wwn-0x6090a0c8b0d0f82fb93525a4700ff0a1
    readonly 0
    allow-in-use yes
    MaxRecvDataSegmentLength 262144
    MaxXmitDataSegmentLength 65536
    InitialR2T No
</target>

<target iqn.2001-05.com.equallogic:0-8a0906-2ff8d0b0c-a5f00f70a42535b9-sli999999-2>
    backing-store /u02/lun2
    lun 1
    incominguser SLI999999-2 oracleoracle
    write-cache on
    scsi_id wwn-0x6090a0c8b0d0f82fb93525a4700ff0a2
    readonly 0
    allow-in-use yes
    MaxRecvDataSegmentLength 262144
    MaxXmitDataSegmentLength 65536
    InitialR2T No
</target>

<target iqn.2001-05.com.equallogic:0-8a0906-2ff8d0b0c-a5f00f70a42535b9-sli999999-3>
    backing-store /u02/lun3
    lun 1
    incominguser SLI999999-3 oracleoracle
    write-cache on
    scsi_id wwn-0x6090a0c8b0d0f82fb93525a4700ff0a3
    readonly 0
    allow-in-use yes
    MaxRecvDataSegmentLength 262144
    MaxXmitDataSegmentLength 65536
    InitialR2T No
</target>

<target iqn.2001-05.com.equallogic:0-8a0906-2ff8d0b0c-a5f00f70a42535b9-sli999999-4>
    backing-store /u03/lun4
    lun 1
    incominguser SLI999999-4 oracleoracle
    write-cache on
    scsi_id wwn-0x6090a0c8b0d0f82fb93525a4700ff0a4
    readonly 0
    allow-in-use yes
    MaxRecvDataSegmentLength 262144
    MaxXmitDataSegmentLength 65536
    InitialR2T No
</target>

<target iqn.2001-05.com.equallogic:0-8a0906-2ff8d0b0c-a5f00f70a42535b9-sli999999-5>
    backing-store /u04/lun5
    lun 1
    incominguser SLI999999-5 oracleoracle
    write-cache on
    scsi_id wwn-0x6090a0c8b0d0f82fb93525a4700ff0a5
    readonly 0
    allow-in-use yes
    MaxRecvDataSegmentLength 262144
    MaxXmitDataSegmentLength 65536
    InitialR2T No
</target>

<target iqn.2001-05.com.equallogic:0-8a0906-2ff8d0b0c-a5f00f70a42535b9-sli999999-6>
    backing-store /u05/lun6
    lun 1
    incominguser SLI999999-6 oracleoracle
    write-cache on
    scsi_id wwn-0x6090a0c8b0d0f82fb93525a4700ff0a6
    readonly 0
    allow-in-use yes
    MaxRecvDataSegmentLength 262144
    MaxXmitDataSegmentLength 65536
    InitialR2T No
</target>

<target iqn.2001-05.com.equallogic:0-8a0906-2ff8d0b0c-a5f00f70a42535b9-sli999999-7>
    backing-store /u02/lun7
    lun 1
    incominguser SLI999999-7 oracleoracle
    write-cache on
    scsi_id wwn-0x6090a0c8b0d0f82fb93525a4700ff0a7
    readonly 0
    allow-in-use yes
    MaxRecvDataSegmentLength 262144
    MaxXmitDataSegmentLength 65536
    InitialR2T No
</target>

<target iqn.2001-05.com.equallogic:0-8a0906-2ff8d0b0c-a5f00f70a42535b9-sli999999-8>
    backing-store /u02/lun8
    lun 1
    incominguser SLI999999-8 oracleoracle
    write-cache on
    scsi_id wwn-0x6090a0c8b0d0f82fb93525a4700ff0a8
    readonly 0
    allow-in-use yes
    MaxRecvDataSegmentLength 262144
    MaxXmitDataSegmentLength 65536
    InitialR2T No
</target>

<target iqn.2001-05.com.equallogic:0-8a0906-2ff8d0b0c-a5f00f70a42535b9-sli999999-9>
    backing-store /u02/lun9
    lun 1
    incominguser SLI999999-9 oracleoracle
    write-cache on
    scsi_id wwn-0x6090a0c8b0d0f82fb93525a4700ff0a9
    readonly 0
    allow-in-use yes
    MaxRecvDataSegmentLength 262144
    MaxXmitDataSegmentLength 65536
    InitialR2T No
</target>
EOF
sudo /etc/init.d/tgtd restart



[1:14 $0.136] 物理サーバがログインできる状態になるのを待ちます。


ここまでの作業は、Oracle RAC の構築作業という観点からは、だいぶ外れている、という印象を持たれている方も多いと思います。私もそのように思いますが、トラブルシューティングでは、このあたりまでの知識が要求されることも多いです。とはいえ、この手の作業はできるだけ省力化したいものです。
以下に、プロビジョニングスクリプトを保存したので利用してみてください。

https://raw.githubusercontent.com/pcserver-jp/SoftLayer/master/iscsi01.hkg02.sh

ライセンスの関係で、Oracle 社のサイトからダウンロードする部分([0:48 $0.068]後半 [0:49 $0.068] [0:51 $0.068] [1:03 $0.136])は組み込みこめていません。
Oracle Support サイトから wget コマンドでインストーラを取得するスクリプトを書くこともできますが、今回はそこまでやりません。softlayer の nas を発注し、そこに配置しておけば、ftp で取得することも可能(未検証)となりますし、cifs マウントして取得することも可能となります。

パスワードは基本的に「oracle」となっているので、変更することをお勧めします。
API Key はダミーの値が入っているので書き換えてください。
2014/07/18追記
softlayer, oracle, grid アカウントについては、初期パスワードとして「oracle」を設定していますが、初回ログイン時に強制的にパスワード変更が必要となるように変更しました。
root アカウントのパスワードはランダムな値を設定するように変更しました。root のパスワードを利用したい場合は「sudo passwd」で変更してください。
VNCパスワードは設定していません。パスワードを「oracle」に設定する部分はコメントアウトしています。

Portable Private IP Addresses を発注([1:04 $0.136])しないと確定しない IP アドレスがあり、/etc/hosts の編集([1:06 $0.136] 前半)、eth0:1 (bond0:1) 追加設定([1:07 $0.136])も組み込めていません。
2014/07/18追記
6~44行目にコメントアウトした状態で追記しておきました。
8,9行目を書き換え、6,8~44行目をアンコメントし、自前のサーバに設置すればよい状態にしています。9行目の値は、「0」「64」「128」「192」のどれかになります。

プロビジョニングスクリプトの登録の仕方は以下の通りです。
管理ポータル https://control.softlayer.com/ にて操作します。
[Devices]-[Manage]-[Provisioning Scripts] メニューをクリックします。
右上の [Add Provisioning Script] ボタンをクリックします。
[Name] に 「iscsi01.hkg02.sh」 を入力します。
[URL] に 「https://raw.githubusercontent.com/pcserver-jp/SoftLayer/master/iscsi01.hkg02.sh」 を入力します。
[Add] ボタンをクリックします。

プロビジョニングスクリプトの指定の仕方は、iscsi01 サーバ発注時に SSH Keys を指定しましたが、その上の部分の [Existing Script] 欄にて 「iscsi01.hkg02.sh」 を選択します。
CLI で発注する場合は、「--postinstall=https://raw.githubusercontent.com/pcserver-jp/SoftLayer/master/iscsi01.hkg02.sh」 というオプションを追加します。
実測では、15分かからずに設定が完了しました。現在時刻を [0:15 $0.068] に戻したいところですが、物理サーバがログインできる状態になるのを待つ必要があり、意味がありません。
OS Reload でも指定を変更できます。研究してみてください。

プロビジョニングスクリプトを利用した場合は、以下のログを確認してください。


sudo grep post_install /var/log/messages



次回は、物理サーバ(データベースサーバ)の設定を行います。
[1:18 $0.136] 続きは(その3)へ。

0 件のコメント:

コメントを投稿