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を用意)
■設定手順
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に指定。
6.ブート
仮想DVDドライブにはOSのメディアをあらかじめセットしておく。
うまくいけば、こんな感じでDHCPにてアドレスを取得し、ブート処理を始める。
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/
以上