AWS

2011年08月12日

このエントリーをはてなブックマークに追加

動いてた物が動かなくなる

Amazon RDS用の運用スクリプトを書いていた時の出来事。 作業場所を移動して作業を再開したタイミングでエラーが出て動かなくなってしまった。 原因調査の旅の始まり。

エラーメッセージ

<ErrorResponse xmlns="http://rds.amazonaws.com/doc/2010-07-28/">
  <Error>
    <Type>Sender</Type>
    <Code>RequestExpired</Code>
    <Message>Request has expired. Timestamp date: 2011-08-12T02:28:49.000Z</Message>
  </Error>
  <RequestId>04efc58a-c48d-11e0-951b-dfc50e2855f7</RequestId>
</ErrorResponse>
検証環境
  • Ubuntu 10.04.3 Server LTS
  • right_aws 2.1.0
  • ruby 1.8.7p249
  • virtualbox 4.0.2 r72916
  • windows 7 (32bit)
結論から述べれば、実行環境の時間がズレていた

スクリプトの動作的に問題はないはずだと思っていたので、時刻問題だと推測。 時刻を確認してみると、、およそ15分遅れていた。


$ sudo ntpdate -b time.nist.gov
12 Aug 11:45:43 ntpdate[8462]: step time server 192.43.244.18 offset 946.878185 sec

時刻を同期させあとは、スクリプトが期待する動きになった。

あと書き

単なる凡ミス。手元の開発環境だからと言う理由で時刻同期設定をサボっていた自分が悪い。

続きを読む


編集
@hansode at 12:40|PermalinkComments(0)TrackBack(0)

2010年09月27日

このエントリーをはてなブックマークに追加

きっかけは『インスタンスを起動出来ない』と言う報告

ホームディレクトリを整理していたら出て来たスクリプト。

以前、EC2のインスタンスを起動出来ない原因を調査した。
その時の原因は、

pk.pemとcert.pemがペアではなかった事

ごく稀なケース。
複数のキーペアを管理し切れなかった結果なのだろう。

調査報告時に殴り書きしたシェルスクリプトが下記のvalidate-keypair.sh。

▼validate-keypair.sh


#!/bin/bash
#
# http://blog.hansode.org/
#
LANG=C


pk=$1
cert=$2


function usage() {
  cat <<EOS
usage:
 $ $0 [ pk.pem ] [ cert.pem ]
EOS
  exit 1
}

[ -f "${pk}" ] || usage
[ -f "${cert}" ] || usage

function gen_cert_pubkey() {
  openssl x509 -pubkey -in ${cert} -noout
}

function gen_pk_pubout() {
  openssl rsa -pubout -in  ${pk} 2>/dev/null
}

echo "generating cert pubkey..."
gen_cert_pubkey | sed 's,^,D:,'
echo "generated."

echo "generating pk pubout..."
gen_pk_pubout | sed 's,^,D:,'
echo "generated."

echo "validating..."
diff <(gen_cert_pubkey) <(gen_pk_pubout)

[ $? = 0 ] && {
  echo valid
  exit 0
} || {
  echo invalid
  exit 1
}

▼使用例


$ ./validate-keypair.sh pk-a1b2c3d4e5f6.pem cert-a1b2c3d4e5f6.pem

後書き

ファイル名の命名規則からペアであるか、ペアでないかを見分けられる。
通常、pk-*****.pem と cert-****.pem には同じ文字列が含まれている。

運用ルール等により、pk.pemとcert.pemへリネームする必要が出ると、ファイル名から推測出来なくなる。
悪意を持ってペアではないファイル名を、見た目上のペアにする事は可能。

インスタンスを起動出来ない原因追求に役に立てたら嬉しい限り。

続きを読む


編集
@hansode at 15:00|PermalinkComments(0)TrackBack(0)

2010年05月21日

このエントリーをはてなブックマークに追加

Amazon EC2特有仕様により、環境構築に苦戦した

忘れないうちに手順をまとめておく。
苦戦要因は、IPアドレスだ。

Amazon EC2には、ローカルIPアドレスと、グローバルIPアドレスが存在する。
インスタンス内ではローカルIPアドレスを使用。

通常、Hinemosマネージャーに指定するのはIPアドレス。
果たして、Hinemosマネージャーに指定するIPアドレスは…?


▼動作実績環境

  • CentOS-5.5(x86_64)
  • Linux 2.6.21.7-2.fc8xen
  • Hinemos 3.1.4


事前作業

▼Security Groupに新グループ追加

  • tcp
    • 1098
    • 1099
    • 3873
    • 4444
    • 4445
    • 4446
    • 4457
    • 8009
    • 8080
    • 8083
    • 24457
  • udp
    • 514

追加したグループを指定し、インスタンス起動する


作業内容

▼必要に応じてインストール


# yum -y update
# yum -y install wget

▼Hinemosマネージャをダウンロード、伸張


# cd /tmp/
# wget 'http://sourceforge.jp/frs/redir.php?m=iij&f=%2Fhinemos%2F45345%2Fhinemos_manager-3.1.4_rhel5_32.tar.gz'
# tar zxvf hinemos_manager-3.1.4_rhel5_32.tar.gz
# cd Hinemos_Manager-3.1.4_rhel5_32/

▼syslog-ngインストール時にエラーになるので、syslog-ng.confのテンプレートを修正


# cp -pi syslog-ng_setup.conf syslog-ng_setup.conf.0
# vi syslog-ng_setup.conf
# diff syslog-ng_setup.conf.0 syslog-ng_setup.conf
21c21
< source s_net { tcp(ip(0.0.0.0) port(514) max-connections(70)); tcp6(ip(::0) port(1514)); udp(ip(0.0.0.0) port(514)); udp6(ip(::0) port(514)); };
---
> source s_net { tcp(ip(0.0.0.0) port(514) max-connections(70)); udp(ip(0.0.0.0) port(514)); };

※EC2のLinuxカーネルがIPv6を使えない為、IPv6アドレスにportをbindする際、起動に失敗する。失敗させないための策。

▼インストールスクリプトを実行


# export LANG=C
# ./manager_installer_EN.sh
Hinemos installation will be started, is that OK?(Y/N default:Y)
>>enter<<

The installation user and the installation directory are created.


User hinemos is created.
Creating mailbox file: File exists
Changing password for user hinemos.
New UNIX password:********
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:>>hinemos<<
passwd: all authentication tokens updated successfully.
User hinemos was created.
Installation directory /opt/hinemos was created.

Manager's IP address is set.
Please input IP address of the server which installed Hinemos manager.
[[ Public DNS Name ]]※ここでIPアドレスではなく、Public DNS Nameを指定する
Is it [[ Public DNS Name ]]? (Y/N default:Y)

Please input JBoss boot user name.(hinemos/root default:hinemos)
>>enter<<
hinemos is correct? (Y/N default:Y)
>>enter<<
Start copying required files into the installation directory.
Please input ftp server's IP address needed by corrective run (default:127.0.0.1)
>>enter<<

JRE
Do you agree to the above license terms? [yes or no]
yes
Starting system logger:                                    [  OK  ]

/etc/hosts is changed.
May I change /etc/hosts? (Y/N)
Y

/etc/hosts was changed.
Please confirm it after the end of the installation.

The database is initialized.
waiting for postgres to start...
done
postgres started
ALTER ROLE
waiting for server to shut down.... done
server stopped

LDAP is initialized.
The initialization of LDAP was completed.

Hinemos manager installation was completed.

▼初回起動テスト


# su - hinemos -c /opt/hinemos/bin/hinemos_start.sh
Hinemos starting

waiting for postgres to start...
done
postgres started

waiting for slapd to start...
done
slapd started

waiting for jboss to start...
......................done
jboss started
Hinemos started

▼システム起動時にHinemosが起動するように設定


# cp -pi /etc/rc.local /tmp/rc.local.0
# vi /etc/rc.local
# diff /tmp/rc.local.0 /etc/rc.local
9a10,11
>
> /usr/bin/id hinemos && su - hinemos -c /opt/hinemos/bin/hinemos_start.sh

▼/etc/hostsを修正


# cp -pi /etc/hosts /tmp/hosts.0
# diff /tmp/hosts.0 /etc/hosts
2c2,3
< [[ Public DNS Name ]]      domU-12-34-56-78-AB-90
---
> [[ Internal IPv4 ]]        domU-12-34-56-78-AB-90
> [[ Internal IPv4 ]]        [[ Public DNS Name ]]

インストールスクリプトは、IPアドレス指定を想定しているので、/etc/hostsが不正内容となる。その対応修正。

▼システム再起動


# reboot

▼この後、Hinemosクライアントを利用

  • user: hinemos
  • pass: ********
  • host: jnp://[[ Public DNS Name ]]:1099

ログインに成功したら環境構築成功。


あと書き

Amazon EC2では「Public DNS Name」を上手に利用するべきだと分かった。

  • 内部で名前解決するとローカルIPアドレス
  • 外部で名前解決すると、グローバルIPアドレス
  • ルーティングの関係?で、インスタンス内からグローバルIPアドレスへは通信出来ない
  • 唯一、内外共通で利用出来るのが「Public DNS Name」と言う訳だ

これは別エントリで改めてまとめる予定。




編集
@hansode at 20:25|Permalink
このエントリーをはてなブックマークに追加

自分でシンプル環境を構築しよう

前回は、Xen domU用イメージ作成スクリプトを作った。
今回はAmazon EC2用イメージ作成スクリプトだ。

▼動作実績環境

  • CentOS-5.4(x86_64)
  • Linux 2.6.18-164.15.1.el5xen
  • yum 3.2.22
使用例

▼CentOS-5.5(2010/05/21現在最新)のツリーを作る


$ git clone git://github.com/hansode/vmbuilder.git
$ cd vmbuilder/ec2/redhat/
$ sudo make-domu-tree.sh --dist=centos --ver=5.5 --arch=i386

※ --dist=fedora とすると、fedoraのツリーが構築される。


誰かが作るであろう最新版CentOSのAMIを、もう、待つ必要がない。
次はDebian系のイメージに着手予定。




編集
@hansode at 15:10|PermalinkComments(0)TrackBack(0)

2010年05月06日

このエントリーをはてなブックマークに追加

EBS Backed domUを構築しよう

iSCSIのおかげで手軽にデバイスをattach/detach可能になった。

環境を構築する場合、S3 BackedよりはEBS Backedが便利だ。
そこで、EBS BackedのdomUを構築し、複製から復元を行う。

▼戦略

  1. dom0
    1. iSCSIデバイスに対し、ファイルシステム構築
    2. iSCSIデバイス内に最小構成環境を構築
    3. domUの仮想デバイスとしてiSCSIデバイスを指定し、起動
  2. domU-1
    1. ログイン
    2. ホスト名を記録したファイルを生成
  3. zfs
    1. 起動中domUのVolumeからsnapshotを作成
    2. 作成したsnapshotから、cloneして新規Volume作成
    3. cloneしたVolumeを、iSCSIターゲットとして公開
  4. dom0
    1. cloneして生成したiSCSIターゲットに接続
    2. 新iSCSIデバイスを仮想デバイスとして指定し、新たにdomUを起動
  5. domU-2
    1. ログイン
    2. clone元domUとは違うdomUである事を確認

複製元domU環境

▼domUの種イメージ用ツリーを作成


dom0$ cd /tmp
dom0$ git clone git://github.com/hansode/vmbuilder.git
dom0$ sudo /tmp/vmbuilder/xen/redhat/make-domu-tree.sh --dist=fedora --ver=8 --arch=i386

▼iSCSIデバイスにファイルシステムを構築し、ツリーの内容を同期


dom0$ sudo mkfs.ext3 /dev/sdc
dom0$ sudo /dev/sdc /mnt
dom0$ sudo rsync -avx /tmp/fedora-8_i386/ /mnt/
dom0$ sudo umount /mnt

▼domU-1起動準備


dom0$ cd /home/xen/domu
dom0$ sudo mkdir fc8-ebs-backed-sdc
dom0$ cd fc8-ebs-backed-sdc
dom0$ sudo vi ebs-backed.cfg

▼domU-1用cfg作成


name        = 'fc8-ebs-backed-sdc'
memory      = '256'
vcpus       = 1
bootroader  = '/usr/bin/pygrub'
root        = '/dev/xvda ro'
vfb         = [ ]
disk        = [ 'phy:/dev/sdc,xvda,w' ]
vif         = [ '' ]
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'

▼domU-1起動


dom0$ sudo xm create -c ./ebs-backed.cfg
...(省略)...

▼domU-1にログイン


login: root
domU-1# touch `hostname`

/root/`hostname`として識別可能


domUを量産

▼起動中インスタンスのVolumeからスナップショット作成


zfs$ time pfexec zfs snapshot rpool/ebs/vol-001@`date +%Y-%m-%d-%H:%M:%S`
zfs$ zfs list -t snapshot |grep rpool/ebs
rpool/ebs/vol-001@2010-04-28-18:35:29             0      -   793M  -
zfs$ pfexec zfs clone rpool/ebs/vol-001@2010-04-28-18:35:29 rpool/ebs/vol-001.ebs-backed.clone
zfs$ zfs list |grep rpool/ebs/
rpool/ebs/vol-001                   1.81G   206G   793M  -
rpool/ebs/vol-001.ebs-backed.clone      0   205G   793M  -

▼iSCSIターゲット設定


zfs$ pfexec zfs set shareiscsi=on rpool/ebs/vol-001.ebs-backed.clone
zfs$ iscsitadm list target rpool/ebs/vol-001.ebs-backed.clone
Target: rpool/ebs/vol-001.ebs-backed.clone
    iSCSI Name: iqn.1986-03.com.sun:02:5a2e64d3-ef9b-4404-ed53-90fa4a0b83ae
    Connections: 0
a

▼iSCSI接続


dom0# iscsiadm -m discovery -t sendtargets -p 192.168.1.21
192.168.1.21:3260,1 iqn.1986-03.com.sun:02:8353afa5-f355-61f2-84ee-fac93b2e3eb7
192.168.1.21:3260,1 iqn.1986-03.com.sun:02:5a2e64d3-ef9b-4404-ed53-90fa4a0b83ae
dom0# iscsiadm -m node -l -T iqn.1986-03.com.sun:02:5a2e64d3-ef9b-4404-ed53-90fa4a0b83ae
Logging in to [iface: default, target: iqn.1986-03.com.sun:02:5a2e64d3-ef9b-4404-ed53-90fa4a0b83ae, portal: 192.168.1.21,3260]
Login to [iface: default, target: iqn.1986-03.com.sun:02:5a2e64d3-ef9b-4404-ed53-90fa4a0b83ae, portal: 192.168.1.21,3260]: successful

▼iSCSIデバイス名を確認


dom0# ls -la /dev/disk/by-path/ | grep iqn.1986-03.com.sun:02:5a2e64d3-ef9b-4404-ed53-90fa4a0b83ae
lrwxrwxrwx 1 root root   9 Apr 28 18:44 ip-192.168.1.21:3260-iscsi-iqn.1986-03.com.sun:02:5a2e64d3-ef9b-4404-ed53-90fa4a0b83ae-lun-0 -> ../../sdd
項目内容
IQNiqn.1986-03.com.sun:02:5a2e64d3-ef9b-4404-ed53-90fa4a0b83ae
デバイス名/dev/sdd

▼domU-2起動準備


dom0# cd /home/xen/domu
dom0# mkdir fc8-ebs-backed-sdc
dom0# cd fc8-ebs-backed-sdd
dom0# sudo vi ebs-backed.cfg

▼domU-2用cfg作成


name        = 'fc8-ebs-backed-sdd'
memory      = '256'
vcpus       = 1
bootroader  = '/usr/bin/pygrub'
root        = '/dev/xvda ro'
vfb         = [ ]
disk        = [ 'phy:/dev/sdd,xvda,w' ]
vif         = [ '' ]
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'

▼起動前のdomU一覧確認


dom0# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  3773     4     r-----    330.9
fc8-ebs-backed-sdc                           2   256     1     -b----     16.1

domUが1つ起動している事が分かる

▼domU-2を起動


dom0# xm create -c ./ebs-backed.cfg

▼domU-2にログイン


login: root
domU-2# 

▼clone元のdomU-1で生成したファイルの存在を確認


domU-2# ls
node184.shinjuku.axsh.intra

▼domU-2のホスト名を確認


domU-2# hostname
node189.shinjuku.axsh.intra

別物出ある事を確認

▼ログイン記録を確認してみると


domU# last
root     xvc0                          Wed Apr 28 18:47   still logged in
reboot   system boot  2.6.21-2950.fc8x Wed Apr 28 18:47          (00:02)
root     xvc0                          Wed Apr 28 18:36 - crash  (00:10)
reboot   system boot  2.6.21-2950.fc8x Wed Apr 28 18:31          (00:17)

wtmp begins Wed Apr 28 18:31:12 2010

起動中にcloneすると、crash扱いされている。



あと書き

以上の様に、あっさり手軽にdomUを複製出来る事が分かる。

今回は起動中domUのVolumeからsnapshot、cloneした。
あらかじめ種Volumeを作っておき、種Volumeをcloneして行けばdomUを手軽に量産可能だ。

まだまだ手作業が多い。
今後は手順を単純化して行く。

続きを読む


編集
@hansode at 15:50|PermalinkComments(0)TrackBack(0)

2010年04月27日

このエントリーをはてなブックマークに追加

続・Amazon EBSに対する基本操作をしてみる

▼戦略

  1. zfs
    1. domUにattach済volumeからsnapshot作成
    2. 作成したsnapshotからcloneを作成
    3. 作成したcloneからvolumeを作成
    4. volumeをiSCSIターゲット化
  2. dom0
    1. iSCSIイニシエータからiSCSIターゲットにログイン
    2. iSCSIデバイスをdomUにattach
  3. domU
    1. domUからattach済volumeをマウント
    2. ファイルシステムの内容確認

snapshot作成

▼snapshot作成前の状態確認


zfs$ zfs list | grep rpool/ebs
rpool/ebs                 1.03G   206G    21K  /rpool/ebs
rpool/ebs/vol-001         1.03G   207G  78.8M  -

この時はvol-001のみ存在している

▼snapshotを作成


zfs$ pfexec zfs snapshot rpool/ebs/vol-001@`date +%Y-%m-%s-%H:%M:%S`

▼作成したsnapshotの状態を確認


zfs$ zfs list -t snapshot |grep rpool/ebs
rpool/ebs/vol-001@2010-04-1272361747-18:49:07      0      -  78.8M  -

「rpool/ebs/vol-001@2010-04-1272361747-18:49:07」が作成された


snapshotからvolume作成

▼snapshotからcloneによりvolumeを作成


zfs$ pfexec zfs clone rpool/ebs/vol-001@2010-04-1272361747-18:49:07 rpool/ebs/vol-001.clone

▼clone後のvolumeの状態を確認


zfs$ zfs list | grep rpool/ebs
rpool/ebs                 1.11G   206G    21K  /rpool/ebs
rpool/ebs/vol-001         1.11G   207G  78.8M  -
rpool/ebs/vol-001.clone       0   206G  78.8M  -

「rpool/ebs/vol-001.clone」が作成された


dom0にiSCSIデバイスを割り当て

▼cloneされたvolumeをiSCSIターゲットに追加


zfs$ pfexec zfs set shareiscsi=on rpool/ebs/vol-001.clone

▼iSCSIターゲットの状態を確認


zfs$ iscsitadm list target
Target: rpool/ebs/vol-001
    iSCSI Name: iqn.1986-03.com.sun:02:8353afa5-f355-61f2-84ee-fac93b2e3eb7
    Connections: 1
Target: rpool/ebs/vol-001.clone
    iSCSI Name: iqn.1986-03.com.sun:02:54f28b67-e6c0-ed9c-e40c-a45aa81c4efa
    Connections: 0

「rpool/ebs/vol-001.clone」がiSCSIターゲットにエントリされている
IQNは「iqn.1986-03.com.sun:02:54f28b67-e6c0-ed9c-e40c-a45aa81c4efa」

▼iSCSIイニシエータからiSCSIターゲットを確認


dom0# iscsiadm -m discovery -t sendtargets -p 192.168.1.21
192.168.1.21:3260,1 iqn.1986-03.com.sun:02:8353afa5-f355-61f2-84ee-fac93b2e3eb7
192.168.1.21:3260,1 iqn.1986-03.com.sun:02:54f28b67-e6c0-ed9c-e40c-a45aa81c4efa

▼iSCSIターゲットに接続


dom0# iscsiadm -m node -l
Logging in to [iface: default, target: iqn.1986-03.com.sun:02:8353afa5-f355-61f2-84ee-fac93b2e3eb7, portal: 192.168.1.21,3260]
Logging in to [iface: default, target: iqn.1986-03.com.sun:02:54f28b67-e6c0-ed9c-e40c-a45aa81c4efa, portal: 192.168.1.21,3260]
iscsiadm: Could not login to [iface: default, target: iqn.1986-03.com.sun:02:8353afa5-f355-61f2-84ee-fac93b2e3eb7, portal: 192.168.1.21,3260]:
iscsiadm: initiator reported error (15 - already exists)
Login to [iface: default, target: iqn.1986-03.com.sun:02:54f28b67-e6c0-ed9c-e40c-a45aa81c4efa, portal: 192.168.1.21,3260]: successful

ログインに成功

▼iSCSIデバイスを確認


dom0# ls -la /dev/disk/by-path/ | grep iqn.1986-03.com.sun:02:54f28b67-e6c0-ed9c-e40c-a45aa81c4efa
lrwxrwxrwx 1 root root   9 Apr 27 19:04 ip-192.168.1.21:3260-iscsi-iqn.1986-03.com.sun:02:54f28b67-e6c0-ed9c-e40c-a45aa81c4efa-lun-0 -> ../../sdd

「/dev/sdd」にマッピングされた


domUにvolumeを割り当て

▼domUに割り当てる


dom0# xm block-attach fc8-001 phy:/dev/sdd xvdd w

/dev/sddを/dev/xvdとして割り当てる

▼domUのデバイスを確認


domU# dmesg |grep xvdd
 xvdd: unknown partition table
domU# fdisk -l /dev/xvdd

Disk /dev/xvdd: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

Disk /dev/xvdd doesn't contain a valid partition table

domUにてブロックデバイスとして認識されている

▼マウント前の状況確認


domU# mount |grep /dev/xvd
/dev/xvda on / type ext3 (rw)
/dev/xvdc on /mnt type ext3 (rw)

/dev/xvddはマウントされてない

▼/dev/xvddをマウント


domU# mkdir /mnt2
domU# mount /dev/xvdd /mnt2/

/dev/xvddを/mnt2へマウント

▼マウント後の状態確認


domU# mount |grep /dev/xvd
/dev/xvda on / type ext3 (rw)
/dev/xvdc on /mnt type ext3 (rw)
/dev/xvdd on /mnt2 type ext3 (rw)

/dev/xvddが/mnt2へマウントされた

▼ファイルシステムの内容を確認


domU# ls -la /mnt2
total 30781
drwxr-xr-x  3 root root     4096 Apr 27 18:32 .
drwxr-xr-x 22 root root     1024 Apr 27 19:16 ..
-rw-r--r--  1 root root 10485760 Apr 27 18:32 10m.img
-rw-r--r--  1 root root 20971520 Apr 27 18:32 20m.img
drwx------  2 root root    16384 Apr 27 18:30 lost+found

domU# ls -la /mnt
total 30781
drwxr-xr-x  3 root root     4096 Apr 27 18:32 .
drwxr-xr-x 22 root root     1024 Apr 27 19:16 ..
-rw-r--r--  1 root root 10485760 Apr 27 18:32 10m.img
-rw-r--r--  1 root root 20971520 Apr 27 18:32 20m.img
drwx------  2 root root    16384 Apr 27 18:30 lost+found

domU# ls -la /mnt | md5sum
1722eb2df6ced256bc63506f8f9d195e  -
domU# ls -la /mnt2 | md5sum
1722eb2df6ced256bc63506f8f9d195e  -

/mntと/mnt2の内容が同じ事を確認

▼新volumeに対してファイル操作


domU# cd /mnt2/
domU# time dd if=/dev/zero of=30m.img bs=1M count=30
30+0 records in
30+0 records out
31457280 bytes (31 MB) copied, 0.17256 s, 182 MB/s

real    0m0.238s
user    0m0.000s
sys     0m0.136s

domU# ls -la
total 61537
drwxr-xr-x  3 root root     4096 Apr 27 19:20 .
drwxr-xr-x 22 root root     1024 Apr 27 19:16 ..
-rw-r--r--  1 root root 10485760 Apr 27 18:32 10m.img
-rw-r--r--  1 root root 20971520 Apr 27 18:32 20m.img
-rw-r--r--  1 root root 31457280 Apr 27 19:20 30m.img
drwx------  2 root root    16384 Apr 27 18:30 lost+found

30m.imgが新規生成された。

▼/mntと/mnt2の状態確認


domU# ls -la /mnt | md5sum
1722eb2df6ced256bc63506f8f9d195e  -
domU# ls -la /mnt2 | md5sum
567c65c8a4c6992be86491afadf58f63  -

domU# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/xvda               416484    382754     12226  97% /
tmpfs                   134484         0    134484   0% /dev/shm
/dev/xvdc              1032088     64852    914808   7% /mnt
/dev/xvdd              1032088     95608    884052  10% /mnt2

/mntと/mnt2が別物出ある事を確認出来る


これにより、Amazon EBSの基本操作まで確認出来た。
今後の作業後は、手順を簡略化して行く。

続きを読む


編集
@hansode at 19:30|PermalinkComments(0)TrackBack(0)

2010年04月26日

このエントリーをはてなブックマークに追加

Amazon EBSに対する基本操作をしてみる

そろそろ外堀から内堀へ攻め入る。

▼戦略

  1. dom0
    1. domUを起動
    2. domUに対し、iSCSIデバイスをattach
  2. domU
    1. デバイスを確認
    2. ファイルシステムを構築
    3. マウント
    4. ddでファイルを新規作成
  3. zfs
    1. dedupの変化を観察
  4. domU
    1. デバイスをアンマウント
  5. dom0
    1. iSCSIデバイスをdetach

※attachとdetachの検証だけなら、iSCSIは不用であるが、そこは議論の対象外。



暫定的に最小構成domUを用意

▼サンプルdomU用意ディレクトリ準備


dom0# mkdir -p /home/xen/domu
dom0# cd /home/xen/domu/
dom0# mkdir fc8-001
dom0# cd fc8-001/

▼Fedra Core 8のイメージを用意


dom0# cp /path/to/mntpool/sdc2/fc8_i386_420mb.img ./.

※イメージ構築方法は本題から逸れるので、今回は省略する

▼cfg生成


name        = 'fc8-001'
memory      = '256'
vcpus       = 1
bootroader  = '/usr/bin/pygrub'
root        = '/dev/xvda ro'
vfb         = [ ]
disk        = [ 'tap:aio:/home/xen/domu/fc8-001/fc8_i386_420mb.img,xvda,w' ]
vif         = [ '' ]
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'

「/」パーティションのみの最小構成domU

▼domU起動


dom0# xm create ./fc8_i386_420mb.cfg
dom0# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  3773     4     r-----     40.0
fc8-001                                      1   256     1     -b----     17.7

▼domUへログイン


domU# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/xvda               416484    382680     12300  97% /
tmpfs                   134484         0    134484   0% /dev/shm

サンプルdomUが起動した



インスタンスに対してEBS Volumeのような操作を行う

▼dom0のiSCSIデバイスをdomUへattach


dom0# xm block-attach fc8-001 phy:/dev/sde xvde w

▼domUでデバイス確認


domU# dmesg | grep xvde
 xvde: unknown partition table

domU# fdisk -l /dev/xvde

Disk /dev/xvde: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

Disk /dev/xvde doesn't contain a valid partition table

fdiskの出力結果から、/dev/xvdeとして認識され、1Gである事が分かる。

▼attachしたデバイスにファイルシステム構築


domU# mkfs.ext3 /dev/xvde
mke2fs 1.40.2 (12-Jul-2007)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
131072 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 33 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

▼/dev/xvdeを/mntへマウント


domU# mount /dev/xvde /mnt
domU# mount
/dev/xvda on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/xvde on /mnt type ext3 (rw)

iSCSIデバイス/dev/sdeは、domUにて、/dev/xvdeが/mntへマウントする所まで成功



domUから操作し、dedupの変化を観測してみる

▼作業前のpool状態


zfs$ zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
rpool   230G  17.9G   212G     7%  1.00x  ONLINE  -

DEDUPは 1.00x

▼/dev/zeroから10Mイメージを生成


domU# cd /mnt/
domU# time dd if=/dev/zero of=10m.img bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.017983 s, 583 MB/s

real    0m0.021s
user    0m0.000s
sys     0m0.016s

▼iSCSIターゲットにてpoolの状態確認


zfs$ zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
rpool   230G  17.9G   212G     7%  1.69x  ONLINE  -

DEDUPは1.69x

▼/dev/zeroから20Mイメージを生成


domU# time dd if=/dev/zero of=20m.img bs=1M count=20
20+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 0.093933 s, 223 MB/s

real    0m0.114s
user    0m0.000s
sys     0m0.096s

zfs$ zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
rpool   230G  18.0G   212G     7%  2.08x  ONLINE  -

dedupの数値に変化がある事を観測

▼DEDUPの変化履歴

  1. 1.00x
  2. 1.69x
  3. 2.08x

▼detachするため、umount


domU# cd /
domU# umount /mnt

▼domUからVolumeをdetach


dom0# xm block-detach fc8-001 xvde

▼domUからデバイスが取り外された事を確認


domU# ls -la /dev/xvd*
brw-r----- 1 root disk 202, 0 Apr 26 20:50 /dev/xvda

/dev/xvdeが無い事を確認。つまり、detachされた。


次回はSnapshot

続きを読む


編集
@hansode at 21:30|PermalinkComments(0)TrackBack(0)
このエントリーをはてなブックマークに追加

Amazon EBSもどきの基礎固め

ZFSのボリュームをデバイスファイル扱いする為、iSCSIを利用する。

▼論理構成

  • iSCSIターゲット: OpenSolaris
  • iSCSIイニシエータ: Linux(CentOS)
    • iSCSIイニシエータはXen dom0を兼ねる

▼戦略

  1. iSCSIターゲット構築
    1. ZFS Volume作成
    2. iSCSIターゲット化
  2. iSCSIイニシエータ構築
    1. iSCSIターゲットにログイン
    2. IQNとデバイスファイルとの対応状況確認

Xen dom0からiSCSIデバイスを利用する所まで作業を勧める。


iSCSIターゲット:OpenSolaris(snv_134)

▼サービス確認


$ svcs -a |grep iscsi
$ pfexec svcadm enable iscsitgt
svcadm: Pattern 'iscsitgt' doesn't match any instances

iSCSIパッケージが不足している

▼iSCSIパッケージインストール


$ pfexec pkg install SUNWiscsi SUNWiscsitgt
DOWNLOAD                                  PKGS       FILES    XFER (MB)
Completed                              655/655       29/29      1.5/1.5

PHASE                                        ACTIONS
Removal Phase                              5872/5872
Install Phase                                124/124

▼iSCSIサービス有効化と確認


$ pfexec svcadm enable iscsitgt
$ svcs -a |grep iscsi
online         16:29:17 svc:/network/iscsi/initiator:default
online         16:30:20 svc:/system/iscsitgt:default

iSCSIサービスが起動した


$ pfexec svcadm disable initiator
$ svcs -a |grep iscsi
disabled       17:36:16 svc:/network/iscsi/initiator:default
online         17:36:29 svc:/system/iscsitgt:default

initiatorは不用なので無効化

▼検証用ZFS Volumeを生成


$ pfexec zfs create -V 1g rpool/ebs/vol-001
$ pfexec zfs create -V 1g rpool/ebs/vol-002
$ pfexec zfs create -V 1g rpool/ebs/vol-003

ここでは1Gで生成

▼ZFS VolumeをiSCSIターゲットとして公開


$ pfexec zfs set shareiscsi=on rpool/ebs/vol-001
$ pfexec zfs set shareiscsi=on rpool/ebs/vol-002
$ pfexec zfs set shareiscsi=on rpool/ebs/vol-003

▼iSCSIターゲットの公開用ベースディレクトリを設定


$ pfexec iscsitadm modify admin -d /rpool/ebs
$ pfexec iscsitadm show admin
iscsitadm:
    Base Directory: /rpool/ebs
    CHAP Name: Not set
    RADIUS Access: Not set
    RADIUS Server: Not set
    iSNS Access: Not set
    iSNS Server: Not set
    iSNS Server Status: Not applicable
    Fast Write ACK: Not set

▼iSCSIターゲットを確認


$ pfexec iscsitadm list target
Target: rpool/ebs/vol-001
    iSCSI Name: iqn.1986-03.com.sun:02:bebaaaa0-6bb8-67c0-bfd8-8605542386f6
    Connections: 0
Target: rpool/ebs/vol-002
    iSCSI Name: iqn.1986-03.com.sun:02:adb08b5a-6e10-c3d6-f484-997f3edcda00
    Connections: 0
Target: rpool/ebs/vol-003
    iSCSI Name: iqn.1986-03.com.sun:02:7d558ccf-b1c6-c21f-c1a9-9859728b3dd8
    Connections: 0
iSCSIイニシエータ:Linux(CentOS-5.4)

▼iscsi-initiator-utilsをインストール


# yum install iscsi-initiator-utils
# chkconfig --list iscsi
iscsi           0:off   1:off   2:off   3:on    4:on    5:on    6:off
# /etc/init.d/iscsi start

▼iSCSIターゲットを検索


# iscsiadm -m discovery -t sendtargets -p 192.168.1.21
192.168.1.21:3260,1 iqn.1986-03.com.sun:02:adb08b5a-6e10-c3d6-f484-997f3edcda00
192.168.1.21:3260,1 iqn.1986-03.com.sun:02:bebaaaa0-6bb8-67c0-bfd8-8605542386f6
192.168.1.21:3260,1 iqn.1986-03.com.sun:02:7d558ccf-b1c6-c21f-c1a9-9859728b3dd8

iSCSIターゲットを発見

▼iSCSIターゲットにログイン


# iscsiadm -m node -T iqn.1986-03.com.sun:02:adb08b5a-6e10-c3d6-f484-997f3edcda00 -l
Logging in to [iface: default, target: iqn.1986-03.com.sun:02:adb08b5a-6e10-c3d6-f484-997f3edcda00, portal: 192.168.1.21,3260]
Login to [iface: default, target: iqn.1986-03.com.sun:02:adb08b5a-6e10-c3d6-f484-997f3edcda00, portal: 192.168.1.21,3260]: successful

# iscsiadm -m node -T iqn.1986-03.com.sun:02:bebaaaa0-6bb8-67c0-bfd8-8605542386f6 -l
Logging in to [iface: default, target: iqn.1986-03.com.sun:02:bebaaaa0-6bb8-67c0-bfd8-8605542386f6, portal: 192.168.1.21,3260]
Login to [iface: default, target: iqn.1986-03.com.sun:02:bebaaaa0-6bb8-67c0-bfd8-8605542386f6, portal: 192.168.1.21,3260]: successful

# iscsiadm -m node -T iqn.1986-03.com.sun:02:7d558ccf-b1c6-c21f-c1a9-9859728b3dd8 -l
Logging in to [iface: default, target: iqn.1986-03.com.sun:02:7d558ccf-b1c6-c21f-c1a9-9859728b3dd8, portal: 192.168.1.21,3260]
Login to [iface: default, target: iqn.1986-03.com.sun:02:7d558ccf-b1c6-c21f-c1a9-9859728b3dd8, portal: 192.168.1.21,3260]: successful

3ターゲットにログイン成功

▼iSCSIターゲットとデバイスファイルのマッピングを確認


# ls -la /dev/disk/by-path/ | grep iqn.
lrwxrwxrwx 1 root root   9 Apr 26 19:51 ip-192.168.1.21:3260-iscsi-iqn.1986-03.com.sun:02:7d558ccf-b1c6-c21f-c1a9-9859728b3dd8-lun-0 -> ../../sdf
lrwxrwxrwx 1 root root   9 Apr 26 19:50 ip-192.168.1.21:3260-iscsi-iqn.1986-03.com.sun:02:adb08b5a-6e10-c3d6-f484-997f3edcda00-lun-0 -> ../../sdd
lrwxrwxrwx 1 root root   9 Apr 26 19:51 ip-192.168.1.21:3260-iscsi-iqn.1986-03.com.sun:02:bebaaaa0-6bb8-67c0-bfd8-8605542386f6-lun-0 -> ../../sde

▼マッピング情報

IQNデバイスファイル
iqn.1986-03.com.sun:02:adb08b5a-6e10-c3d6-f484-997f3edcda00/dev/sdd
iqn.1986-03.com.sun:02:bebaaaa0-6bb8-67c0-bfd8-8605542386f6/dev/sde
iqn.1986-03.com.sun:02:7d558ccf-b1c6-c21f-c1a9-9859728b3dd8/dev/sdf

これ以降、SCSIデバイスとして扱える。
fdiskコマンド、mkfsコマンド、そしてmountコマンドにより利用可能状態へ持って行ける。

続きを読む


編集
@hansode at 20:10|PermalinkComments(0)TrackBack(0)
このエントリーをはてなブックマークに追加

重複排除を体験した

ZFSの目玉機能の1つ「deduplicate」。

検証用ファイルシステム作成

▼検証用にファイルシステムを作成


$ pfexec zfs create rpool/ebs

▼作成したファイルシステムの容量確認


$ df -h /rpool/ebs/
Filesystem            Size  Used Avail Use% Mounted on
rpool/ebs             207G   21K  207G   1% /rpool/ebs

できたてホヤホヤ

▼poolの状態を確認


$ zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
rpool   230G  17.9G   212G     7%  1.00x  ONLINE  -

DEDUPに着目。1.00xとなっている事を覚えておく。

内容が重複するように/dev/zeroからファイルを生成

▼5Gのイメージファイルを生成


$ cd /rpool/ebs/
$ time pfexec dd if=/dev/zero of=5gb.img bs=1M count=5000
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB) copied, 29.9339 s, 175 MB/s

real    0m29.942s
user    0m0.006s
sys     0m2.002s

▼ファイル生成後の状態確認


$ df -h /rpool/ebs/
Filesystem            Size  Used Avail Use% Mounted on
rpool/ebs             212G  4.8G  207G   3% /rpool/ebs
$ zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
rpool   230G  17.9G   212G     7%  1.00x  ONLINE  -

確認項目

  • ディスク使用済サイズ: 4.8G
  • FREE: 212G
  • DEDUP: 1.00x
dedupの機能検証

▼いよいよ、ファイルをコピーしてdedup具合を確認してみる


$ time pfexec cp 5gb.img 5gb.img-dup

real    0m22.665s
user    0m0.034s
sys     0m6.124s

▼コピー後の状態を確認


$ df -h /rpool/ebs/
Filesystem            Size  Used Avail Use% Mounted on
rpool/ebs             216G  9.4G  207G   5% /rpool/ebs
$ zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
rpool   230G  17.9G   212G     7%  55494.25x  ONLINE  -

確認項目

  • ディスク使用済サイズ: 9.4G
  • FREE: 212G
  • DEDUP: 55494.25x

DEDUPの数値が増加した。

  • dfコマンドによるディスク使用量は増加
  • zpool listコマンドによる使用量は微増程度

…と言う所で、dedup検証は一旦終了。
「あってよかった」と思うのは、しばらくしてからなのだろう。

続きを読む


編集
@hansode at 16:10|PermalinkComments(0)TrackBack(0)
このエントリーをはてなブックマークに追加

失敗を乗り越えろ

▼いざ、dedupをonへ!


$ pfexec zfs set dedup=on rpool
cannot set property for 'rpool': pool and or dataset must be upgraded to set this property or value

おや…?

▼versionを確認


$ zpool get version rpool
NAME   PROPERTY  VALUE    SOURCE
rpool  version   14       local

うわぉ…。ZFS pool versionが14と言う事か。
dedupをonにするには、ZFS pool version 21以降が必要。


poolをアップグレード

ZFS 環境をアップグレードする方法を参考に、アップグレード作業。

▼作業前のpoolバージョン情報


$ pfexec zpool upgrade
This system is currently running ZFS pool version 22.

The following pools are out of date, and can be upgraded.  After being
upgraded, these pools will no longer be accessible by older software versions.

VER  POOL
---  ------------
14   rpool

Use 'zpool upgrade -v' for a list of available versions and their associated
features.

▼アップグレード


$ pfexec zpool upgrade -a
This system is currently running ZFS pool version 22.

Successfully upgraded 'rpool'

▼作業後のpoolバージョン情報


$ pfexec zpool upgrade
This system is currently running ZFS pool version 22.

All pools are formatted using this version.

ZFS pool version 22来た!

改めてdedupを有効化

▼改めてdedupを有効化…


$ pfexec zfs set dedup=on rpool

おー。警告なく、完了したぞ。

▼dedupの状態を表示


$ zfs get dedup rpool
NAME   PROPERTY  VALUE          SOURCE
rpool  dedup     on             local

「on」となった。成功だ。

続きを読む


編集
@hansode at 14:40|PermalinkComments(0)TrackBack(0)