hacks/IaaS/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
時刻を同期させあとは、スクリプトが期待する動きになった。
あと書き
単なる凡ミス。手元の開発環境だからと言う理由で時刻同期設定をサボっていた自分が悪い。
インプレスジャパン
売り上げランキング: 13026
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へリネームする必要が出ると、ファイル名から推測出来なくなる。
悪意を持ってペアではないファイル名を、見た目上のペアにする事は可能。
インスタンスを起動出来ない原因追求に役に立てたら嬉しい限り。
技術評論社
売り上げランキング: 149113
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」と言う訳だ
これは別エントリで改めてまとめる予定。
自分でシンプル環境を構築しよう
前回は、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系のイメージに着手予定。
2010年05月06日
EBS Backed domUを構築しよう
iSCSIのおかげで手軽にデバイスをattach/detach可能になった。
環境を構築する場合、S3 BackedよりはEBS Backedが便利だ。
そこで、EBS BackedのdomUを構築し、複製から復元を行う。
▼戦略
- dom0
- iSCSIデバイスに対し、ファイルシステム構築
- iSCSIデバイス内に最小構成環境を構築
- domUの仮想デバイスとしてiSCSIデバイスを指定し、起動
- domU-1
- ログイン
- ホスト名を記録したファイルを生成
- zfs
- 起動中domUのVolumeからsnapshotを作成
- 作成したsnapshotから、cloneして新規Volume作成
- cloneしたVolumeを、iSCSIターゲットとして公開
- dom0
- cloneして生成したiSCSIターゲットに接続
- 新iSCSIデバイスを仮想デバイスとして指定し、新たにdomUを起動
- domU-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
▼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
| 項目 | 内容 |
|---|---|
| IQN | iqn.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を手軽に量産可能だ。
まだまだ手作業が多い。
今後は手順を単純化して行く。
アスキー・メディアワークス
売り上げランキング: 115975
2010年04月27日
続・Amazon EBSに対する基本操作をしてみる
▼戦略
- zfs
- domUにattach済volumeからsnapshot作成
- 作成したsnapshotからcloneを作成
- 作成したcloneからvolumeを作成
- volumeをiSCSIターゲット化
- dom0
- iSCSIイニシエータからiSCSIターゲットにログイン
- iSCSIデバイスをdomUにattach
- domU
- domUからattach済volumeをマウント
- ファイルシステムの内容確認
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の基本操作まで確認出来た。
今後の作業後は、手順を簡略化して行く。
アスキー・メディアワークス
売り上げランキング: 161678
2010年04月26日
Amazon EBSに対する基本操作をしてみる
そろそろ外堀から内堀へ攻め入る。
▼戦略
- dom0
- domUを起動
- domUに対し、iSCSIデバイスをattach
- domU
- デバイスを確認
- ファイルシステムを構築
- マウント
- ddでファイルを新規作成
- zfs
- dedupの変化を観察
- domU
- デバイスをアンマウント
- dom0
- 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.00x
- 1.69x
- 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
アスキー・メディアワークス
売り上げランキング: 142846
Amazon EBSもどきの基礎固め
ZFSのボリュームをデバイスファイル扱いする為、iSCSIを利用する。
▼論理構成
- iSCSIターゲット: OpenSolaris
- iSCSIイニシエータ: Linux(CentOS)
- iSCSIイニシエータはXen dom0を兼ねる
▼戦略
- iSCSIターゲット構築
- ZFS Volume作成
- iSCSIターゲット化
- iSCSIイニシエータ構築
- iSCSIターゲットにログイン
- 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コマンドにより利用可能状態へ持って行ける。
アスキー・メディアワークス
売り上げランキング: 139419
重複排除を体験した
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検証は一旦終了。
「あってよかった」と思うのは、しばらくしてからなのだろう。
アスキー・メディアワークス
売り上げランキング: 132926
失敗を乗り越えろ
▼いざ、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」となった。成功だ。
アスキー・メディアワークス
売り上げランキング: 131355


