telnetの自動化

KVM(というかqemu)で-monitor telnet::4444,server,nowaitみたいなオプションを指定すると、モニタにtelnet接続できる。
telnetなので基本は対話的にコマンドを実行するしかないが、expectを使えばスクリプトに組み込むことができる。sleepとechoとパイプで頑張ってもいいけど。。virshとか使えばいいのにね!
4444はポート番号の例なので適宜読み替え。

# cat -v tlnt.sh                                                     
#!/bin/sh

HOST=$1
PORT=$2
shift;shift
CMD=$*

expect -c "
set timeout 10
spawn telnet $HOST $PORT
expect (qemu)\ ; send \"${CMD}\r\"
expect (qemu)\ ; send \"^]\"
expect telnet>\ ; send \"close\r\"
" | tail -n +7 | head -n -2

下から3行目は「^]」ではなく「Ctrl+]」なので注意。

tailとかheadは決め打ち。引数は「ホスト」「ポート」「コマンド」の順。
たとえば

# tlnt.sh localhost 4444 info status
VM status: running
# 

みたいな感じで使える。
使えるコマンドは

# tlnt.sh localhost 4444 help

で。

たとえば

# tlnt.sh localhost 4444 quit

VMごと強制シャットダウンができたり、(途中で切れちゃうので注意)

# tlnt.sh localhost 4444 screendump screenshot.ppm

スクリーンショットが取れる。

# for i in `tlnt.sh localhost 4444 info | awk '{ print $2 }'`
do
echo "### $i ###"
tlnt.sh localhost 4444 info $i
echo
done

とすればinfo 〜で見れる全パラメータが吐き出せる。
別にtelnet先はlocalhostじゃなくてもいいので、-incomingオプション付きでプロセスを立ち上げてから自動でライブマイグレーションするようなスクリプトも作りこめると思う。

さくらのVPSでSFTPサーバ

利用開始直後から鬼のように海外からアクセスが来るので、自衛が必要になる。
いろいろやってみたが、fail2banとChrootDirectoryを組み合わせるのがメンテも楽で良いのでfail2banと、internal-sftp(v4.9以降のOpen-SSH)が簡単に使えるFedora13を入れなおした。
あとはシェル使えないSFTP用ユーザを用意して、jail.confとsshd_configをいい感じにいじればすぐに利用開始できる。
いじるといってもbantimeを長くするのと、PermitRootLoginをnoかwithout-passwordにするくらい。

ちゃんと利用開始したのでもう一度Radishで計測してみた。
Radish Network Speed Testing - Test Report

=== Radish Network Speed Testing Ver.3.2.2 - Test Report ===
測定条件
 精度:高 データタイプ:標準
下り回線
 速度:235.5Mbps (29.43MByte/sec) 測定品質:88.6
上り回線
 速度:95.65Mbps (11.96MByte/sec) 測定品質:99.9
測定者ホスト:*********.sakura.ne.jp
測定サーバー:東京-WebARENA
測定時刻:2011/7/12(Tue) 0:42

                                                                                                                      • -

測定サイト http://netspeed.studio-radish.com/
============================================================

上りもほとんど理論値に近い値が出ている。

さくらのVPSにWindowsをインストール

簡単に手順だけでも。OSはWindows Server 2008 R2にした。TechNet Subscription入ってたので。

使うもの:
KVMホスト(インターネットからsshで入れるようにしておく)

  • 20GBの仮想ディスクを用意して使いたいOSをインストール
# qemu-img create -f raw sakura.raw 20G

# qemu-kvm -name sakura -smp 2 -m 4096 -k ja -boot order=dcn -drive file=/foo/bar/sakura.raw,if=ide,index=0,media=disk,cache=none -usb -usbdevice tablet -cdrom /baz/ja_windows_server_2008_r2.iso ・・・
  • KVMホストで仮想ディスクをマウント

OSはインストールが完了したらシャットダウンしておく。
仮想ディスクのイメージをkpartxでマウント。
たぶん/dev/loop0にいるのでfdiskで確認する。

# kpartx -v -a /foo/bar/sakura.raw 
add map loop0p1 (253:6): 0 204800 linear /dev/loop0 2048
add map loop0p2 (253:7): 0 41734144 linear /dev/loop0 206848

# fdisk -l /dev/loop0

ディスク /dev/loop0: 21.5 GB, 21474836480 バイト
ヘッド 255, セクタ 63, シリンダ 2610
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x5cd152c1

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/loop0p1   *           1          13      102400    7  HPFS/NTFS
パーティション 1 は、シリンダ境界で終わっていません。
/dev/loop0p2              13        2611    20867072    7  HPFS/NTFS
#

CentOSを選ぶ。32bitか64bitかは使いたいOSに合わせる。
VNCコンソールが上がったらすぐにF5を押して

boot: linux rescue

と入力

  • ネットワーク情報を入力する

コントロールパネルに書いてある通りに入力する。
あとでWindows側の設定でも必要になるので、値はそれぞれメモっておくこと。
DNSサーバは予想ができないので、仕方なく「8.8.8.8」と入れるハメになった。。

  • ディスクイメージの流し込み

プロンプトが出たらKVMホストにsshで接続し、遠隔dd。
KVMホスト側でPermitRootLogin=noにしている人は一時的にyesにしてsshdを再起動する。認証はパスワード。心配ならポートくらい変えておく。

sh-3.2# ssh -p <ポート番号> root@<KVMホストのIP> 'dd if=/dev/loop0 | gzip -c' | gzip -dc | dd of=/dev/hda

パスワードを聞かれるので入力。
コピーが終わるまで待つ。

gzipを間に挟むと自分の環境では10MB/sくらい出てた。

とりあえずVNCコンソールから起動確認。


ネットワーク設定やアップデートが済んでからはリモートデスクトップにした。

  • 忘れず仮想ディスクをアンマウント
# kpartx -d /foo/bar/sakura.raw 
  • Radishで計測してみた

=== Radish Network Speed Testing Ver.3.2.2 - Test Report ===
測定条件
 精度:高 データタイプ:標準
下り回線
 速度:181.5Mbps (22.68MByte/sec) 測定品質:64.3
上り回線
 速度:1.539Mbps (192.4kByte/sec) 測定品質:81.1
測定者ホスト:*********.sakura.ne.jp
測定サーバー:東京-WebARENA
測定時刻:2011/6/28(Tue) 7:01

                                                                                                                      • -

測定サイト http://netspeed.studio-radish.com/
============================================================

=== Radish Network Speed Testing Ver.3.2.2 - Test Report ===
測定条件
 精度:高 データタイプ:標準
下り回線
 速度:277.5Mbps (34.68MByte/sec) 測定品質:80.6
上り回線
 速度:1.890Mbps (236.3kByte/sec) 測定品質:99.8
測定者ホスト:*********.sakura.ne.jp
測定サーバー:東京-WebARENA
測定時刻:2011/6/29(Wed) 2:55

                                                                                                                      • -

測定サイト http://netspeed.studio-radish.com/
============================================================

試用中なので上りは帯域制限されてるけど、下り爆速。
というか余裕で100Mbps超えてた。

KVMとiSCSIによるSANブート環境の構築[ゲスト:WindowsXP]

インストーラiscsiに対応していないので、
1.ローカルディスクにインストール
2.iscsiブート可能なInitiatorを導入する
3.iscsiのLUNにローカルディスクのデータをコピー
の順に作業を行う。

必要なもの
XPインストールメディア

あると便利なもの
LinuxKVMゲスト(ddとgPartedを使いたい。LiveCDでもいいかと)

インストール
nicはe1000を指定。virtioは残念ながら自分のiSCSIブート環境では使えなかった。
ディスクイメージはなるべく小さくする。
4GB程度で十分と思うが、SP3などの場合は6〜8GBくらいあると安心。
サイズが大きくても時間がかかるだけで特に問題はない。
インストール後、IntelのサイトからXP用e1000ドライバを導入する。
なお、XPの標準ドライバでは認識されないので、e1000のみで起動した場合、ファイルの受け渡しに困る。
事前にドライバ配置済みのディスクを一時的に追加するなり、model=virtio&virtio-win.isoマウントでe1000ドライバDL後にnic差し替えて起動しなおすなり、
なんとか導入する。

次にInitiator-2.08-boot-build3825-x86fre.exeを導入。
途中出てくる“Microsoft MPIO Multipathing Support for iSCSI”はチェックが外れていることを確認する。
マルチパス構成ではiscsiブートできない。
http://www.microsoft.com/downloads/en/details.aspx?familyid=12cb3c1a-15d6-4585-b385-befd1319f825&displaylang=en
で入手できる。Iscsi Boot Initiator 2.08 X86Freをクリック。
gPXEのWikiにはchk推奨と書いてあるが、相当やる気のある人以外Checked Buildである必要はない。と思う。

ここまでやったら仮想マシンを落としてとりあえずイメージをバックアップする。
スナップショットとか逆に面倒なので普通にtar.gzで固めた。

バックアップをとったら、用意していたLinuxKVMゲストにXPをインストールしたディスクをくっつけて起動。
もしくはホストのマシンがxとか入ってゴテゴテしているならkpartx使ってそのままマウントしても良い。
とにかくどこかのLinuxマシンにくっつけたら、そこでさらに転送先のiSCSIターゲットデバイスもマウントする。

# iscsiadm --mode=discovery --type=sendtargets --portal=xxx.xxx.xxx.xxx
# iscsiadm -m node --targetname iqn.yyyy-mm.:aaa.bbb.ccc.ddd --portal xxx.xxx.xxx.xxx:xxxx --login

ディスクを複製する。
基本的にhttp://etherboot.org/wiki/sanboot/transferにある通りにやればよい。

# fdisk -l /dev/sdX
  Disk /dev/sdX: 80.0 GB, 80026361856 bytes
  255 heads, 63 sectors/track, 9729 cylinders
  Units = cylinders of 16065 * 512 = 8225280 bytes
  
     Device Boot      Start         End      Blocks   Id  System
  /dev/sdX1   *           1        1825    14659281    7  HPFS/NTFS

で、シリンダ当たりのバイト数(8,225,280)とパーティションの最後のシリンダ番号(1,825)を調べて

dd if=/dev/sdX of=/dev/sdY bs=8225280 count=1825

とすればよい。
sdXはXPをインストールしたディスク(NTFSになっているはず)、sdYは複製先のiSCSIターゲット(空のはず)を指定する。
転送が終わったらgPartedでNTFSを拡張する。
パフォーマンスの問題もあるしとりあえずLUNいっぱいに広げればいいと思うが、何個かのパーティションに切ってもそれぞれ認識する。
あとはFedoraの時と同様にDHCPサーバにrootへのパスを仕込む。<書きかけ>

PowerShell over Cygwin SSH

SSH越しにCygwinからPowerShellを起動しようとするとプロンプトが戻らない。
が、-Commandで呼んだ後に「Enter」を押せばCygwinのプロンプトには戻れるので一計。

<Cygwin>$ echo "" | powershell -Command "Get-Process"

予め鍵を仕込んでおいてリモートから

<Remote>$ ssh User@CygwinHost 'echo "" | powershell -Command "Get-Process | Sort-Object Id" | grep -Ev "^$"'
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName          
-------  ------    -----      ----- -----   ------     -- -----------          
      0       0        0         28     0               0 Idle                 
    968       0        0        260     2    92.23      4 System               
     76       4      948       3392    58     0.14    320 csrss                
    162       4     4216       6316   416     0.22    388 sshd      
              ・ ・ ・
    112       2     5348       4464   405     0.05   3828 bash   
<Remote>$

みたいに使えば簡易性能監視とかにも使える。
sedとか使っちゃうとPowerShellの思想には反する気がするけど。
日本語はShift_JISで返ってくるので注意。

Intel DH67BLでLinuxを動かす場合のNIC認識方法

KVM検証用にCore i7-2600(8CPU認識+Intel VT-dだとi7-2600一択)とDH67BLを買ったが、Fedora14をインストールしたらオンボードNICの82579Vが新しすぎて認識されない。
AsusのP8P67 PROあたりでも採用されているようだ。

とりあえず検索してみたら、Forumに対処法が記載されていた。
簡単にまとめると、

  1. ドライバをmakeできるパッケージを追加
  2. e1000e用ドライバをSourceForgeからダウンロード
  3. USBメモリやフロッピー等でe1000e-1.2.20.tar.gzを転送
  4. 書庫を展開してmake install
  5. modprobeでモジュールをロード

で82579Vが認識されるようになる。

1.
Fedora14の場合、makeするには以下のパッケージが必要。
最初からわかっている場合はインストール時に指定するのが一番楽。
インストール後の場合は「rpm -qa」で不足分を調べ、インストールメディアから探してくるか、適当なリポジトリから入手し、「rpm -Uvh *.rpm」で入れればよい。

binutils-2.20.51.0.7-5.fc14.x86_64.rpm
cloog-ppl-0.15.7-2.fc14.x86_64.rpm
cpp-4.5.1-4.fc14.x86_64.rpm
gcc-4.5.1-4.fc14.x86_64.rpm
glibc-2.12.90-17.x86_64.rpm
glibc-common-2.12.90-17.x86_64.rpm
glibc-devel-2.12.90-17.x86_64.rpm
glibc-headers-2.12.90-17.x86_64.rpm
kernel-devel-2.6.35.6-45.fc14.x86_64.rpm
kernel-headers-2.6.35.6-45.fc14.x86_64.rpm
libgomp-4.5.1-4.fc14.x86_64.rpm
libmpc-0.8.1-1.fc13.x86_64.rpm
perl-5.12.2-136.fc14.x86_64.rpm
perl-libs-5.12.2-136.fc14.x86_64.rpm
perl-Module-Pluggable-3.90-136.fc14.noarch.rpm
perl-Pod-Escapes-1.04-136.fc14.noarch.rpm
perl-Pod-Simple-3.13-136.fc14.noarch.rpm
perl-threads-1.81-1.fc14.x86_64.rpm
ppl-0.10.2-10.fc12.x86_64.rpm

2-3.
e1000e-1.2.20.tar.gzをDLしてLinux側になんとかして転送する。USBメモリが見当たらなかったので、USB接続のFDで配置した。
普通に/dev/sd?として認識されるので「mount -t vfat /dev/sd? /mnt」でマウントできる。

4-5.
e1000e-1.2.20.tar.gzを適当な場所に配置し、

tar zxvf e1000e-1.2.20.tar.gz
cd e1000e-1.2.20/src
make install

modprobe e1000e

リブートしても問題ないが、driver fixが組み込まれるまではカーネルをアップデートする度に

cd e1000e-1.2.20/src
make install
modprobe e1000e

を実施する必要がある。
なので、リモートから操作する場合は不用意に「yum update」すべきではない。


ちなみに仮想マシンは定格でも鬼のように速かった。

KVMとiSCSIによるSANブート環境の構築[ゲスト:Fedora14]

方針

仮想化は手軽に検証や試用ができて非常に便利だが、仮想マシンを数多く作ろうとするとディスクI/Oがボトルネックになりがちである。
そこでスケーラビリティを向上させるため、ストレージをKVMホスト管理下から完全に外す方法を検討する。二次的効果としてLive Migrationもできるようになるが、KVMホストをもう1台用意するまで検証はしない予定。
冗長性にはそれほどこだわらないが、容易に対応できる構成にしておく。

概要

iSCSIで家庭内SANを構築(これがやりたかった)。
ゲストはqemu-kvm組み込みのgPXE経由でSANブートすることとし、KVMホストにはイメージファイルを一切置かない運用とする。
要するに-hda=xxxや-drive file=xxxのような引数を与えずに、-boot nでそのままiSCSIを読みに行く。
root-pathはDHCP経由でgPXEに渡す。
これによりgPXE側でビルド等の作業を特にする必要はなくなる。qemu-kvmの初期インストール状態で問題ない。

環境

KVMホスト:
OS:Fedora 13
CPU: Core i7 920
Mem: 12GB
NIC:eth0 ブリッジ専用 / eth1 ホスト専用

iSCSIターゲット:
Thecus N7700PRO
円高のため、日本のどこで買うよりも米Amazonから買うほうが送料込みでも安かった。
メンテナンスフリーにしたかったのでそこそこ高めな既製品にしたが、自分でiSCSIターゲットを用意してもいいし、動けば何でもよい。

KVMゲスト:
Fedora 14

DHCPサーバ:
ブート・リブート時に確実にあがっている必要があるため、iSCSIターゲットが兼ねるかKVMホストが兼ねることが望ましいかもしれない。
今回はKVMホスト上でdhcpdを起動させている。

構築手順

DHCPサーバを立てる。
yum install dhcp
でインストール。
/etc/dhcp/dhcpd.confには以下のように追記しておく。
あくまで例なので、環境に合わせて適宜修正する。
ネットワークブート時に、IPを貰うと同時にroot-pathの情報も貰っていくようになる。

option space gpxe;
option gpxe-encap-opts code 175 = encapsulate gpxe;
option gpxe.keep-san code 8 = unsigned integer 8;

subnet 192.168.xxx.0 netmask 255.255.255.0 {
  option routers 192.168.xxx.ppp;
  option domain-name-servers 192.168.xxx.ppp;
}

host xxxxx {
   hardware ethernet XX:XX:XX:XX:XX:XX;
   fixed-address 192.168.xxx.qqq;
   option root-path "iscsi:192.168.xxx.rrr:::1:iqn.YYYY-MM.:aaa.bbb.ccc.ddd";
   option gpxe.keep-san 1;
}

/etc/rc.d/init.d/dhcpd start
で起動。
chkconfig dhcpd on
もしておく。

注意しなければならないのが、ブリッジ接続用の起動・停止スクリプト(デフォルトは/etc/qemu-ifup)。
仮想マシン起動直後にtapを使用する必要があるため、sleepを入れておかないと数秒間のフリーズとバッティングして上手くブートしてくれない。
私の環境では以下の記述で正常に動作している。環境によってはsleepの秒数を大きくする必要があるかもしれない。

#!/bin/sh

BRIDGE=br0
/sbin/ifconfig $1 0.0.0.0 up
/usr/sbin/brctl addif $BRIDGE $1
sleep 3

ここまで準備が整ったら、ゲストのインストールを始める。
Fedora14は最初からSANブートのインストールに対応しているので、引数"-cdrom /install_media.iso -boot d"をつけて仮想マシンを起動するだけでよい。
コマンド例はこんなかんじ。

qemu-kvm -smp 1 -m 2048 -vnc :1 -monitor telnet::XXXX,server,nowait -daemonize -localtime \
-net nic,model=e1000,macaddr=XX:XX:XX:XX:XX:XX -net tap,ifname=tap1 -k ja -boot d -cdrom /install_media.iso

VNCで入ってインストールを開始し、ストレージタイプの選択で「エンタープライズストレージデバイス」を選択する。
IP設定後にiSCSIターゲットを指定し、インストールを続ける。
インストール完了後の再起動時に一旦マシンを落とす。
引数を"-boot n"に切り替えて起動。コマンド例

qemu-kvm -smp 1 -m 2048 -vnc :1 -monitor telnet::XXXX,server,nowait -daemonize -localtime \
-net nic,model=e1000,macaddr=XX:XX:XX:XX:XX:XX -net tap,ifname=tap1 -k ja -boot n

gPXEがDHCPでIPとroot-pathを貰ってブートすれば成功。
以降、ホスト側からの起動やゲスト側でのリブートなどを行う時には自動的にSANブート可能となる。

補遺

インストール後に気付いたのは/以外のファイルシステムのマウントがうまくできていない点。
ログをみる限り、起動処理の実行順序に問題があるものと思われる。
私の環境ではiSCSI経由でアクセスするファイルシステムすべてについていた、認識を遅延させるオプションを消すと正常にマウントされるようになった。
/etc/fstab 修正前

/dev/mapper/vg_xxxxx-lv_root /                       ext4    defaults,_netdev 1 1
UUID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx /boot      ext4    defaults,_netdev 1 2
/dev/mapper/vg_xxxxx-lv_home /home                   ext4    defaults,_netdev 1 2
/dev/mapper/vg_xxxxx-lv_swap swap                    swap    defaults,_netdev 0 0

/etc/fstab 修正後

/dev/mapper/vg_xxxxx-lv_root /                       ext4    defaults,_netdev 1 1
UUID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx /boot      ext4    defaults  1 2
/dev/mapper/vg_xxxxx-lv_home /home                   ext4    defaults  1 2
/dev/mapper/vg_xxxxx-lv_swap swap                    swap    defaults  0 0