海馬のかわり

最近記憶力に難がある、地方在住サーバエンジニアの備忘録です。

NATモードのKVM(+libvirt)にて、ゲストOSへSSHログインする

良く忘れるので、メモ。

KVM(+libvirt)をNATモードにて使用する際に、ゲストOSを外部公開する(ポートマッピング)する為の設定。

・環境
ホストOS: CentOS5.8
仮想NW : 192.168.122.0/24
ゲストIP: 192.168.122.101

・概要
ホストの10022/tcp宛通信をゲストOSの22/tcpへマッピング

・現在のiptables設定確認

# iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0           udp dpt:53
2        0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0           tcp dpt:53
3        0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0           udp dpt:67
4        0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0           tcp dpt:67
5       46  7646 RH-Firewall-1-INPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     all  --  *      virbr0  0.0.0.0/0            192.168.122.0/24    state RELATED,ESTABLISHED
2        0     0 ACCEPT     all  --  virbr0 *       192.168.122.0/24     0.0.0.0/0
3        0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0
4        0     0 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
5        0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
6        0     0 RH-Firewall-1-INPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT 47 packets, 8284 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain RH-Firewall-1-INPUT (2 references)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 255
3        0     0 ACCEPT     esp  --  *      *       0.0.0.0/0            0.0.0.0/0
4        0     0 ACCEPT     ah   --  *      *       0.0.0.0/0            0.0.0.0/0
5        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            224.0.0.251         udp dpt:5353
6        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:631
7        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:631
8       39  2856 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
9        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:443
10       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80
11       7  4790 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited


・仮想ブリッジ(virbr0)<->外部NW間のFORWARD許可(Chain FORWARDのルール1番を上書き)(以下一行)

# iptables -R FORWARD 1 -o virbr0 -s 0.0.0.0/0 -d 192.168.122.0/255.255.255.0 -j ACCEPT


・10022/tcpへの新規接続許可(Chain RH-Firewall-1-INPUTのルール11番に挿入)(以下一行)

# iptables -I RH-Firewall-1-INPUT 11 -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT


・10022/tcp宛通信を、ゲストOS 22/tcpへポートマッピング(新規追加)(以下一行)

# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 10022 -j DNAT --to 192.168.122.101:22


・確認

# iptables -nvL --line-numbers
# iptables -nvL -t nat --line-numbers


設定永続化の仕組みは適宜作成。
ただしlibvirtdの再起動時、FORWARD,PREROUTING,POSTROUTING Chain等が毎回上書きされるので一工夫が必要。
(今回は、とりあえずrc.localに書きこむ事とした)

以上

Windows Server 8の新機能まとめ

Cloud Days Osaka 2012に参加し、Windows Server 8 & Hyper-V 3.0セッションにて仕入れた情報のまとめ。残念ながらテクニカルセッションではなかったが、機能の把握という意味では判りやすく良かった。

※Windows Server 8ベータ時点の情報。正式リリースでは変更となる可能性もある。

セッションでは、新機能を大きく5つのトピックとしてまとめられていた。

1.ベースの変更
2.ストレージ機能
3.Hyper-Vの進化
4.クラウド基盤
5.ワークスタイルの変化


1.ベースの変更

・ホストあたりの認識可能リソースの増加
CPU: 640論理CPU(64Socket)
Mem: 4TB

・PowerSHell Cmdlet
※今後は「コマンドでのサーバ管理を推奨」

・Windows Backupのクラウド対応
※Azureと連携。手軽にクラウド側へバックアップが取れる。

・ADの仮想化「正式」対応

・ファイルアクセス制御
※ユーザ、コンピュータ、ファイルに意味づけ、どのフォルダに格納されていてもポリシーで一括制御可能

・1つのサーバマネージャーにて複数台の一括管理可能
※従来もMMCからの追加でリモートサーバの制御が行えたがもっと簡単になった。

2.ストレージ機能

・複数台のHDDを束ねるストレージプール機能

・ストレージプールより、論理ボリュームを切り出す機能

・シンプロビジョニング
※10TBのストレージプールでも50TBの論理ボリューム(Dドライブなど)としてアサイン可能。
※「物理使用率の80%を超えると警告を出す」などの管理が可能。

・ブロックレベルの重複排除
※ファイルレベルではないことに注目!

・4Kセクタ対応

・CHKDISKの高速化
※300万ファイル存在しようが8秒程度で終わる

・新ファイルシステム「ReFS」の採用
※まだ起動ディスクには出来ない。

・共有ストレージとの連携
※ファイルのコピーなどを共有ストレージ側の機能を使って行えるようになった。(VAAIみたいな感じ?)
※この機能を使って、VMの高速クローンなどが行える。

・Hyper-V用データストアのファイルサーバ対応
※データストアとしてCIFSファイルサーバが使用可能?さらりと流れたので詳細不明

3.Hyper-Vの進化

・仮想マシンあたりの認識可能リソースの増加
CPU: 320 CPU
Mem: 1TB

・仮想マシンからの直接ファイバチャネルを利用可能に
※NPIV?

・Hyper-V Replica
※手軽にDRが構築できる機能。
※遠隔のHyper-Vホストに仮想マシンのレプリカを自動複製(同期)
※クラスタ不要(スタンドアローン2台でOK)
※ブロックベースの転送(圧縮可)
※初期転送はフルコピーとなるがネットワーク経由以外にも、メディアへのエクスポート/インポートが可能
(データ量によっては、新幹線で人力輸送した方が早いケースもあるので助かる機能かと)
※DR先へは、スナップショット単位の転送となるため、任意の時間帯からの復旧可能
※VSSと連携したバックアップが可能(SQLとか)
※DR先クローンVMとは、排他制御(うっかり起動しちゃったとか無し)
※DR先では、あらかじめ指定しておいたNW情報で起動できる(IPアドレスなど)

・ライブストレージマイグレーション

・クラスタ、共有ディスク不要のライブマイグレーション
※これもスタンドアローン2台でOK

・ホスト側NICチーミング

・仮想NIC動的帯域制御
※仮想マシンに対し、オンラインにて実施可能。
 デモでは、20MB/sec -> 50MB/secへ制限を変更し、リモートサーバへのファイルコピー速度がぐぐっと変化する様子が見られた

・仮想マシンメータリング機能
※VMのメトリックを取得。使用率に対し課金を行ったりする際に役立つ。

4.クラウド基盤

・クラスタ機能の強化
 64ノード / クラスタまで拡張可能
 4000VM / クラスタまで実行可能

・CAV(クラスタ対応アップデート)
※パッチ当て時に、例えば10台ずつなどグループにわけてアップデートを回していく仕組み(ローリングアップデート?)

・ネットワーク機能の進化
※データセンタTCP(DCTCP) (MSが開発したの低遅延プロトコルらしい)
※プライベートVLAN
※マルチテナント対応

・Hyper-V拡張仮想スイッチ
※仮想スイッチに以下の機能を実装
 ・キャプチャ/モニタ
 ・フィルタリング
 ・WFP(Windows Firewall,マルウェア対策など)
 ・フォワーディング(Cisco Nexus 1000v, Openflow)

5.ワークスタイルの変化
このトピックは、時間の都合上項目だけチョロッと紹介された。

・MS-VDIの進化
※高速な仮想マシン作成(複数台一気に作成処理をかけるなど)

・Direct Access

・Branch Cache

以上

KVM上にArchLinuxをインストールする (with virtio)

KVMにて、virtioなディスクにArchLinuxをインストールする際のTIPSなど。

・環境

Host:
 OS:	CentOS 5.7
Guest:
 OS:	ArchLinux 2011.08.19
 CPU:	1
 Mem:	256
 HDD:	8GB

・インストール手順
1.virt-managerにて、新規仮想マシンを作成し、インストールを開始。

Media:	archlinux-2011.08.19-core-i686.iso
OS type: Linux
Version: Generic 2.6.25 or later kernel with virtio

メディアがBootしたら、通常どおりインストールを進める

# km
# /arch/setup

※インストールする際の個人的な設定は以下。

[1 Select source]
core-local

[2 Set editor]
vi

[3 Set clock]
Asia/Tokyo UTC 

[4 Prepare hard drive(s)] 
Menu:
	Auto-Prepare
Device:
	/dev/vda
Partition:
	/boot	100
	swap	256
	/		7500
	/home	(残り)
Filesystem:
	Ext4

[5 Select package]
bootloader:
	grub
Package groups:
	base
Package:(選択済みPackage以外のもの)
    dns-utils
    iana-etc
    inetutils
    iptables
    kbd
    mlocate
    net-tools
    net-cfg
    openssh
    openssl
    packman-mirrorlist
    pam
    tzdata

[6. Install packages]
完了までしばし待つ

[7. Configure system]
/etc/rc.conf
	KEYMAP="jp106"
	HOSTNAME="hoge.localdomain"
	interface=eth0
	address=(blank)
	netmask=(blank)
	broadcast=(blank)
	gateway=(blank)
	DAEMONS=(hwclock syslog-ng network sshd netfs crond)
	
/etc/pacmanmirror.conf
	## Japan
	Server = ftp://ftp.jaist.ac.jp/pub/Linux/ArchLinux/$repo/os/$arch
	Server = http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/$repo/os/$arch

Root-Password
	適宜設定

[8. Install bootloader]

### virtio用設定
virtio diskを使用する場合は、下記ファイルも併せて編集する。

[7. Configure system]
/etc/mkinitcpio.conf
	MODULES="virtio_blk virtio_pci virtio_net"

[8. Install bootloader]に進んだところで、インストーラーが異常終了するため、続けて以下の設定を行う。

# vi /boot/grub/device.map
(hd0) /dev/vda
#
# grub
> device (hd0) /dev/vda
> root (hd0,0)
> setup (hd0)
> quit
#
# reboot

後は、正常にOSが起動することを確認する。

・参照
Preparing an (Arch) Linux guest
https://wiki.archlinux.org/index.php/KVM#Preparing_an_.28Arch.29_Linux_guest

以上

CPI CloudCoreで、KVM on KVM (UnixBench)

CloudCore VPS 2048では、Nested SVMが有効なので、KVM on KVMを試してみる。

・環境
Host: CentOS 5.7 (x86_64)
Guest: ArchLinux 2011.08.19 (i686)

・ゲストインストール
ゲストマシンのインストールはvirt-managerで行った。
ArchLinuxをvirtioなディスクにインストールする際のTIPSは次のPOSTにでも。

UnixBench

   BYTE UNIX Benchmarks (Version 5.1.3)

   System: arch02.localdomain: GNU/Linux
   OS: GNU/Linux -- 3.0-ARCH -- #1 SMP PREEMPT Wed Aug 17 20:24:07 UTC 2011
   Machine: i686 (AuthenticAMD)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: QEMU Virtual CPU version 0.9.1 (1810.4 bogomips)
          x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   17:04:29 up 9 min,  1 user,  load average: 0.17, 0.11, 0.06; runlevel 3

------------------------------------------------------------------------
Benchmark Run: Tue Mar 06 2012 17:04:29 - 17:32:28
1 CPU in system; running 1 parallel copy of tests

Dhrystone 2 using register variables        9076056.8 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     2029.2 MWIPS (10.0 s, 7 samples)
Execl Throughput                               1418.4 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        470151.2 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          164961.1 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        831760.5 KBps  (30.0 s, 2 samples)
Pipe Throughput                              892949.9 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 190467.5 lps   (10.0 s, 7 samples)
Process Creation                               5101.5 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   1598.7 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    228.5 lpm   (60.1 s, 2 samples)
System Call Overhead                        1889510.2 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0    9076056.8    777.7
Double-Precision Whetstone                       55.0       2029.2    369.0
Execl Throughput                                 43.0       1418.4    329.8
File Copy 1024 bufsize 2000 maxblocks          3960.0     470151.2   1187.3
File Copy 256 bufsize 500 maxblocks            1655.0     164961.1    996.7
File Copy 4096 bufsize 8000 maxblocks          5800.0     831760.5   1434.1
Pipe Throughput                               12440.0     892949.9    717.8
Pipe-based Context Switching                   4000.0     190467.5    476.2
Process Creation                                126.0       5101.5    404.9
Shell Scripts (1 concurrent)                     42.4       1598.7    377.1
Shell Scripts (8 concurrent)                      6.0        228.5    380.8
System Call Overhead                          15000.0    1889510.2   1259.7
                                                                   ========
System Benchmarks Index Score                                         631.5

以上

CPI CloudCore VPS ベンチマーク

物理1コアpinningが売りのCPI CloudCore VPSを試用してみたので、そのUnixBench結果などを。

・環境
Plan: CloudCore VPS 2048(CPU: 物理1コア Mem:2GB Disk:100GB)
OS: CentOS x86_64

/proc/cpuinfo
flagsにsvmがあるのでKVM on KVMが使えそう。(実用性があるかは別にして)
modelはPhenomと出ているけど、たぶんこれはKVM側でエミュレートさせているからで、ホスト側物理CPUはOpteronの6コアx2とか12コアあたりかな。

processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 16
model           : 2
model name      : AMD Phenom(tm) 9550 Quad-Core Processor
stepping        : 3
cpu MHz         : 2199.998
cache size      : 512 KB
fpu             : yes
fpu_exception   : yes
cpuid level     : 5
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb lm up pni cx16 popcnt lahf_lm cmp_legacy svm cr8_legacy altmovcr8 abm sse4a misalignsse
bogomips        : 4399.99
TLB size        : 1024 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

/proc/meminfo

MemTotal:      2058852 kB
MemFree:       1635836 kB
Buffers:         80292 kB
Cached:         248660 kB
SwapCached:          0 kB
Active:         140076 kB
Inactive:       200792 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:      2058852 kB
LowFree:       1635836 kB
SwapTotal:     4194296 kB
SwapFree:      4194296 kB
Dirty:               0 kB
Writeback:           0 kB
AnonPages:       11940 kB
Mapped:           7928 kB
Slab:            61988 kB
PageTables:       4660 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:   5223720 kB
Committed_AS:    42708 kB
VmallocTotal: 34359738367 kB
VmallocUsed:      2188 kB
VmallocChunk: 34359736179 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

fdisk

# fdisk -l
Disk /dev/vda: 107.3 GB, 107374182400 bytes
255 heads, 63 sectors/track, 13054 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/vda1   *           1       13054   104856223+  83  Linux

hdparm
errorが出ているのは、hdparmはVirtIOディスクに非対応だから。
でも値は一応取れるみたい。

# hdparm -tT
/dev/vda:
 Timing cached reads:   10784 MB in  2.00 seconds = 5394.64 MB/sec
HDIO_DRIVE_CMD(null) (wait for flush complete) failed: Inappropriate ioctl for device
 Timing buffered disk reads:  152 MB in  3.00 seconds =  50.62 MB/sec
HDIO_DRIVE_CMD(null) (wait for flush complete) failed: Inappropriate ioctl for device

dd

# dd if=/dev/zero of=./test.img bs=1024k count=5120
5120+0 records in
5120+0 records out
5368709120 bytes (5.4 GB) copied, 47.6683 seconds, 113 MB/s

UnixBench

# wget http://byte-unixbench.googlecode.com/files/UnixBench5.1.3.tgz
# tar xvzf UnixBench5.1.3.tgz
# cd ./UnixBench
# make
# export LANG=C
# ./Run
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: kvps-202-133-***-***.secure.ne.jp: GNU/Linux
   OS: GNU/Linux -- 2.6.18-274.18.1.el5 -- #1 SMP Thu Feb 9 12:45:44 EST 2012
   Machine: x86_64 (x86_64)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: AMD Phenom(tm) 9550 Quad-Core Processor (4400.0 bogomips)
          x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET
   19:00:41 up 17 min,  2 users,  load average: 0.10, 0.03, 0.02; runlevel 3

------------------------------------------------------------------------
Benchmark Run: Fri Mar 02 2012 19:00:41 - 19:28:33
1 CPU in system; running 1 parallel copy of tests

Dhrystone 2 using register variables        8750916.2 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     1882.7 MWIPS (9.8 s, 7 samples)
Execl Throughput                               3532.6 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        613044.0 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          200114.1 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        738458.7 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1866582.3 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 319493.4 lps   (10.0 s, 7 samples)
Process Creation                               6924.8 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   4205.9 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    582.4 lpm   (60.1 s, 2 samples)
System Call Overhead                        2531573.4 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0    8750916.2    749.9
Double-Precision Whetstone                       55.0       1882.7    342.3
Execl Throughput                                 43.0       3532.6    821.5
File Copy 1024 bufsize 2000 maxblocks          3960.0     613044.0   1548.1
File Copy 256 bufsize 500 maxblocks            1655.0     200114.1   1209.1
File Copy 4096 bufsize 8000 maxblocks          5800.0     738458.7   1273.2
Pipe Throughput                               12440.0    1866582.3   1500.5
Pipe-based Context Switching                   4000.0     319493.4    798.7
Process Creation                                126.0       6924.8    549.6
Shell Scripts (1 concurrent)                     42.4       4205.9    991.9
Shell Scripts (8 concurrent)                      6.0        582.4    970.6
System Call Overhead                          15000.0    2531573.4   1687.7
                                                                   ========
System Benchmarks Index Score                                         949.6

Bonnie++

# wget http://www.coker.com.au/bonnie++/bonnie++-1.03e.tgz
# tar xvzf bonnie++-1.03e.tgz
# cd bonnie++-1.03e
# ./configure; echo $?
# cp -p bonnie.h bonnie.h.org
# sed  -i s/#define\ MinTime\ \(0.5\)/#define\ MinTime\ \(0.01\)/g bonnie.h
# diff -wb bonnie.h.org bonnie.h
# make; echo $?
#  ./bonnie++ -d /tmp -s 2048 -r 1024 -u root
Using uid:0, gid:0.
Writing with putc()...done
Writing intelligently...done
Rewriting...done
Reading with getc()...done
Reading intelligently...done
start 'em...done...done...done...
Create files in sequential order...done.
Stat files in sequential order...done.
Delete files in sequential order...done.
Create files in random order...done.
Stat files in random order...done.
Delete files in random order...done.
Version 1.03e       ------Sequential Output------ --Sequential Input- --Random-
                    -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
kvps-202-133-*** 2G 55046  96 142944  30 89472  43 60246  94 598871  81 63635 100
                    ------Sequential Create------ --------Random Create--------
                    -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16 87083  99 391064 100 104802  99 91101 100 544986  99 104466 100
kvps-202-133-***-***.secure.ne.jp,2G,55046,96,142944,30,89472,43,60246,94,598871,81,63635.2,100,16,87083,99,391064,100,104802,99,91101,100,544986,99,104466,100

以上

Apacheのアクセスログへリクエスト元ポート番号まで記録する

第39回 大規模NATによるアクセスログの扱い方の変化
http://gihyo.jp/admin/serial/01/whats_inet/0039

「大規模NAT環境ではクライアントのポート番号まで記録しておきましょう」というお話。
このための設定は次の通り。

■検証環境
Apache/2.2.15

■フォーマット
設定には、mod_log_configの下記フォーマットを追記する

%{format}p
	The canonical port of the server serving the request or the server's actual port or the client's actual port. Valid formats are canonical, local, or remote. 

■設定手順

# cd /etc/httpd/conf
# cp -p httpd.conf httpd.conf.20120222
# vi httpd.conf
# diff -wb httpd.conf.20120222 httpd.conf
509,510c509,511
< LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
< LogFormat "%h %l %u %t \"%r\" %>s %b" common
---
> LogFormat "%h:%{remote}p %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
> LogFormat "%h:%{remote}p %l %u %t \"%r\" %>s %b" common
#
# httpd -t
Syntax OK
#
# /etc/init.d/httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
#

■参照
mod_log_config - Apache HTTP Server
http://httpd.apache.org/docs/2.2/en/mod/mod_log_config.html

Logging Remote Port Numbers in the Apache HTTP Server for Carrier Grade NAT
http://draft.scyphus.co.jp/articles/20110815.html

以上

VMware Workstation上のESXiをお手軽iSCSI Boot

Workstation8上の仮想環境(vSphere5)にて、iSCSIブート検証を行いたかったので、ESXi上の仮想NICをiPXEで「疑似iBFT対応HBA」に仕立ててみる。

iPXEはその名の通りPXEの拡張実装なので、本来はtftpサーバの準備などネットワークブート環境一式が必要なのだけれど、今回は専用Scriptを使用してお手軽に対処。

※ESXiに限らず、他のiBFT対応OSでもたぶん同じようにインストール&起動できるはず

■iBFT
Japanese VMware Documentation Library
http://pubs.vmware.com/vsphere-50/index.jsp?topic=/com.vmware.vsphere.storage.doc_50/GUID-404C622E-3EDD-4C19-B51D-27C3C7EBEDBB.html


iBFT iSCSI 起動の概要

ESXiをデプロイし、iSCSI SANから起動するには、iBFT(iSCSI Boot Firmware Table)形式をサポートしている、iSCSI起動対応のネットワーク アダプタがホストに必要です。iBFTは、iSCSI起動デバイスに関するパラメータをオペレーティング システムに伝える方法です。

~中略~

iSCSI からはじめて起動するとき、システム上のiSCSI 起動ファームウェアがiSCSI ターゲットに接続します。ログインに成功すると、ファームウェアはネットワークとiSCSI起動のパラメータをiBFTに保存し、システムのメモリにそのテーブルを格納します。システムはこのテーブルを使用して、そのiSCSI接続とネットワークの構成、および起動を行います。

Oracle solaris 10 u9 iSCSI Boot
http://www.slideshare.net/satokaz/oracle-solaris-10u9iscsiboot20101111public

■準備
Linuxマシン(iPXEビルド用)
iSCSIストレージ
・ESXi5 インストールメディア

■検証環境
・仮想化ソフト VMware Workstation8 (Windows)
・ストレージNW 10.10.10.0/24
・ESXi
  OS: ESXi 5.0
  IP: 10.10.10.150
iSCSI
  OS: NexentaStor Community Edition 3.1.1
  IP: 10.10.10.3
・ESXi5
  VMware-VMvisor-Installer-5.0.0-469512.x86_64.iso
Linuxマシン
  OS:CentOS 6.2

■前提条件
・事前にESXi用仮想マシン(ガワのみ)を作成しておく。
iSCSIブート用NICのタイプとして「e1000」、その他は「e1000e」を使用。
Linuxマシンには開発環境とgitをインストールしておく。
・ストレージNWにて、DHCPが使用できる事。
iSCSIストレージにて、ESX毎のiqnおよびLUNを作成しておく。
 (検証では、1ホスト毎に1iqn&1lunを用意)
f:id:extrea:20120222102207p:plain

■設定手順
1. iPXEのダウンロード
Linuxマシンにて作業を行う

# cd ~
# git clone git://git.ipxe.org/ipxe.git
# cd ipxe/
# git pull -v

2. iPXE用スクリプトファイルの作成
※setで指定している値は環境に合わせる

# cd src/
# vi esx01.ipxe
---
#!ipxe

dhcp || fail_dhcp
ifopen net0

### Settings
set hostname      esx01
set net0/ip       10.10.10.150
set net0/netmask  255.255.255.0
set net0/gateway  10.10.10.254
set initiator-iqn iqn.2012-02.org.ipxe:ipxe-esx01

# root-path iscsi:${target-ip}:${target-protocol}:${target-port}:${target-lun}:${target-iqn}
set root-path     iscsi:10.10.10.3:::0:iqn.2012-02.com.nexenta:nexenta-esx01

###

echo +--------------------+
echo Boot from iSCSI Device
echo +--------------------+
echo
echo Hostname.....: ${hostname}
echo Device IP....: ${net0/ip}
echo Subnetmask...: ${net0/netmask}
echo Gateway......: ${net0/gateway}
echo Initiator Iqn: ${initiator-iqn}
echo
echo Root-Path....: ${root-path}
echo

sleep 5
set keep-san 1
sanhook ${root-path} || goto debug_iscsi_target
sanboot || goto fail_sanboot
exit

:fail_dhcp
echo No response from DHCP server
goto drop_shell

:fail_sanboot
echo SAN boot fail.
echo Go to next boot device (DVD Drive etc...)
echo Press any key.
prompt
exit

:debug_iscsi_target
echo Can not attach an iSCSI Target.
goto drop_shell

:drop_shell
echo Dropping to shell.
prompt
shell

※冒頭のDHCPによるアドレス取得は必要ないはずだが、この処理がないとうまく動かなかった。

3. iPXE(ROM版)のビルド

# cd src
# make bin/8086100f.mrom EMBED=esx01.ipxe; echo $?
# mv bin/8086100f.mrom ./esx01_e1000.mrom

出来上がったNIC ROMをWorkstationの稼働するPCへ移動する。
※他のホスト用ROMも必要に応じ作成しておく。

4. ESXiホストvmxファイル編集
仮想NIC関連の設定箇所へ以下のように追記、編集する。
NIC ROMのパスは環境に合わせる。

ethernet0.virtualDev = "e1000"
ethernet0.opromsize = 262144
e1000bios.filename = "D:\shared\esx01_e1000.mrom

その他NICについては、以下のようにe1000eを指定。
指定しない場合はeth0と同様にe1000(ipxe ROM)が使用される。

ethernet1.virtualDev = "e1000e"
ethernet2.virtualDev = "e1000e"
ethernet3.virtualDev = "e1000e"
...

5.ブートデバイスの変更
起動後のPOST画面にて「F2」キーを押下しBIOS設定に入る。

デバイス起動順序にて「iPXE」を1st boot deviceに指定。
f:id:extrea:20120222110120p:plain

6.ブート
仮想DVDドライブにはOSのメディアをあらかじめセットしておく。

うまくいけば、こんな感じでDHCPにてアドレスを取得し、ブート処理を始める。
f:id:extrea:20120222110143p:plain

ipxe shellに落ちるようなら、ネットワークやiSCSI Targetの設定を再確認。
OSインストール後、問題なく起動できればOK

7.その他

・NICの設定変更
設定変更は、ROMの再ビルドにて対応。

今回は「疑似HBA的に」というコンセプトだったけれども、別途Apache+PHPなどアプリケーションサーバを用意し、動的に変更したiPXEスクリプトをhttp経由でロードする方法も取れる。

この場合下記例のようなスクリプトを書き込んだROM1種類を用意するだけで済む上、設定変更はWebサーバ上で行えるため便利。
(ただしアプリサーバがこけると、ホストがブートできなくなるリスクとトレードオフ)

#!ipxe

dhcp
echo "Load custom ipxe script..."
chain http://10.10.10.100/boot.ipxe?mac=${net0/mac}

※chainロード時のクエリ(MACアドレス)をトリガに、返答するipxeスクリプトを変える。


・「Booting from SAN device 0x8?」で固まる(OSインストール前)
OSインストール時に、iSCSIディスクからのブート試行時点で固まり、次のブートデバイスに映らないときは、Attach先のLUNを作り直したり、partedなどでパーティションタイプを上書きしてみたりすると良いかも。


■参照
iPXE - open source boot firmware / Documentation
http://ipxe.org/docs

Network-booting machines over HTTP
http://jpmens.net/2011/07/18/network-booting-machines-over-http/

iPXEで複数台のiSCSIブートをまとめる
http://www3.atword.jp/osserpse/2012/02/11/

以上