2014年12月11日木曜日

SoftLayerにOracle Linuxをクリーンインストール (2枚目SoftLayer Advent Calendar 2014第11日目)

2枚目 SoftLayer Advent Calendar 2014 (http://qiita.com/advent-calendar/2014/softlayer2) の第11日目になります。

2014年11月12日(水曜日)に行われた 「IBM Cloud - Exclusive Preview」にて、SoftLayer は「品質と品格の2つを兼ね備え」ているとのアピールがありました。「品質」は分かるとして、ここでいう「品格」とは、「ベンダーロックインされないオープンなクラウド」という意味で使われていました。
SoftLayer の特徴をうまく言い表していると思います。オンプレミスのデータセンタにあるシステムを SoftLayer へ移行しようとした場合、独自技術が使われているために移行の妨げとなる、という問題が発生しません。標準的に用意されているネットワークをそのまま利用してもよいし、Private VLAN を自由に組み合わせてルーティングも自前で設計・構築することも許されており、果ては、物理サーバに ESXi を構築して独自にプライベートクラウドを構築することもできます。ベンダーロックインと無縁に利用することが可能です。ベンダーロックインの話にこだわらないのであれば、API で自動化することも可能です。API を発行するためだけにインターネットとの接続が必要となるような、変な設計にはなっていません。閉域利用ができるクラウドです。SoftLayer の特徴をもう一つあげるとするならば、よりセキュアな環境を望むのであればよりセキュアに利用できる、という点を挙げておきたいと思います。

SoftLayer では、GUI コンソールを利用することができます。読み取り専用 CUI コンソール・ログを数分後に確認することしかできない A*S などというクラウドもありますが、このようなところにも「品格」が現れています。
Bare Metal Server の場合、NAS に iso ファイルを置けば、IPMI の Administrator 権限取得を Ticket で依頼し、OS のインストーラ・メディアから起動することもできます(NAS を用意するのも、チケットを発行するのも面倒なので、この手法でのインストールは試していません)が、仮想サーバの場合にはこの手法を取れません。
そこで、chroot 環境を作ってイメージを作成し、Rescue モードで起動して ssh でログインし、イメージを入れ換える手法でインストールすることにします。この手法は、ほとんどの Linux 環境で利用でき、DHCP サーバも不要で、条件を整えれば v2v、p2v、v2p にも応用可能となります。もちろん、○W○ のようなベンダーロックインに熱心なクラウドでもうまくいくことは確認済みです。コンソール操作は不要です。ssh でログインできる環境があれば十分です。余分な出費(別途 NAS 等を用意)がいらないというメリットもあります。

では早速、Oracle Linux 6.6 x86_64 をクリーンインストールしていきたいと思います。
実行結果例が Bare Metal Server のものとなっていますが、仮想サーバでも問題ないように記述していきます。

まず、Oracle Linux 6.6 x86_64 のインストーラを入手します。
以下のサイトにサインインしてください。Oracle のアカウントでサインインできます。無償でアカウントを作成可能です。
https://edelivery.oracle.com/linux

Media Pack Search にて、
Select a Product Pack: Oracle Linux
Platform: x86 64bit
を指定し、「Go」を選択します。
Oracle Linux 6 Update 6 Media Pack for x86_64 (64bit)」リンクを選択します。
「Oracle Linux Release 6 Update 6 for x86_64 (64 Bit)」の「Download」を選択し、V52218-01.iso を保存します。

SoftLayer の管理ポータルにログインします。
https://control.softlayer.com/

Bare Metal Server を発注します。


・[Account] - [Place an Order] を選択します。
・[Devices] - [Bare Metal Servers] - [Monthly] を選択します。
・[Storage] 欄が 「Up to 4 drives」以上のサーバを選択
 ([Starting Price Per Month] 欄の金額リンクを選択)します。
 [Starting Price Per Hour] 欄が 「-」となっていないものは時間課金の Bare Metal Server 仕様で、
 RAID コントローラが選択できません。
 「Up to 2 drives」のサーバも同様です。
 今回は、RAID コントローラを選択する前提で説明します。
 Oracle Linux を導入するサーバでは、Oracle Database をインストールする目的であることが想定され、
 その場合、RAID コントローラを選択することが当然の選択と思われます。
・[Location] - [DATA CENTER] で 「TOK02」を選択します
 (執筆時には「HKG02」を選択しました。東京データセンタは TOK02 という略称になると思われます)。
・[System Configuration] - [OPERATING SYSTEM] で 「CentOS 6.x (64 bit)」 を選択します。
・[System Configuration] - [HARD DRIVES] - [Disk Controller] - [Disks] で「1」と「2」を
 選択(赤枠が表示される)し、[Assign Disks] を選択し、[SATA] - [500 GB SATA II] を選択します。
 ここは「None」以外であれば何を選択してよいです。
・システム領域用の論理ディスクを作成します。
 [System Configuration] - [HARD DRIVES] - [Disk Controller] - [Create RAID storage group] を選択し、
 [Type] で 「RAID 1」を、[Size] で 「25」 を、[Partition Template] で 「Linux Extra Partion」を入力し、
 [Done] を選択します。
・Swap用の論理ディスクを作成します。
 [System Configuration] - [HARD DRIVES] - [Disk Controller] - [Create RAID storage group] を選択し、
 [Type] で 「RAID 1」を、[Size] で 「33」 を入力し [Done] を選択します。
・その他用の論理ディスクを作成します。
 [System Configuration] - [HARD DRIVES] - [Disk Controller] - [Create RAID storage group] を選択し、
 [Type] で 「RAID 1」を入力し、[Size] は最大値のまま変更せずに [Done] を選択します。

 3つの論理ディスクを作成しましたが、仮想サーバのディスク構成を意識した結果こうなりました。

・[System Configuration] - [SERVER]、
 [System Configuration] - [RAM]、
 [Network Options] - [UPLINK PORT SPEEDS] は適宜変更してください。
 [UPLINK PORT SPEEDS] は 「1 Gbps Redundant Public & Private Network Uplinks」
 に変更することをお勧めしておきます。
・[Continue Your Order] を選択します。
・[Host and Domain Names] にて適切な値を入力し、
 [Subtotal] 欄で月額料金を確認し、[Adjustments] 欄で初期追加料金を確認し、
 [Terms and Conditions] のチェックを入れ、[Finalize Your Order] を選択します。

 数時間後に利用可能となります。


時間課金の仮想サーバを発注する場合は以下の通りです。Bare Metal Server の場合とできるだけ操作手順が同じになるように選択しています。SECOND DISK は必須ではありませんが手順をよみかえて下さい。


・[Account] - [Place an Order] を選択します。
・[Devices] - [Public Cloud Instances] - [Hourly] を選択します。
・[Location] - [DATA CENTER] で 「TOK02」を選択します
 (執筆時には「HKG02」を選択しました)。
・[System Configuration] - [OPERATING SYSTEM] で 「CentOS 6.x - Minimal Install (64 bit)」 を選択します。
・[System Configuration] - [FIRST DISK] で「25 GB (LOCAL)」を選択します。
・[System Configuration] - [SECOND DISK] で「25 GB (LOCAL)」を選択します。

 2台とも 「SAN」 に変更して構いません。サイズを増やしても問題ありません。

・[System Configuration] - [COMPUTING INSTANCE]、
 [System Configuration] - [RAM]、
 [Network Options] - [UPLINK PORT SPEEDS] は適宜変更してください。
・[Continue Your Order] を選択します。
・[Host and Domain Names] にて適切な値を入力し、
 [Subtotal] 欄で1時間当たりの課金額を確認し、[Adjustments] 欄で初期追加料金がないことを確認し、
 [Terms and Conditions] のチェックを入れ、[Finalize Your Order] を選択します。

 数分後に利用可能となります。


管理ポータルで [Devices] - [Device List] を選択します。
表示を何度か更新し、発注したサーバの時計アイコンが消えたら、サーバ名の左側に表示されている右向き三角を選択し、[Show Password] にチェックを入れます。
サーバの IP アドレス、アカウント (root)、パスワード情報が入手できたので、ssh でログインします。

ローカル yum リポジトリを用意します。

上でダウンロードした V52218-01.iso ファイルを scp でサーバの /root/ へコピーします。

httpd をインストールし、Oracle Linux インストーラをマウントして公開し、プライベート yum リポジトリとします。


yum -y install httpd
mkdir /var/www/html/ol66
mount -o loop V52218-01.iso /var/www/html/ol66
/etc/init.d/httpd start


インストールすべきパッケージでインストーラ iso に含まれていない標準パッケージをダウンロードします。
こちらのサイトは、ダウンロードエラーが発生しやすいようなので、正しくダウンロードできたことを必ず確認してください。


curl -L -O http://public-yum.oracle.com/repo/OracleLinux/OL6/latest/x86_64/getPackage/bind-devel-9.8.2-0.30.rc1.el6.x86_64.rpm
curl -L -O http://public-yum.oracle.com/repo/OracleLinux/OL6/latest/x86_64/getPackage/libc-client-2007e-11.el6.x86_64.rpm
curl -L -O http://public-yum.oracle.com/repo/OracleLinux/OL6/latest/x86_64/getPackage/php-devel-5.3.3-38.el6.x86_64.rpm
curl -L -O http://public-yum.oracle.com/repo/OracleLinux/OL6/latest/x86_64/getPackage/php-imap-5.3.3-38.el6.x86_64.rpm
curl -L -O http://public-yum.oracle.com/repo/OracleLinux/OL6/latest/x86_64/getPackage/python-tools-2.6.6-52.el6.x86_64.rpm
curl -L -O http://public-yum.oracle.com/repo/OracleLinux/OL6/latest/x86_64/getPackage/yum-plugin-fastestmirror-1.1.30-30.0.1.el6.noarch.rpm
file *.rpm
bind-devel-9.8.2-0.30.rc1.el6.x86_64.rpm:              RPM v3.0 bin i386/x86_64 bind-devel-32:9.8.2-0.30.rc1.el
libc-client-2007e-11.el6.x86_64.rpm:                   RPM v3.0 bin i386/x86_64 libc-client-2007e-11.el6
php-devel-5.3.3-38.el6.x86_64.rpm:                     RPM v3.0 bin i386/x86_64 php-devel-5.3.3-38.el6
php-imap-5.3.3-38.el6.x86_64.rpm:                      RPM v3.0 bin i386/x86_64 php-imap-5.3.3-38.el6
python-tools-2.6.6-52.el6.x86_64.rpm:                  RPM v3.0 bin i386/x86_64 python-tools-2.6.6-52.el6
yum-plugin-fastestmirror-1.1.30-30.0.1.el6.noarch.rpm: RPM v3.0 bin i386/x86_64 yum-plugin-fastestmirror-1.1.30


EPEL から、iftop パッケージをダウンロードします。


curl -L -O http://dl.fedoraproject.org/pub/epel/6/x86_64/iftop-1.0-0.7.pre4.el6.x86_64.rpm 
file iftop-*.rpm
iftop-1.0-0.7.pre4.el6.x86_64.rpm: RPM v3.0 bin i386/x86_64 iftop-1.0-0.7.pre4.el6


XenServer 用ユーティリティ・パッケージをダウンロードします。仮想サーバでのみ必要です。
Bare Metal Server では不要ですが、OS イメージを共通化する目的でインストールすることにします。


curl -L -O https://raw.githubusercontent.com/pcserver-jp/SoftLayer/master/xe-guest-utilities-6.2.0-1137.x86_64.rpm
curl -L -O https://raw.githubusercontent.com/pcserver-jp/SoftLayer/master/xe-guest-utilities-xenstore-6.2.0-1137.x86_64.rpm
file xe-*.rpm
xe-guest-utilities-6.2.0-1137.x86_64.rpm:          RPM v3.0 bin i386/x86_64 xe-guest-utilities-6.2.0-1137
xe-guest-utilities-xenstore-6.2.0-1137.x86_64.rpm: RPM v3.0 bin i386/x86_64 xe-guest-utilities-xenstore-6.2


RAID コントローラ用のパッケージをダウンロードします。仮想サーバでは不要ですが、入れておきます。


curl -L -O http://download.adaptec.com/raid/storage_manager/adaptec_event_monitor_v1_06_21062.zip
unzip adaptec_event_monitor_v1_06_21062.zip linux_x64/EventMonitor-1.06-21062.x86_64.rpm
mv linux_x64/EventMonitor-1.06-21062.x86_64.rpm .
rmdir linux_x64
\rm adaptec_event_monitor_v1_06_21062.zip
curl -L -O https://raw.githubusercontent.com/pcserver-jp/SoftLayer/master/kmod-aacraid-1.2.1-2.el6.x86_64.rpm
file kmod-*.rpm
kmod-aacraid-1.2.1-2.el6.x86_64.rpm: RPM v3.0 bin i386/x86_64 kmod-aacraid-1.2.1-2.el6


/srv/ に Oracle Linux をインストールします。
dd コマンドでファイルを作り、ブロックデバイスとして扱い、そこに Oracle Linux をインストールし、Rescue モードでルートデバイスにビットコピーしてもよいのですが、今回は tar コマンドを利用するだけで目的を果たせるので、loop デバイス等は使わず、分かりやすい手順を紹介します。

/srv/rpm 用のデータベースを作成します。


rm -rf /srv
mkdir /srv
rpm --root=/srv --rebuilddb


/srv/oraclelinux-release-6Server-6.0.2.x86_64.rpm をインストールします。


rpm --root=/srv --nodeps -ivh /var/www/html/ol66/Packages/oraclelinux-release-6Server-6.0.2.x86_64.rpm


/srv/ に Oracle Linux の yum リポジトリを登録し、yum コマンドを利用可能とします。


mkdir /srv/etc/yum.repos.d/
cat << 'EOF' | tee /srv/etc/yum.repos.d/tmp.repo
[tmp-base]
name=Oracle Linux 6 - Base
baseurl=http://localhost/ol66
gpgcheck=1
gpgkey=http://localhost/ol66/RPM-GPG-KEY-oracle
enabled=0
EOF


/srv/yum コマンドをインストールします。


yum -y --disablerepo=\* --enablerepo=tmp-base --installroot /srv install yum


/srv/ にネットワーク設定ファイルをコピーします。


cp -a /etc/sysconfig/network /srv/etc/sysconfig/
mkdir /srv/etc/sysconfig/network-scripts/
cp -a /etc/sysconfig/network-scripts/ifcfg-* /srv/etc/sysconfig/network-scripts/
cp -a /etc/sysconfig/network-scripts/route-* /srv/etc/sysconfig/network-scripts/
cp -a /etc/resolv.conf /srv/etc/
mkdir /srv/etc/dhcp/
cp -a /etc/dhcp/* /srv/etc/dhcp/


/srv/ にマウント設定ファイルを作成します。


cat << 'EOF' | tee /srv/etc/fstab
UUID=4bf120f5-6da0-4cb8-9540-bec49fff57a1 /     ext4    defaults        1 1
UUID=7e70ca17-3016-4b92-8542-615d909115f9 /boot ext4    defaults        1 2
UUID=299ff4da-8897-405b-ae8e-5648a14fc81e swap  swap    pri=1,defaults  0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
EOF


先ほど集めたファイルを /srv/srv/ にコピーします。


cp -a *.rpm /srv/srv/


RAID コントローラ用監視設定ファイルを /srv/srv/ にコピーします。
仮想サーバでは入手できません。仮想サーバのイメージを Bare Metal Server へ移植する際には、移植前に一度 CentOS をインストールして、以下のファイルを入手する必要があります。物理サーバごとに設定 (送信元メールアドレス) が異なります。


[ -d /proc/xen/ ] || cp -a /usr/Adaptec_Event_Monitor/Email_Notification_Status.cfg /srv/srv/
[ -d /proc/xen/ ] || cp -a /usr/Adaptec_Event_Monitor/Mail_Recipients.cfg /srv/srv/
[ -d /proc/xen/ ] || cp -a /usr/Adaptec_Event_Monitor/SMTP_Server_Details.cfg /srv/srv/
[ -d /proc/xen/ ] || cp -a /usr/Adaptec_Event_Monitor/NRMFSAConfig.xml /srv/srv/


※ SMTP サーバが raidalerts-smtp.networklayer.com (66.228.118.25) になっており、プライベートネットワーク内にないので、閉域ネットワークを構築しようとしている場合は、そもそも設定を変更すべきです。

参考までに、mail に関する設定ファイルの内容を示しておきます。


cat << 'EOF' | tee /usr/Adaptec_Event_Monitor/Email_Notification_Status.cfg
1
EOF
cat << 'EOF' | tee /usr/Adaptec_Event_Monitor/Mail_Recipients.cfg
hwraid@softlayer.com,W
EOF
cat << 'EOF' | tee /usr/Adaptec_Event_Monitor/SMTP_Server_Details.cfg
SMTP_SERVER=raidalerts-smtp.networklayer.com
SMTP_PORT=25
FROM_MAIL_ID=<account ID>_<server ID>@softlayer.com
USE_SECURE_MAIL_SERVER=no
EOF


/srv/chroot します。


mount -t proc /proc /srv/proc
mount -t sysfs /sys /srv/sys
mount --bind /dev /srv/dev
chroot /srv


rpm 用データベースを作り直します。


rm /var/lib/rpm/*
rm -rf /var/cache/yum
rpm --initdb
rm -f /usr/share/info/dir
yum -y --disablerepo=\* --enablerepo=tmp-base install yum oraclelinux-release-6Server


SoftLayer で CentOS 6.x を選択した場合にインストールされているパッケージをインストールします。


yum -y --disablerepo=\* --enablerepo=tmp-base install \
  ConsoleKit \
  ConsoleKit-libs \
  MAKEDEV \
  OpenIPMI \
  OpenIPMI-libs \
  abrt \
  abrt-addon-ccpp \
  abrt-addon-kerneloops \
  abrt-addon-python \
  abrt-cli \
  abrt-libs \
  abrt-tui \
  acl \
  acpid \
  aic94xx-firmware \
  alsa-lib \
  alsa-utils \
  apr \
  apr-devel \
  apr-util \
  apr-util-devel \
  apr-util-ldap \
  at \
  atk \
  atmel-firmware \
  attr \
  audit \
  authconfig \
  autoconf \
  automake \
  avahi-libs \
  b43-fwcutter \
  b43-openfwwf \
  bc \
  bfa-firmware \
  bind-libs \
  bind-utils \
  binutils \
  biosdevname \
  blktrace \
  bridge-utils \
  btparser \
  busybox \
  bzip2 \
  cairo \
  checkpolicy \
  cpio \
  cpuspeed \
  crda \
  cronie \
  cronie-anacron \
  crontabs \
  cryptsetup-luks \
  cryptsetup-luks-libs \
  cups-libs \
  cvs \
  cyrus-sasl \
  cyrus-sasl-devel \
  cyrus-sasl-plain \
  dash \
  db4-cxx \
  db4-devel \
  dbus \
  dbus-glib \
  dbus-libs \
  dbus-python \
  desktop-file-utils \
  device-mapper \
  device-mapper-event \
  device-mapper-event-libs \
  device-mapper-libs \
  device-mapper-persistent-data \
  dhclient \
  dhcp-common \
  diffutils \
  dmidecode \
  dmraid \
  dmraid-events \
  dosfstools \
  dracut \
  dracut-kernel \
  e2fsprogs \
  e2fsprogs-libs \
  ed \
  efibootmgr \
  eggdbus \
  eject \
  elfutils \
  elfutils-libs \
  ethtool \
  expat-devel \
  expect \
  file \
  findutils \
  fipscheck \
  fipscheck-lib \
  fontconfig \
  fprintd \
  fprintd-pam \
  freetype \
  gawk \
  gdk-pixbuf2 \
  gettext \
  gnutls \
  gpm-libs \
  grub \
  grubby \
  gtk2 \
  hal \
  hal-info \
  hal-libs \
  hdparm \
  hicolor-icon-theme \
  httpd \
  httpd-devel \
  httpd-tools \
  hunspell \
  hunspell-en \
  hwdata \
  initscripts \
  ipmitool \
  iproute \
  iptables \
  iptables-ipv6 \
  iputils \
  ipw2100-firmware \
  ipw2200-firmware \
  irqbalance \
  iscsi-initiator-utils \
  ivtv-firmware \
  iw \
  iwl100-firmware \
  iwl1000-firmware \
  iwl3945-firmware \
  iwl4965-firmware \
  iwl5000-firmware \
  iwl5150-firmware \
  iwl6000-firmware \
  iwl6000g2a-firmware \
  iwl6050-firmware \
  jasper-libs \
  kbd \
  kbd-misc \
  kernel \
  kernel-firmware \
  kexec-tools \
  kpartx \
  ledmon \
  libX11 \
  libX11-common \
  libXau \
  libXcomposite \
  libXcursor \
  libXdamage \
  libXext \
  libXfixes \
  libXft \
  libXi \
  libXinerama \
  libXrandr \
  libXrender \
  libaio \
  libblkid \
  libcap-ng \
  libdrm \
  libedit \
  libertas-usb8388-firmware \
  libfprint \
  libgomp \
  libjpeg-turbo \
  libnih \
  libnl \
  libpcap \
  libpciaccess \
  libpng \
  libproxy \
  libproxy-bin \
  libproxy-python \
  libreport \
  libreport-cli \
  libreport-compat \
  libreport-plugin-kerneloops \
  libreport-plugin-logger \
  libreport-plugin-mailx \
  libreport-plugin-reportuploader \
  libreport-python \
  libselinux-utils \
  libsemanage \
  libss \
  libtar \
  libthai \
  libtiff \
  libudev \
  libusb \
  libusb1 \
  libuser \
  libutempter \
  libuuid \
  libxcb \
  libxml2-python \
  lm_sensors-libs \
  logrotate \
  lsof \
  lvm2 \
  lvm2-libs \
  lzo \
  m4 \
  mailcap \
  mailx \
  man \
  man-pages \
  man-pages-overrides \
  mdadm \
  microcode_ctl \
  mingetty \
  mlocate \
  module-init-tools \
  mtr \
  mysql-libs \
  nano \
  net-snmp-libs \
  net-tools \
  newt \
  newt-python \
  ntp \
  ntpdate \
  ntsysv \
  numactl \
  openldap-devel \
  openssh \
  openssh-clients \
  openssh-server \
  pam_passwdqc \
  pango \
  parted \
  passwd \
  pciutils \
  pciutils-libs \
  pcmciautils \
  perl \
  perl-Module-Pluggable \
  perl-Pod-Escapes \
  perl-Pod-Simple \
  perl-libs \
  perl-version \
  php \
  php-cli \
  php-common \
  pinfo \
  pixman \
  plymouth \
  plymouth-core-libs \
  plymouth-scripts \
  pm-utils \
  policycoreutils \
  polkit \
  postfix \
  prelink \
  procps \
  psacct \
  psmisc \
  python-ethtool \
  python-iwlib \
  ql2100-firmware \
  ql2200-firmware \
  ql23xx-firmware \
  ql2400-firmware \
  ql2500-firmware \
  quota \
  rdate \
  readahead \
  redhat-logos \
  rfkill \
  rng-tools \
  rootfiles \
  rsync \
  rsyslog \
  rt61pci-firmware \
  rt73usb-firmware \
  scl-utils \
  selinux-policy \
  selinux-policy-targeted \
  setserial \
  setuptool \
  sg3_utils-libs \
  sgpio \
  shadow-utils \
  slang \
  smartmontools \
  snappy \
  sos \
  strace \
  sudo \
  sysstat \
  system-config-firewall-base \
  system-config-firewall-tui \
  system-config-network-tui \
  systemtap-runtime \
  sysvinit-tools \
  tar \
  tcl \
  tcp_wrappers \
  tcp_wrappers-libs \
  tcpdump \
  tcsh \
  time \
  tix \
  tk \
  tkinter \
  tmpwatch \
  traceroute \
  udev \
  unzip \
  upstart \
  usbutils \
  usermode \
  ustr \
  util-linux-ng \
  vconfig \
  vim-common \
  vim-enhanced \
  vim-minimal \
  virt-what \
  wget \
  which \
  wireless-tools \
  words \
  xdg-utils \
  xmlrpc-c \
  xmlrpc-c-client \
  xorg-x11-drv-ati-firmware \
  xz \
  xz-lzma-compat \
  yum-plugin-security \
  yum-utils \
  zd1211-firmware \
  zip

yum -y --disablerepo=\* --enablerepo=tmp-base localinstall /srv/*.rpm


centos-indexhtml, libreport-plugin-rhtsupport は Oracle Linux にないので入れていません。centos-release-6 の代わりに oraclelinux-release-6Server を入れています。


RAID コントローラの監視設定を入れます。


/etc/init.d/EventMonitorService stop
[ -d /proc/xen/ ] || mv /srv/*.cfg /srv/*.xml /usr/Adaptec_Event_Monitor/


UEK カーネルをインストールします。仮想サーバでは残念ながら動きません。動きませんが、Oracle 社のパッケージで依存関係上必要となることがあるので入れておきます。


rpm -ivh http://localhost/ol66/Packages/kernel-uek-3.8.13-44.1.1.el6uek.x86_64.rpm http://localhost/ol66/Packages/kernel-uek-firmware-3.8.13-44.1.1.el6uek.noarch.rpm


Bare Metal Server で ntpd デーモンが自動起動するように設定します。XenServer 用のユーティリティが自動起動しないように設定します。


[ -d /proc/xen/ ] || chkconfig ntpd on
[ -d /proc/xen/ ] || chkconfig --del xe-linux-distribution


仮想サーバで RAID コントローラ監視が動かないように設定します。


[ -d /proc/xen/ ] && chkconfig --del EventMonitorService


yum リポジトリ設定を入れておきます。


\rm /etc/yum.repos.d/tmp.repo /srv/*.rpm

cat << 'EOF' | tee /etc/yum.repos.d/public-yum-ol6.repo
[ol6_latest]
name=Oracle Linux $releasever Latest ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/latest/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1

[ol6_addons]
name=Oracle Linux $releasever Add ons ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/addons/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[ol6_ga_base]
name=Oracle Linux $releasever GA installation media copy ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/0/base/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[ol6_u1_base]
name=Oracle Linux $releasever Update 1 installation media copy ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/1/base/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[ol6_u2_base]
name=Oracle Linux $releasever Update 2 installation media copy ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/2/base/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[ol6_u3_base]
name=Oracle Linux $releasever Update 3 installation media copy ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/3/base/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[ol6_u4_base]
name=Oracle Linux $releasever Update 4 installation media copy ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/4/base/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[ol6_u5_base]
name=Oracle Linux $releasever Update 5 installation media copy ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/5/base/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[ol6_u6_base]
name=Oracle Linux $releasever Update 6 installation media copy ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/6/base/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[ol6_UEKR3_latest]
name=Latest Unbreakable Enterprise Kernel for Oracle Linux $releasever ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/UEKR3/latest/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[ol6_UEK_latest]
name=Latest Unbreakable Enterprise Kernel for Oracle Linux $releasever ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/UEK/latest/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[ol6_UEK_base]
name=Unbreakable Enterprise Kernel for Oracle Linux $releasever ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/UEK/base/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[ol6_MySQL]
name=MySQL 5.5 for Oracle Linux 6 ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/MySQL/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[ol6_gdm_multiseat]
name=Oracle Linux 6 GDM Multiseat ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/gdm_multiseat/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[ol6_MySQL56]
name=MySQL 5.6 for Oracle Linux 6 ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/MySQL56/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[ol6_spacewalk20_server]
name=Spacewalk Server 2.0 for Oracle Linux 6 ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/spacewalk20/server/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

[ol6_spacewalk20_client]
name=Spacewalk Client 2.0 for Oracle Linux 6 ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/spacewalk20/client/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

# the following repositories are only available for x86_64 architecture systems
[ol6_ofed_UEK]
name=OFED supporting tool packages for Unbreakable Enterprise Kernel on Oracle Linux 6 ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/ofed_UEK/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0
priority=20

[ol6_playground_latest]
name=Latest mainline stable kernel for Oracle Linux 6 ($basearch) - Unsupported
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/playground/latest/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0
EOF


OS 起動設定を入れます。SELinux は無効化しておきます。


cat << 'EOF' | tee /boot/grub/grub.conf
default=0
fallback=1
timeout=5
title Oracle Linux 6 (3.8.13-44.1.1.el6uek.x86_64)
        root (hd0,0)
        kernel /vmlinuz-3.8.13-44.1.1.el6uek.x86_64 ro root=UUID=4bf120f5-6da0-4cb8-9540-bec49fff57a1 rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYBOARDTYPE=pc KEYTABLE=us selinux=0
        initrd /initramfs-3.8.13-44.1.1.el6uek.x86_64.img
title Oracle Linux 6 (2.6.32-504.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=UUID=4bf120f5-6da0-4cb8-9540-bec49fff57a1 rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYBOARDTYPE=pc KEYTABLE=us selinux=0
        initrd /initramfs-2.6.32-504.el6.x86_64.img
EOF
[ -d /proc/xen/ ] && sed -i -e 's;selinux=0;console=hvc0 selinux=0;' /boot/grub/grub.conf
ln -s grub.conf /boot/grub/menu.lst
ln -s /boot/grub/grub.conf /etc/grub.conf
cat << 'EOF' | tee /etc/sysconfig/grub
boot=/dev/sda
forcelba=0
EOF
sed -i -e 's/^SELINUX=.*$/SELINUX=disabled/' /etc/sysconfig/selinux
cat << 'EOF' | tee /etc/sysconfig/kernel
UPDATEDEFAULT=yes
DEFAULTKERNEL=kernel-uek
EOF


仮想サーバでは、仮想 HDD のデバイス名が /dev/sda 等ではなく、/dev/xvda 等となるので書き換えます。


[ -d /proc/xen/ ] && sed -i -e 's;^boot=.*$;boot=/dev/xvda;' /etc/sysconfig/grub


仮想サーバでは UEK カーネルが動かないので書き換えます。


[ -d /proc/xen/ ] && sed -i -e 's;kernel-uek;kernel;' /etc/sysconfig/kernel
[ -d /proc/xen/ ] && sed -i -e 's;default=0;default=1;' /boot/grub/grub.conf


ロケール設定を入れます。


cat << 'EOF' | tee /etc/sysconfig/i18n
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
EOF
#cat << 'EOF' | tee /etc/sysconfig/i18n
#LANG="C"
#SYSFONT="latarcyrheb-sun16"
#EOF
#cat << 'EOF' | tee /etc/sysconfig/i18n
#LANG="ja_JP.UTF-8"
#SYSFONT="latarcyrheb-sun16"
#EOF

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

cat << 'EOF' | tee /etc/sysconfig/keyboard
KEYTABLE="us"
MODEL="pc105+inet"
LAYOUT="us"
KEYBOARDTYPE="pc"
EOF
#cat << 'EOF' | tee /etc/sysconfig/keyboard
#KEYTABLE="jp106"
#MODEL="jp106"
#LAYOUT="jp"
#KEYBOARDTYPE="pc"
#EOF


カーネルモジュール設定を追加します。仮想サーバではボンディング設定を入れない方がよいかもしれません。今回は、Bare Metal Server と仮想サーバのイメージをできるだけ揃えるという方針とします。


cat << 'EOF' | tee /etc/modprobe.d/anaconda.conf
options floppy allowed_drive_mask=0
EOF
cat << 'EOF' | tee /etc/modprobe.d/ixgbe.conf
options ixgbe IntMode=1,1
EOF
cat << 'EOF' | tee /etc/modprobe.d/local.conf
alias bond0 bonding
alias bond1 bonding
EOF


システム認証に必要なすべての構成ファイルを更新します。SoftLayer ではなぜか、sha512 ではなく md5 にしているようです。sha512 にしておきます。


authconfig --enableshadow --passalgo=sha512 --updateall


root アカウントにパスワードを付与します。


passwd root
Changing password for user root.
New password: ********
Retype new password: ********
passwd: all authentication tokens updated successfully.


これで、OS イメージがほぼ完成しました。SoftLayer の CentOS と同等の構成になっています。
chroot 環境から抜けます。


exit
umount /srv/dev
umount /srv/sys
umount /srv/proc


※ ここで 「device is busy」 というエラーが出ても無視してかまいません。

Rescue モードで起動するための準備をします。
Network 設定は、Private VLAN 接続前提に決め打ちしています。Private VLAN のサブネットも 26bit マスクで決め打ちしてます。
DHCP サーバを用意しているのであれば、「ip=」 以下は 「ip=dhcp」に置き換えてもよいです。


curl -o /boot/vmlinuz http://mirrors.service.networklayer.com/centos/6.6/os/x86_64/isolinux/vmlinuz
curl -o /boot/initrd.img http://mirrors.service.networklayer.com/centos/6.6/os/x86_64/isolinux/initrd.img
file /boot/{vmlinuz,initrd.img}
/boot/vmlinuz: Linux kernel x86 boot executable bzImage, version 2.6.32-504.el6.x86_64 (mockbuil, RO-rootFS, swap_dev 0x3, Normal VGA
/boot/initrd.img: LZMA compressed data, streamed

ifconfig bond0 > /dev/null 2>&1 && NIC0=bond0 || NIC0=eth0
ifconfig bond1 > /dev/null 2>&1 && NIC1=bond1 || NIC1=eth1
IP0=$(ifconfig $NIC0 | grep ' inet ' | awk '{print $2}' | awk -F: '{print $2}')
IP1=$(ifconfig $NIC1 | grep ' inet ' | awk '{print $2}' | awk -F: '{print $2}')
NETMASK0=255.255.255.192
NETMASK1=255.255.255.248
GATEWAY0=$(if route -n | grep -q '^10\.0\.0\.0'; then route -n | grep '^10\.0\.0\.0'; else route -n | grep '^0\.0\.0\.0'; fi | awk '{print $2}')
GATEWAY1=$(route -n | grep '^0\.0\.0\.0' | awk '{print $2}')
DNS0=10.0.80.11
DNS1=8.8.8.8
if true; then
  KSDEVICE=eth0
  IP=$IP0
  NETMASK=$NETMASK0
  GATEWAY=$GATEWAY0
  DNS=$DNS0
else
  KSDEVICE=eth1
  IP=$IP1
  NETMASK=$NETMASK1
  GATEWAY=$GATEWAY1
  DNS=$DNS1
fi

if [ -d /proc/xen/ ]; then
cat << EOF | tee /boot/grub/grub.conf
default=0
timeout=1
title Rescue
root (hd0,0)
kernel /vmlinuz rescue repo=http://mirrors.service.networklayer.com/centos/6.6/os/x86_64/ nomount sshd=1 lang=en_US keymap=us selinux=0 biosdevname=0 ksdevice=$KSDEVICE ip=$IP netmask=$NETMASK gateway=$GATEWAY dns=$DNS
initrd /initrd.img
EOF
fi


OS を再起動します。Bare Metal Server の BIOS 初期化は時間がかかるのでスキップしています。
OS 再起動後、2分ほど経過すると Rescue モードで起動するので、ssh でログインします。
root アカウントにてパスワードなしでログインします。


[ -d /proc/xen/ ] || /sbin/kexec -l /boot/vmlinuz --initrd=/boot/initrd.img --command-line="rescue repo=http://mirrors.service.networklayer.com/centos/6.6/os/x86_64/ nomount sshd=1 lang=en_US keymap=us selinux=0 biosdevname=0 ksdevice=$KSDEVICE ip=$IP netmask=$NETMASK gateway=$GATEWAY dns=$DNS"
reboot
 
ssh root@<server のプライベート IP アドレス>


パスワードなしでログインできる状態は危険なので、sshd デーモンを停止します。


kill -KILL $(ps -ef | grep [/]sbin/sshd | awk '{print $2}')


先ほど作成した OS イメージをバックアップします。


DEV_A=sda
[ -d /proc/xen/ ] && DEV_A=xvda
mkdir /mnt/sysimage
mount /dev/${DEV_A}2 /mnt/sysimage
mount /dev/${DEV_A}1 /mnt/sysimage/boot

cd /mnt/sysimage/srv
tar czvf /tmp/os.tgz .

cd /
umount /mnt/sysimage/boot
umount /mnt/sysimage


※ 仮想サーバでメモリを 1GB しか積んでいない場合、メモリ不足で tar コマンドが失敗します。圧縮後 430MB ほどになるので、/dev/os.tgz として保存すれば、ぎりぎり足りるのではないかと思います。/dev/ の方が、/tmp/ より 150MB ほど空きが大きいです。


HDD を初期化して、パーティショニングします。


dd if=/dev/zero of=/dev/${DEV_A} bs=1M count=1
fdisk -H 64 -S 32 /dev/${DEV_A} << 'EOF'
o
n
p
1

+250M
n
p
2


p
w
EOF

DEV_B=sdb
[ -d /proc/xen/ ] && DEV_B=xvdb
dd if=/dev/zero of=/dev/${DEV_B} bs=1M count=1
fdisk -H 64 -S 32 /dev/${DEV_B} << 'EOF'
o
n
p
1


t
82
p
w
EOF

DEV_C=sdc
[ -d /proc/xen/ ] && DEV_C=xvdc
if [ -e /dev/${DEV_C} ]; then
dd if=/dev/zero of=/dev/${DEV_C} bs=1M count=1
fdisk -H 64 -S 32 /dev/${DEV_C} << 'EOF'
o
n
p
1


p
w
EOF
fi


パーティショをフォーマットし、マウントし、先ほどバックアップした OS イメージを展開します。


mkfs.ext4 -L /boot -U 7e70ca17-3016-4b92-8542-615d909115f9 /dev/${DEV_A}1
tune2fs -c 0 -i 0 /dev/${DEV_A}1
mkfs.ext4 -L / -U 4bf120f5-6da0-4cb8-9540-bec49fff57a1 /dev/${DEV_A}2
tune2fs -c 0 -i 0 /dev/${DEV_A}2
mkswap -L SWAP -U 299ff4da-8897-405b-ae8e-5648a14fc81e /dev/${DEV_B}1

mount /dev/${DEV_A}2 /mnt/sysimage
mkdir /mnt/sysimage/boot
chmod 555 /mnt/sysimage/boot
mount /dev/${DEV_A}1 /mnt/sysimage/boot

cd /mnt/sysimage
tar xzvf /tmp/os.tgz


※ ここは、次回、「ルートパーティションの暗号化」 をする場合に差し替える部分となります。

chroot して grub をインストールします。仮想サーバでは、ここでインストールする grub ではなく、ハイパーバイザ側の pv-grub が機能します。


mount -t proc /proc /mnt/sysimage/proc
mount -t sysfs /sys /mnt/sysimage/sys
mount --bind /dev /mnt/sysimage/dev
chroot /mnt/sysimage

\cp /proc/mounts /etc/mtab

DEV_A=sda
[ -d /proc/xen/ ] && DEV_A=xvda
cat << EOF | tee /boot/grub/device.map
(hd0)     /dev/${DEV_A}
EOF

grub-install /dev/${DEV_A} || :
if [ -d /proc/xen/ ]; then
grub << 'EOF'
device (hd0) /dev/xvda
root (hd0,0)
setup (hd0)
quit
EOF
fi


念のため、初期 RAM ディスクを再作成しておきます。


cd /boot
mkinitrd --force initramfs-2.6.32-504.el6.x86_64.img 2.6.32-504.el6.x86_64
mkinitrd --force initramfs-3.8.13-44.1.1.el6uek.x86_64.img 3.8.13-44.1.1.el6uek.x86_64


再起動します。


exit
umount /mnt/sysimage/dev
umount /mnt/sysimage/sys
umount /mnt/sysimage/proc
cd /
umount /mnt/sysimage/boot
umount /mnt/sysimage

reboot


これで作業は完了です。
注記したことを除けば、SoftLayer の CentOS の構成をできるだけ忠実に再現しているので、iptables の設定はしていませんし、IPv6 の無効化も行っていません。yum による最新パッチ適用、ssh 公開鍵の登録も行っていません。このあたりは、それぞれのポリシーに従って変更してください。

※ 細かい点まで追記すると、CentOS を入れた仮想サーバにインストールされている rpm 化されていない監視ソフト Nimsoft Robot がインストールされていません。Bare Metal Server にインストールされている rpm 化されていないシェアウェアの burnin という高負荷をかけてハードウェアの信頼性をテストするソフトがインストールされていません。

0 件のコメント:

コメントを投稿